import { KikuFieldGroupingChoice, KikuFieldGroupingRequestData } from '../../types'; export function createFieldGroupingCallback(options: { getVisibleOverlayVisible: () => boolean; setVisibleOverlayVisible: (visible: boolean) => void; getResolver: () => ((choice: KikuFieldGroupingChoice) => void) | null; setResolver: (resolver: ((choice: KikuFieldGroupingChoice) => void) | null) => void; sendRequestToVisibleOverlay: (data: KikuFieldGroupingRequestData) => boolean; }): (data: KikuFieldGroupingRequestData) => Promise { return async (data: KikuFieldGroupingRequestData): Promise => { return new Promise((resolve) => { if (options.getResolver()) { resolve({ keepNoteId: 0, deleteNoteId: 0, deleteDuplicate: true, cancelled: true, }); return; } const previousVisibleOverlay = options.getVisibleOverlayVisible(); let settled = false; const finish = (choice: KikuFieldGroupingChoice): void => { if (settled) return; settled = true; if (options.getResolver() === finish) { options.setResolver(null); } resolve(choice); if (!previousVisibleOverlay && options.getVisibleOverlayVisible()) { options.setVisibleOverlayVisible(false); } }; options.setResolver(finish); if (!options.sendRequestToVisibleOverlay(data)) { finish({ keepNoteId: 0, deleteNoteId: 0, deleteDuplicate: true, cancelled: true, }); return; } setTimeout(() => { if (!settled) { finish({ keepNoteId: 0, deleteNoteId: 0, deleteDuplicate: true, cancelled: true, }); } }, 90000); }); }; }