diff --git a/src/apps/draft-service.ts b/src/apps/draft-service.ts index 4c460fdb..948328d0 100644 --- a/src/apps/draft-service.ts +++ b/src/apps/draft-service.ts @@ -143,10 +143,12 @@ async function generateLocalFormSubmissionDraftsFromStorage({ localDraftsStorage, abortSignal, priorityFn, + initialBroadcastCB, }: { localDraftsStorage: LocalDraftsStorage abortSignal: AbortSignal | undefined priorityFn?: PriorityFn + initialBroadcastCB?: () => void }): Promise { const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds() const deletedDraftIds = new Set( @@ -194,6 +196,7 @@ async function generateLocalFormSubmissionDraftsFromStorage({ } await broadcastUpdate() + initialBroadcastCB?.() if (draftsToDownload.length) { if (priorityFn) { @@ -769,10 +772,12 @@ async function setAndBroadcastDrafts({ localDraftsStorage, abortSignal, priorityFn, + initialBroadcastCB, }: { localDraftsStorage: LocalDraftsStorage abortSignal: AbortSignal | undefined priorityFn: PriorityFn | undefined + initialBroadcastCB?: () => void }): Promise { const username = getUsername() if (!username) { @@ -794,6 +799,7 @@ async function setAndBroadcastDrafts({ localDraftsStorage, abortSignal, priorityFn, + initialBroadcastCB, }) await executeDraftsListeners(localFormSubmissionDrafts) } @@ -818,6 +824,7 @@ let _isSyncingDrafts = false * @returns */ async function syncDrafts({ + initialBroadcastCB, priorityFn, formsAppId, throwError, @@ -831,6 +838,8 @@ async function syncDrafts({ * argument, zero if they're equal, and a positive value otherwise. */ priorityFn?: PriorityFn + /** A callback to be called when the drafts are initially broadcast */ + initialBroadcastCB?: () => void /** `true` to throw errors while syncing */ throwError?: boolean /** Signal to abort the requests */ @@ -931,7 +940,12 @@ async function syncDrafts({ } console.log('Downloading drafts in the background') - setAndBroadcastDrafts({ localDraftsStorage, abortSignal, priorityFn }) + setAndBroadcastDrafts({ + localDraftsStorage, + abortSignal, + priorityFn, + initialBroadcastCB, + }) .then(async () => { console.log('Finished syncing drafts.') }) diff --git a/src/hooks/useDrafts.tsx b/src/hooks/useDrafts.tsx index 56a4562f..0e3b701f 100644 --- a/src/hooks/useDrafts.tsx +++ b/src/hooks/useDrafts.tsx @@ -127,25 +127,30 @@ export function DraftsContextProvider({ })) } - let newError = null - try { await draftService.syncDrafts({ formsAppId, priorityFn, throwError: true, abortSignal, + initialBroadcastCB: () => { + if (isMounted.current) { + setSyncState({ + lastSyncTime: new Date(), + isSyncing: false, + syncError: null, + }) + } + }, }) } catch (error) { - newError = error as Error - } - - if (isMounted.current) { - setSyncState({ - lastSyncTime: new Date(), - isSyncing: false, - syncError: newError, - }) + if (isMounted.current) { + setSyncState({ + lastSyncTime: new Date(), + isSyncing: false, + syncError: error as Error, + }) + } } }, [formsAppId, isDraftsEnabled, isMounted, isUsingFormsKey],