1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-12-02 22:49:09 +02:00
Files
joplin/packages/lib/components/shared/ShareNoteDialog/useOnShareLinkClick.ts

89 lines
2.3 KiB
TypeScript

import Logger from '@joplin/utils/Logger';
import JoplinServerApi from '../../../JoplinServerApi';
import { reg } from '../../../registry';
import { NoteEntity } from '../../../services/database/types';
import ShareService from '../../../services/share/ShareService';
import { StateShare } from '../../../services/share/reducer';
import shim from '../../../shim';
import { SharingStatus } from './types';
const { useCallback } = shim.react();
const logger = Logger.create('useOnShareLinkClick');
interface Props {
notes: NoteEntity[];
recursiveShare: boolean;
setSharesState(state: SharingStatus): void;
onShareUrlsReady(urls: string[]): void;
}
const getShareLinks = (shares: StateShare[]) => {
const links = [];
for (const share of shares) {
if (!share) {
throw new Error('Error: Empty share.');
}
links.push(ShareService.instance().shareUrl(ShareService.instance().userId, share));
}
return links;
};
const useOnShareLinkClick = ({
setSharesState, onShareUrlsReady, notes, recursiveShare,
}: Props) => {
return useCallback(async () => {
const service = ShareService.instance();
let hasSynced = false;
let tryToSync = false;
while (true) {
try {
if (tryToSync) {
setSharesState(SharingStatus.Synchronizing);
await reg.waitForSyncFinishedThenSync();
tryToSync = false;
hasSynced = true;
}
setSharesState(SharingStatus.Creating);
const newShares: StateShare[] = [];
for (const note of notes) {
const share = await service.shareNote(note.id, recursiveShare);
newShares.push(share);
}
setSharesState(SharingStatus.Synchronizing);
await reg.waitForSyncFinishedThenSync();
setSharesState(SharingStatus.Creating);
onShareUrlsReady(getShareLinks(newShares));
setSharesState(SharingStatus.Created);
await ShareService.instance().refreshShares();
} catch (error) {
if (error.code === 404 && !hasSynced) {
logger.info('ShareNoteDialog: Note does not exist on server - trying to sync it.', error);
tryToSync = true;
continue;
}
console.error(error);
logger.error('ShareNoteDialog: Cannot publish note:', error);
setSharesState(SharingStatus.Idle);
void shim.showErrorDialog(JoplinServerApi.connectionErrorMessage(error));
}
break;
}
}, [recursiveShare, notes, onShareUrlsReady, setSharesState]);
};
export default useOnShareLinkClick;