diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b035df6..ae8fd9ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- individual draft data can be optionally downloaded during a sync + ## [9.1.0] - 2026-02-23 ### Added diff --git a/src/apps/draft-service.ts b/src/apps/draft-service.ts index 460c5c39..568a7752 100644 --- a/src/apps/draft-service.ts +++ b/src/apps/draft-service.ts @@ -131,6 +131,7 @@ async function generatePublicLocalFormSubmissionDraftsFromStorage( async function generateLocalFormSubmissionDraftsFromStorage( localDraftsStorage: LocalDraftsStorage, + metaOnly: boolean, ): Promise { const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds() const deletedDraftIds = new Set( @@ -153,15 +154,15 @@ async function generateLocalFormSubmissionDraftsFromStorage( // Remove any drafts deleted while offline !deletedDraftIds.has(formSubmissionDraft.id) ) { - const draftSubmission = await getDraftSubmission( - formSubmissionDraft, - ).catch((err) => { - console.warn( - `Could not fetch draft submission for draft: ${formSubmissionDraft.id}`, - err, - ) - return undefined - }) + const draftSubmission = metaOnly + ? undefined + : await getDraftSubmission(formSubmissionDraft).catch((err) => { + console.warn( + `Could not fetch draft submission for draft: ${formSubmissionDraft.id}`, + err, + ) + return undefined + }) localFormSubmissionDraftsMap.set(formSubmissionDraft.id, { ...formSubmissionDraft, draftSubmission, @@ -454,9 +455,14 @@ async function getPublicDraftsFromStorage(): Promise { * * @returns */ -async function getDrafts(): Promise { +async function getDrafts( + metaOnly?: boolean, +): Promise { const localDraftsStorage = await getLocalDraftsFromStorage() - return await generateLocalFormSubmissionDraftsFromStorage(localDraftsStorage) + return await generateLocalFormSubmissionDraftsFromStorage( + localDraftsStorage, + metaOnly ?? false, + ) } /** @@ -509,6 +515,7 @@ async function getDraftAndData( formsAppId: number, formSubmissionDraftId: string | undefined | null, abortSignal: AbortSignal | undefined, + metaOnly?: boolean, ): Promise { if (!formSubmissionDraftId) { return @@ -523,7 +530,9 @@ async function getDraftAndData( const localDraftsStorage = await getLocalDraftsFromStorage() if (formSubmissionDrafts) { localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts - await setAndBroadcastDrafts(localDraftsStorage) + if (!metaOnly) { + await setAndBroadcastDrafts(localDraftsStorage) + } } else { formSubmissionDrafts = localDraftsStorage.syncedFormSubmissionDrafts } @@ -671,7 +680,10 @@ async function setAndBroadcastDrafts( console.log('Drafts have been updated', localDraftsStorage) const localFormSubmissionDrafts = - await generateLocalFormSubmissionDraftsFromStorage(localDraftsStorage) + await generateLocalFormSubmissionDraftsFromStorage( + localDraftsStorage, + false, + ) await executeDraftsListeners(localFormSubmissionDrafts) } @@ -697,12 +709,15 @@ let _isSyncingDrafts = false async function syncDrafts({ formsAppId, throwError, + metaOnly, abortSignal, }: { /** The id of the OneBlink Forms App to sync drafts with */ formsAppId: number /** `true` to throw errors while syncing */ throwError?: boolean + /** `true` to only sync draft metadata */ + metaOnly?: boolean /** Signal to abort the requests */ abortSignal?: AbortSignal }): Promise { @@ -800,19 +815,21 @@ async function syncDrafts({ localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts } - await setAndBroadcastDrafts(localDraftsStorage) + if (!metaOnly) { + await setAndBroadcastDrafts(localDraftsStorage) - if (localDraftsStorage.syncedFormSubmissionDrafts.length) { - console.log( - 'Ensuring all draft data is available for offline use for synced drafts', - localDraftsStorage.syncedFormSubmissionDrafts, - ) - for (const formSubmissionDraft of localDraftsStorage.syncedFormSubmissionDrafts) { - await getDraftSubmission(formSubmissionDraft, abortSignal).catch( - (error) => { - console.warn('Could not download Draft Data as JSON', error) - }, + if (localDraftsStorage.syncedFormSubmissionDrafts.length) { + console.log( + 'Ensuring all draft data is available for offline use for synced drafts', + localDraftsStorage.syncedFormSubmissionDrafts, ) + for (const formSubmissionDraft of localDraftsStorage.syncedFormSubmissionDrafts) { + await getDraftSubmission(formSubmissionDraft, abortSignal).catch( + (error) => { + console.warn('Could not download Draft Data as JSON', error) + }, + ) + } } } diff --git a/src/apps/job-service.ts b/src/apps/job-service.ts index bab4848d..a49b2f00 100644 --- a/src/apps/job-service.ts +++ b/src/apps/job-service.ts @@ -24,7 +24,7 @@ async function removePendingSubmissions( } async function tagDrafts(jobList: SubmissionTypes.FormsAppJob[]) { - return getDrafts().then((drafts) => + return getDrafts(true).then((drafts) => jobList.map((job) => { const draft = drafts.find((draft) => draft.jobId === job.id) return { diff --git a/src/hooks/useDrafts.tsx b/src/hooks/useDrafts.tsx index 730055d0..46671d57 100644 --- a/src/hooks/useDrafts.tsx +++ b/src/hooks/useDrafts.tsx @@ -18,7 +18,10 @@ export type DraftsContextValue = { */ lastSyncTime: Date | null /** A function to trigger syncing of the drafts */ - syncDrafts: (abortSignal: AbortSignal | undefined) => Promise + syncDrafts: ( + abortSignal: AbortSignal | undefined, + metaOnly?: boolean, + ) => Promise /** An Error object if syncing drafts fails */ syncError: Error | null /** A function to clear Error object from syncing drafts */ @@ -101,7 +104,7 @@ export function DraftsContextProvider({ })) }, []) const syncDrafts = React.useCallback( - async (abortSignal: AbortSignal | undefined) => { + async (abortSignal: AbortSignal | undefined, metaOnly?: boolean) => { if (!isDraftsEnabled || isUsingFormsKey) { return } @@ -121,6 +124,7 @@ export function DraftsContextProvider({ formsAppId, throwError: true, abortSignal, + metaOnly, }) } catch (error) { newError = error as Error