@oneblink/apps-react 9.1.1-beta.1 → 10.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apps/draft-service.js +75 -19
- package/dist/apps/draft-service.js.map +1 -1
- package/dist/apps/services/api/drafts.d.ts +1 -0
- package/dist/apps/services/api/drafts.js +2 -1
- package/dist/apps/services/api/drafts.js.map +1 -1
- package/dist/apps/types/submissions.d.ts +9 -6
- package/dist/apps/types/submissions.js.map +1 -1
- package/dist/components/Clickable.d.ts +1 -1
- package/dist/components/Clickable.js +9 -7
- package/dist/components/Clickable.js.map +1 -1
- package/dist/hooks/useDrafts.js +1 -0
- package/dist/hooks/useDrafts.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ import OneBlinkAppsError from './services/errors/oneBlinkAppsError';
|
|
|
5
5
|
import { isOffline } from './offline-service';
|
|
6
6
|
import { getUsername } from './services/cognito';
|
|
7
7
|
import { getFormsKeyId, getCurrentFormsAppUser } from './auth-service';
|
|
8
|
-
import { getFormSubmissionDrafts, uploadDraftData } from './services/api/drafts';
|
|
8
|
+
import { DRAFT_DATA_UNAVAILABLE_ERROR_TITLE, getFormSubmissionDrafts, uploadDraftData, } from './services/api/drafts';
|
|
9
9
|
import { getPendingQueueSubmissions, deletePendingQueueSubmission, } from './services/pending-queue';
|
|
10
10
|
import { deleteDraftData, getDraftSubmission, getLatestFormSubmissionDraftVersion, getLocalDraftSubmission, removeLocalDraftSubmission, saveDraftSubmission, } from './services/draft-data-store';
|
|
11
11
|
import Sentry from './Sentry';
|
|
@@ -49,6 +49,7 @@ function generateLocalFormSubmissionDraftsFromDraftSubmissions(draftSubmissions,
|
|
|
49
49
|
taskActionId: (_d = draftSubmission.taskCompletion) === null || _d === void 0 ? void 0 : _d.taskAction.taskActionId,
|
|
50
50
|
draftSubmission,
|
|
51
51
|
versions: undefined,
|
|
52
|
+
downloadStatus: 'SUCCESS',
|
|
52
53
|
});
|
|
53
54
|
}
|
|
54
55
|
}
|
|
@@ -69,13 +70,25 @@ async function generatePublicLocalFormSubmissionDraftsFromStorage(publicDraftsSt
|
|
|
69
70
|
const localFormSubmissionDrafts = Array.from(localFormSubmissionDraftsMap.values());
|
|
70
71
|
return _orderBy(localFormSubmissionDrafts, (localFormSubmissionDraft) => {
|
|
71
72
|
var _a;
|
|
72
|
-
return
|
|
73
|
+
return localFormSubmissionDraft.downloadStatus === 'SUCCESS'
|
|
74
|
+
? (_a = localFormSubmissionDraft.draftSubmission) === null || _a === void 0 ? void 0 : _a.createdAt
|
|
75
|
+
: undefined;
|
|
73
76
|
});
|
|
74
77
|
}
|
|
75
78
|
async function generateLocalFormSubmissionDraftsFromStorage(localDraftsStorage) {
|
|
76
79
|
const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds();
|
|
77
80
|
const deletedDraftIds = new Set(localDraftsStorage.deletedFormSubmissionDrafts.map(({ id }) => id));
|
|
78
81
|
const localFormSubmissionDraftsMap = generateLocalFormSubmissionDraftsFromDraftSubmissions(localDraftsStorage.unsyncedDraftSubmissions, pendingSubmissionsDraftIds, deletedDraftIds);
|
|
82
|
+
async function broadcastUpdate() {
|
|
83
|
+
const draftsToBroadcast = Array.from(localFormSubmissionDraftsMap.values());
|
|
84
|
+
const orderedDrafts = _orderBy(draftsToBroadcast, (localFormSubmissionDraft) => {
|
|
85
|
+
var _a;
|
|
86
|
+
return (_a = getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)) === null || _a === void 0 ? void 0 : _a.createdAt;
|
|
87
|
+
});
|
|
88
|
+
await executeDraftsListeners(orderedDrafts);
|
|
89
|
+
}
|
|
90
|
+
// At this point we need to store the state of the drafts in localForage
|
|
91
|
+
const draftsToDownload = [];
|
|
79
92
|
for (const formSubmissionDraft of localDraftsStorage.syncedFormSubmissionDrafts) {
|
|
80
93
|
if (
|
|
81
94
|
// Unsycned version of draft takes priority over the synced version
|
|
@@ -84,21 +97,56 @@ async function generateLocalFormSubmissionDraftsFromStorage(localDraftsStorage)
|
|
|
84
97
|
!pendingSubmissionsDraftIds.has(formSubmissionDraft.id) &&
|
|
85
98
|
// Remove any drafts deleted while offline
|
|
86
99
|
!deletedDraftIds.has(formSubmissionDraft.id)) {
|
|
100
|
+
draftsToDownload.push(formSubmissionDraft);
|
|
101
|
+
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
102
|
+
...formSubmissionDraft,
|
|
103
|
+
downloadStatus: 'PENDING',
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
await broadcastUpdate();
|
|
108
|
+
// TODO Batch the downloads instead of sequentially
|
|
109
|
+
if (draftsToDownload.length) {
|
|
110
|
+
for (const formSubmissionDraft of draftsToDownload) {
|
|
111
|
+
const currentValue = localFormSubmissionDraftsMap.get(formSubmissionDraft.id);
|
|
112
|
+
if (currentValue) {
|
|
113
|
+
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
114
|
+
...currentValue,
|
|
115
|
+
downloadStatus: 'DOWNLOADING',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
await broadcastUpdate();
|
|
87
119
|
const draftSubmission = await getDraftSubmission(formSubmissionDraft).catch((err) => {
|
|
88
120
|
console.warn(`Could not fetch draft submission for draft: ${formSubmissionDraft.id}`, err);
|
|
121
|
+
if (err instanceof OneBlinkAppsError &&
|
|
122
|
+
err.title === DRAFT_DATA_UNAVAILABLE_ERROR_TITLE) {
|
|
123
|
+
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
124
|
+
...formSubmissionDraft,
|
|
125
|
+
downloadStatus: 'NOT_AVAILABLE',
|
|
126
|
+
});
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
130
|
+
...formSubmissionDraft,
|
|
131
|
+
downloadStatus: 'ERROR',
|
|
132
|
+
downloadError: err.message,
|
|
133
|
+
});
|
|
89
134
|
return undefined;
|
|
90
135
|
});
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
136
|
+
if (draftSubmission) {
|
|
137
|
+
localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {
|
|
138
|
+
...formSubmissionDraft,
|
|
139
|
+
draftSubmission: draftSubmission,
|
|
140
|
+
downloadStatus: 'SUCCESS',
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
await broadcastUpdate();
|
|
95
144
|
}
|
|
96
145
|
}
|
|
97
146
|
const localFormSubmissionDrafts = Array.from(localFormSubmissionDraftsMap.values());
|
|
98
147
|
return _orderBy(localFormSubmissionDrafts, (localFormSubmissionDraft) => {
|
|
99
|
-
var _a
|
|
100
|
-
return (
|
|
101
|
-
((_b = getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)) === null || _b === void 0 ? void 0 : _b.createdAt));
|
|
148
|
+
var _a;
|
|
149
|
+
return (_a = getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)) === null || _a === void 0 ? void 0 : _a.createdAt;
|
|
102
150
|
});
|
|
103
151
|
}
|
|
104
152
|
function errorHandler(error) {
|
|
@@ -552,17 +600,25 @@ async function syncDrafts({ formsAppId, throwError, abortSignal, }) {
|
|
|
552
600
|
if (formSubmissionDrafts) {
|
|
553
601
|
localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts;
|
|
554
602
|
}
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
603
|
+
console.log('Downloading drafts in the background');
|
|
604
|
+
setAndBroadcastDrafts(localDraftsStorage)
|
|
605
|
+
.then(async () => {
|
|
606
|
+
console.log('Finished syncing drafts.');
|
|
607
|
+
})
|
|
608
|
+
.catch((error) => {
|
|
609
|
+
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
|
|
610
|
+
console.log('Syncing drafts has been aborted');
|
|
611
|
+
return;
|
|
562
612
|
}
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
613
|
+
console.warn('Error while attempting download drafts in the background', error);
|
|
614
|
+
if (!(error instanceof OneBlinkAppsError)) {
|
|
615
|
+
Sentry.captureException(error);
|
|
616
|
+
}
|
|
617
|
+
})
|
|
618
|
+
.finally(() => {
|
|
619
|
+
_isSyncingDrafts = false;
|
|
620
|
+
});
|
|
621
|
+
// broadcast the drafts and download the draft data in the background
|
|
566
622
|
}
|
|
567
623
|
catch (error) {
|
|
568
624
|
_isSyncingDrafts = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draft-service.js","sourceRoot":"","sources":["../../src/apps/draft-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AACrC,OAAO,YAAY,MAAM,kBAAkB,CAAA;AAC3C,OAAO,iBAAiB,MAAM,qCAAqC,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mCAAmC,EACnC,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,MAAM,MAAM,UAAU,CAAA;AAQ7B,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,aAAa,QAAQ,EAAE,CAAA;AAChC,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,kBAAkB,CAAA;AAC3B,CAAC;AAQD,KAAK,UAAU,yBAAyB,CACtC,UAAkB,EAClB,WAAyB;IAEzB,OAAO,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC;SACnD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACtB,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAA;QACd,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;YAC9B,OAAO,CAAC,GAAG,CACT,sEAAsE,EACtE,KAAK,CACN,CAAA;YACD,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,qDAAqD,CAC5D,gBAAmC,EACnC,0BAAuC,EACvC,eAA4B;;IAE5B,MAAM,4BAA4B,GAAG,IAAI,GAAG,EAGzC,CAAA;IAEH,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;QAC/C;QACE,8CAA8C;QAC9C,CAAC,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,qBAAqB,CAAC;YACtE,0CAA0C;YAC1C,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,qBAAqB,CAAC,EAC3D,CAAC;YACD,4BAA4B,CAAC,GAAG,CAAC,eAAe,CAAC,qBAAqB,EAAE;gBACtE,UAAU,EAAE,eAAe,CAAC,UAAU;gBACtC,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,EAAE;gBACrC,UAAU,EAAE,eAAe,CAAC,UAAU;gBACtC,KAAK,EAAE,eAAe,CAAC,KAAK;gBAC5B,gCAAgC,EAC9B,eAAe,CAAC,gCAAgC;gBAClD,MAAM,EAAE,MAAA,eAAe,CAAC,cAAc,0CAAE,IAAI,CAAC,MAAM;gBACnD,mBAAmB,EACjB,MAAA,MAAA,eAAe,CAAC,cAAc,0CAAE,iBAAiB,0CAC7C,mBAAmB;gBACzB,YAAY,EAAE,MAAA,eAAe,CAAC,cAAc,0CAAE,UAAU,CAAC,YAAY;gBACrE,eAAe;gBACf,QAAQ,EAAE,SAAS;aACpB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,4BAA4B,CAAA;AACrC,CAAC;AAED,KAAK,UAAU,6BAA6B;IAC1C,MAAM,kBAAkB,GAAG,MAAM,0BAA0B,EAAE,CAAA;IAC7D,OAAO,kBAAkB,CAAC,MAAM,CAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE;QACxE,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAA;QACnD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAA;AACvB,CAAC;AAED,KAAK,UAAU,kDAAkD,CAC/D,mBAAsC;IAEtC,MAAM,0BAA0B,GAAG,MAAM,6BAA6B,EAAE,CAAA;IACxE,MAAM,4BAA4B,GAChC,qDAAqD,CACnD,mBAAmB,EACnB,0BAA0B,EAC1B,IAAI,GAAG,EAAE,CACV,CAAA;IAEH,MAAM,yBAAyB,GAAG,KAAK,CAAC,IAAI,CAC1C,4BAA4B,CAAC,MAAM,EAAE,CACtC,CAAA;IAED,OAAO,QAAQ,CAAC,yBAAyB,EAAE,CAAC,wBAAwB,EAAE,EAAE;;QACtE,OAAO,MAAA,wBAAwB,CAAC,eAAe,0CAAE,SAAS,CAAA;IAC5D,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,4CAA4C,CACzD,kBAAsC;IAEtC,MAAM,0BAA0B,GAAG,MAAM,6BAA6B,EAAE,CAAA;IACxE,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,kBAAkB,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CACnE,CAAA;IAED,MAAM,4BAA4B,GAChC,qDAAqD,CACnD,kBAAkB,CAAC,wBAAwB,EAC3C,0BAA0B,EAC1B,eAAe,CAChB,CAAA;IAEH,KAAK,MAAM,mBAAmB,IAAI,kBAAkB,CAAC,0BAA0B,EAAE,CAAC;QAChF;QACE,mEAAmE;QACnE,CAAC,4BAA4B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACzD,8CAA8C;YAC9C,CAAC,0BAA0B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACvD,0CAA0C;YAC1C,CAAC,eAAe,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAC5C,CAAC;YACD,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAC9C,mBAAmB,CACpB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACd,OAAO,CAAC,IAAI,CACV,+CAA+C,mBAAmB,CAAC,EAAE,EAAE,EACvE,GAAG,CACJ,CAAA;gBACD,OAAO,SAAS,CAAA;YAClB,CAAC,CAAC,CAAA;YACF,4BAA4B,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE;gBACvD,GAAG,mBAAmB;gBACtB,eAAe;aAChB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,MAAM,yBAAyB,GAAG,KAAK,CAAC,IAAI,CAC1C,4BAA4B,CAAC,MAAM,EAAE,CACtC,CAAA;IAED,OAAO,QAAQ,CAAC,yBAAyB,EAAE,CAAC,wBAAwB,EAAE,EAAE;;QACtE,OAAO,CACL,CAAA,MAAA,wBAAwB,CAAC,eAAe,0CAAE,SAAS;aACnD,MAAA,mCAAmC,CAAC,wBAAwB,CAAC,QAAQ,CAAC,0CAClE,SAAS,CAAA,CACd,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAY;IAChC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;IAC1C,IAAI,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,iBAAiB,CAC1B,2IAA2I,EAC3I;YACE,aAAa,EAAE,KAAK;SACrB,CACF,CAAA;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,eAAe,GACnB,EAAE,CAAA;AAEJ;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,sBAAsB,CAC7B,QAAyD;IAEzD,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAE9B,OAAO,GAAG,EAAE;QACV,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAClC,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,yBAAqD;IAErD,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;QAC7C,cAAc,CAAC,yBAAyB,CAAC,CAAA;IAC3C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,KAAK,UAAU,WAAW,CAAC,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,WAAW,EACX,gBAAgB,GAQjB;IACC,MAAM,eAAe,GAAoB;QACvC,GAAG,oBAAoB;QACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,qBAAqB,EAAE,qBAAqB,IAAI,MAAM,EAAE;KACzD,CAAA;IAED,MAAM,KAAK,GAAG,aAAa,EAAE,CAAA;IAC7B,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,iBAAiB,CAAC,uCAAuC,EAAE;gBACnE,SAAS,EAAE,IAAI;aAChB,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,eAAe,CAAC,eAAe,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;QAC/D,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,MAAM,oBAAoB,GAAG,MAAM,yBAAyB,CAC1D,eAAe,CAAC,UAAU,CAC3B,CAAA;QACD,MAAM,0BAA0B,GAAG,MAAM,mBAAmB,CAAC;YAC3D,eAAe;YACf,WAAW;YACX,UAAU;YACV,UAAU,EAAE,CAAC,oBAAoB;SAClC,CAAC,CAAA;QAEF,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;YAE5D,IAAI,0BAA0B,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,0BAA0B,CAAC,CAAA;gBACpE,kBAAkB,CAAC,0BAA0B;oBAC3C,MAAM,uBAAuB,CAAC,eAAe,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;gBACxE,2DAA2D;gBAC3D,IAAI,qBAAqB,EAAE,CAAC;oBAC1B,kBAAkB,CAAC,wBAAwB;wBACzC,kBAAkB,CAAC,wBAAwB,CAAC,MAAM,CAChD,CAAC,uBAAuB,EAAE,EAAE,CAC1B,uBAAuB,CAAC,qBAAqB;4BAC7C,qBAAqB,CACxB,CAAA;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,kEAAkE,EAClE,eAAe,CAChB,CAAA;gBACD,IAAI,OAAO,GAAG,KAAK,CAAA;gBAEnB,IAAI,qBAAqB,EAAE,CAAC;oBAC1B,kBAAkB,CAAC,wBAAwB;wBACzC,kBAAkB,CAAC,wBAAwB,CAAC,GAAG,CAC7C,CAAC,uBAAuB,EAAE,EAAE;4BAC1B,IACE,uBAAuB,CAAC,qBAAqB;gCAC7C,qBAAqB,EACrB,CAAC;gCACD,OAAO,GAAG,IAAI,CAAA;gCACd,OAAO,eAAe,CAAA;4BACxB,CAAC;4BACD,OAAO,uBAAuB,CAAA;wBAChC,CAAC,CACF,CAAA;oBACH,uEAAuE;oBACvE,kBAAkB,CAAC,0BAA0B;wBAC3C,kBAAkB,CAAC,0BAA0B,CAAC,MAAM,CAClD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,qBAAqB,CACzC,CAAA;gBACL,CAAC;gBAED,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,kBAAkB,CAAC,wBAAwB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;gBACnE,CAAC;YACH,CAAC;YAED,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,MAAM,mBAAmB,GAAG,CAAC,MAAM,0BAA0B,EAAE,CAAC,CAAC,GAAG,CAClE,CAAC,qBAAqB,EAAE,EAAE;gBACxB,IACE,qBAAqB,CAAC,qBAAqB;oBAC3C,qBAAqB,EACrB,CAAC;oBACD,OAAO,GAAG,IAAI,CAAA;oBACd,OAAO,eAAe,CAAA;gBACxB,CAAC;gBACD,OAAO,qBAAqB,CAAA;YAC9B,CAAC,CACF,CAAA;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YAC3C,CAAC;YACD,MAAM,2BAA2B,CAAC,mBAAmB,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,4BAA4B,CAAC,gBAAgB,CAAC,CAAA;QACtD,CAAC;QACD,UAAU,CAAC;YACT,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,eAAe,CAAC,UAAU;SACvC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,YAAY,CAAC,GAAY,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB;IACtC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,kBAAkB,GACtB,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CACpC,iBAAiB,CAAC,QAAQ,CAAC,CAC5B,CAAA;YACH,IAAI,kBAAkB,EAAE,CAAC;gBACvB,OAAO,kBAAkB,CAAA;YAC3B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;YAC5B,MAAM,YAAY,CAAC,GAAY,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED,OAAO;QACL,wBAAwB,EAAE,EAAE;QAC5B,0BAA0B,EAAE,EAAE;QAC9B,2BAA2B,EAAE,EAAE;KAChC,CAAA;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B;IACvC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CAEzD,uBAAuB,EAAE,CAAC,CAAA;QAC5B,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAA;QACrB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,YAAY,CAAC,GAAY,CAAC,CAAA;IAClC,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,SAAS;IACtB,MAAM,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;IAC5D,OAAO,MAAM,4CAA4C,CAAC,kBAAkB,CAAC,CAAA;AAC/E,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,eAAe;IAC5B,MAAM,mBAAmB,GAAG,MAAM,0BAA0B,EAAE,CAAA;IAC9D,OAAO,MAAM,kDAAkD,CAC7D,mBAAmB,CACpB,CAAA;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,UAAkB,EAClB,WAAoC;IAEpC,IAAI,CAAC;QACH,OAAO,MAAM,uBAAuB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAC9D,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,eAAe,CAC5B,UAAkB,EAClB,qBAAgD,EAChD,WAAoC;IAEpC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,OAAM;IACR,CAAC;IAED,IAAI,oBAAoB,GAAG,MAAM,0BAA0B,CACzD,UAAU,EACV,WAAW,CACZ,CAAA;IACD,MAAM,oBAAoB,GAAG,MAAM,yBAAyB,CAAC,UAAU,CAAC,CAAA;IACxE,IAAI,oBAAoB,EAAE,CAAC;QACzB,MAAM,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;QAC5D,IAAI,oBAAoB,EAAE,CAAC;YACzB,kBAAkB,CAAC,0BAA0B,GAAG,oBAAoB,CAAA;YACpE,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,oBAAoB,GAAG,kBAAkB,CAAC,0BAA0B,CAAA;QACtE,CAAC;QAED,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,IAAI,CACnD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,qBAAqB,CACzC,CAAA;QACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,uBAAuB,CAAC,qBAAqB,CAAC,CAAC,IAAI,SAAS,CAAA;QAC5E,CAAC;QAED,OAAO,MAAM,kBAAkB,CAAC,mBAAmB,CAAC,CAAA;IACtD,CAAC;SAAM,CAAC;QACN,IAAI,oBAAoB,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,uBAAuB,CAAC,qBAAqB,CAAC,CAAC,IAAI,SAAS,CAAA;QAC5E,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,KAAK,UAAU,WAAW,CACxB,qBAA6B,EAC7B,UAAkB,EAClB,WAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,0BAA0B,CAAC,qBAAqB,CAAC,CAAA;QACvD,MAAM,oBAAoB,GAAG,MAAM,yBAAyB,CAAC,UAAU,CAAC,CAAA;QACxE,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;YAC5D,MAAM,mBAAmB,GACvB,kBAAkB,CAAC,0BAA0B,CAAC,IAAI,CAChD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,qBAAqB,CACzC,CAAA;YACH,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,eAAe,CACrD,qBAAqB,EACrB,WAAW,CACZ,CAAA;gBACD,kBAAkB,CAAC,0BAA0B;oBAC3C,kBAAkB,CAAC,0BAA0B,CAAC,MAAM,CAClD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,mBAAmB,CAAC,EAAE,CAC1C,CAAA;gBACH,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,kBAAkB,CAAC,2BAA2B,CAAC,IAAI,CACjD,mBAAmB,CACpB,CAAA;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,0DAA0D,EAC1D;oBACE,qBAAqB;oBACrB,kBAAkB;iBACnB,CACF,CAAA;gBACD,MAAM,eAAe,GACnB,kBAAkB,CAAC,wBAAwB,CAAC,IAAI,CAC9C,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,qBAAqB,KAAK,qBAAqB,CAClE,CAAA;gBACH,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,OAAM;gBACR,CAAC;gBAED,kBAAkB,CAAC,wBAAwB;oBACzC,kBAAkB,CAAC,wBAAwB,CAAC,MAAM,CAChD,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,qBAAqB,KAAK,qBAAqB,CAClE,CAAA;YACL,CAAC;YAED,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,CAAA;QACjD,CAAC;aAAM,CAAC;YACN,IAAI,mBAAmB,GAAG,MAAM,0BAA0B,EAAE,CAAA;YAC5D,MAAM,eAAe,GAAG,mBAAmB,CAAC,IAAI,CAC9C,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,qBAAqB,KAAK,qBAAqB,CAClE,CAAA;YACD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,OAAM;YACR,CAAC;YAED,mBAAmB,GAAG,mBAAmB,CAAC,MAAM,CAC9C,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,qBAAqB,KAAK,qBAAqB,CAClE,CAAA;YAED,MAAM,2BAA2B,CAAC,mBAAmB,CAAC,CAAA;QACxD,CAAC;QAED,UAAU,CAAC;YACT,UAAU,EAAE,KAAK;YACjB,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,YAAY,CAAC,GAAY,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,YAA+B;IACxE,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CACpC,uBAAuB,EAAE,EACzB,YAAY,CACb,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,YAAY,CAAC,CAAA;IAC5D,MAAM,yBAAyB,GAC7B,MAAM,kDAAkD,CAAC,YAAY,CAAC,CAAA;IACxE,MAAM,sBAAsB,CAC1B,yBAAyB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CACzE,CAAA;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,kBAAsC;IAEtC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,iBAAiB,CACzB,kFAAkF,EAClF;YACE,aAAa,EAAE,IAAI;SACpB,CACF,CAAA;IACH,CAAC;IACD,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CACpC,iBAAiB,CAAC,QAAQ,CAAC,EAC3B,kBAAkB,CACnB,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAA;IAC3D,MAAM,yBAAyB,GAC7B,MAAM,4CAA4C,CAAC,kBAAkB,CAAC,CAAA;IACxE,MAAM,sBAAsB,CAAC,yBAAyB,CAAC,CAAA;AACzD,CAAC;AAED,IAAI,gBAAgB,GAAG,KAAK,CAAA;AAE5B;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,UAAU,UAAU,CAAC,EACxB,UAAU,EACV,UAAU,EACV,WAAW,GAQZ;IACC,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;QACvD,OAAM;IACR,CAAC;IACD,gBAAgB,GAAG,IAAI,CAAA;IAEvB,MAAM,oBAAoB,GAAG,MAAM,yBAAyB,CAAC,UAAU,CAAC,CAAA;IAExE,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,MAAM,0BAA0B,EAAE,CAAA;QACvD,MAAM,oBAAoB,GAAG,EAAE,CAAA;QAC/B,gGAAgG;QAChG,mGAAmG;QACnG,mFAAmF;QACnF,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,oBAAoB,GAAG,MAAM,uBAAuB,CACxD,WAAW,CAAC,qBAAqB,CAClC,CAAA;YACD,IAAI,oBAAoB,EAAE,CAAC;gBACzB,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QACD,MAAM,2BAA2B,CAAC,oBAAoB,CAAC,CAAA;QACvD,gBAAgB,GAAG,KAAK,CAAA;QACxB,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,IAAI,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;QAC1D,IAAI,kBAAkB,CAAC,2BAA2B,CAAC,MAAM,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CACT,8CAA8C,EAC9C,kBAAkB,CAAC,2BAA2B,CAC/C,CAAA;YACD,MAAM,8BAA8B,GAClC,EAAE,CAAA;YACJ,KAAK,MAAM,mBAAmB,IAAI,kBAAkB,CAAC,2BAA2B,EAAE,CAAC;gBACjF,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,eAAe,CACrD,mBAAmB,CAAC,EAAE,EACtB,WAAW,CACZ,CAAA;gBACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,8BAA8B,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;gBAC1D,CAAC;YACH,CAAC;YAED,yEAAyE;YACzE,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;YACtD,kBAAkB,CAAC,2BAA2B;gBAC5C,8BAA8B,CAAA;QAClC,CAAC;QAED,MAAM,mBAAmB,GAAG,MAAM,0BAA0B,EAAE,CAAA;QAC9D,mFAAmF;QACnF,qCAAqC;QACrC,IAAI,mBAAmB,CAAC,MAAM,EAAE,CAAC;YAC/B,kBAAkB,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAA;YACxE,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,EAAE,CAAC,CAAA;QACvE,CAAC;QAED,IAAI,kBAAkB,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CACT,wBAAwB,kBAAkB,CAAC,wBAAwB,CAAC,MAAM,4BAA4B,CACvG,CAAA;YACD,MAAM,2BAA2B,GAAsB,EAAE,CAAA;YACzD,KAAK,MAAM,eAAe,IAAI,kBAAkB,CAAC,wBAAwB,EAAE,CAAC;gBAC1E,OAAO,CAAC,GAAG,CACT,mDAAmD,EACnD,eAAe,CAAC,KAAK,CACtB,CAAA;gBACD,eAAe,CAAC,gBAAgB,GAAG,KAAK,CAAA;gBACxC,MAAM,0BAA0B,GAAG,MAAM,mBAAmB,CAAC;oBAC3D,eAAe;oBACf,WAAW,EAAE,SAAS;oBACtB,WAAW;oBACX,UAAU,EAAE,CAAC,oBAAoB;iBAClC,CAAC,CAAA;gBACF,IAAI,CAAC,0BAA0B,EAAE,CAAC;oBAChC,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;YACD,yEAAyE;YACzE,kBAAkB,GAAG,MAAM,yBAAyB,EAAE,CAAA;YACtD,kBAAkB,CAAC,wBAAwB,GAAG,2BAA2B,CAAA;QAC3E,CAAC;QAED,MAAM,oBAAoB,GAAG,MAAM,0BAA0B,CAC3D,UAAU,EACV,WAAW,CACZ,CAAA;QACD,IAAI,oBAAoB,EAAE,CAAC;YACzB,kBAAkB,CAAC,0BAA0B,GAAG,oBAAoB,CAAA;QACtE,CAAC;QAED,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,CAAA;QAE/C,IAAI,kBAAkB,CAAC,0BAA0B,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO,CAAC,GAAG,CACT,wEAAwE,EACxE,kBAAkB,CAAC,0BAA0B,CAC9C,CAAA;YACD,KAAK,MAAM,mBAAmB,IAAI,kBAAkB,CAAC,0BAA0B,EAAE,CAAC;gBAChF,MAAM,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC,KAAK,CAC9D,CAAC,KAAK,EAAE,EAAE;oBACR,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAA;gBAC9D,CAAC,CACF,CAAA;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;QACvC,gBAAgB,GAAG,KAAK,CAAA;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gBAAgB,GAAG,KAAK,CAAA;QACxB,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;YAC9C,OAAM;QACR,CAAC;QACD,OAAO,CAAC,IAAI,CACV,wDAAwD,EACxD,KAAK,CACN,CAAA;QACD,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,eAAe,EACf,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,mCAAmC,GAEpC,CAAA","sourcesContent":["import { v4 as uuidv4 } from 'uuid'\nimport _orderBy from 'lodash.orderby'\nimport utilsService from './services/utils'\nimport OneBlinkAppsError from './services/errors/oneBlinkAppsError'\nimport { isOffline } from './offline-service'\nimport { getUsername } from './services/cognito'\nimport { getFormsKeyId, getCurrentFormsAppUser } from './auth-service'\nimport { getFormSubmissionDrafts, uploadDraftData } from './services/api/drafts'\nimport {\n getPendingQueueSubmissions,\n deletePendingQueueSubmission,\n} from './services/pending-queue'\nimport {\n deleteDraftData,\n getDraftSubmission,\n getLatestFormSubmissionDraftVersion,\n getLocalDraftSubmission,\n removeLocalDraftSubmission,\n saveDraftSubmission,\n} from './services/draft-data-store'\nimport { SubmissionTypes } from '@oneblink/types'\nimport Sentry from './Sentry'\nimport {\n DraftSubmission,\n DraftSubmissionInput,\n LocalFormSubmissionDraft,\n ProgressListener,\n} from './types/submissions'\n\nfunction generateDraftsKey(username: string) {\n return `V2_DRAFTS_${username}`\n}\n\nfunction generatePublicDraftsKey() {\n return `V2_DRAFTS_PUBLIC`\n}\n\ninterface LocalDraftsStorage {\n deletedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n unsyncedDraftSubmissions: DraftSubmission[]\n syncedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n}\n\nasync function checkIfUsingPrivateDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<boolean> {\n return getCurrentFormsAppUser(formsAppId, abortSignal)\n .then((user) => !!user)\n .catch((error) => {\n if (error.status >= 400 && error.status < 500) {\n return false\n } else {\n Sentry.captureException(error)\n console.log(\n 'Could not determine if the current user has access to this forms app',\n error,\n )\n return false\n }\n })\n}\n\nfunction generateLocalFormSubmissionDraftsFromDraftSubmissions(\n draftSubmissions: DraftSubmission[],\n pendingSubmissionsDraftIds: Set<string>,\n deletedDraftIds: Set<string>,\n) {\n const localFormSubmissionDraftsMap = new Map<\n string,\n LocalFormSubmissionDraft\n >()\n\n for (const draftSubmission of draftSubmissions) {\n if (\n // Remove drafts that are in the pending queue\n !pendingSubmissionsDraftIds.has(draftSubmission.formSubmissionDraftId) &&\n // Remove any drafts deleted while offline\n !deletedDraftIds.has(draftSubmission.formSubmissionDraftId)\n ) {\n localFormSubmissionDraftsMap.set(draftSubmission.formSubmissionDraftId, {\n formsAppId: draftSubmission.formsAppId,\n formId: draftSubmission.definition.id,\n externalId: draftSubmission.externalId,\n jobId: draftSubmission.jobId,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance\n ?.taskGroupInstanceId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n draftSubmission,\n versions: undefined,\n })\n }\n }\n\n return localFormSubmissionDraftsMap\n}\n\nasync function getPendingSubmissionsDraftIds() {\n const pendingSubmissions = await getPendingQueueSubmissions()\n return pendingSubmissions.reduce<Set<string>>((memo, pendingSubmission) => {\n if (pendingSubmission.formSubmissionDraftId) {\n memo.add(pendingSubmission.formSubmissionDraftId)\n }\n return memo\n }, new Set<string>())\n}\n\nasync function generatePublicLocalFormSubmissionDraftsFromStorage(\n publicDraftsStorage: DraftSubmission[],\n) {\n const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds()\n const localFormSubmissionDraftsMap =\n generateLocalFormSubmissionDraftsFromDraftSubmissions(\n publicDraftsStorage,\n pendingSubmissionsDraftIds,\n new Set(),\n )\n\n const localFormSubmissionDrafts = Array.from(\n localFormSubmissionDraftsMap.values(),\n )\n\n return _orderBy(localFormSubmissionDrafts, (localFormSubmissionDraft) => {\n return localFormSubmissionDraft.draftSubmission?.createdAt\n })\n}\n\nasync function generateLocalFormSubmissionDraftsFromStorage(\n localDraftsStorage: LocalDraftsStorage,\n): Promise<LocalFormSubmissionDraft[]> {\n const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds()\n const deletedDraftIds = new Set(\n localDraftsStorage.deletedFormSubmissionDrafts.map(({ id }) => id),\n )\n\n const localFormSubmissionDraftsMap =\n generateLocalFormSubmissionDraftsFromDraftSubmissions(\n localDraftsStorage.unsyncedDraftSubmissions,\n pendingSubmissionsDraftIds,\n deletedDraftIds,\n )\n\n for (const formSubmissionDraft of localDraftsStorage.syncedFormSubmissionDrafts) {\n if (\n // Unsycned version of draft takes priority over the synced version\n !localFormSubmissionDraftsMap.has(formSubmissionDraft.id) &&\n // Remove drafts that are in the pending queue\n !pendingSubmissionsDraftIds.has(formSubmissionDraft.id) &&\n // Remove any drafts deleted while offline\n !deletedDraftIds.has(formSubmissionDraft.id)\n ) {\n const draftSubmission = await getDraftSubmission(\n formSubmissionDraft,\n ).catch((err) => {\n console.warn(\n `Could not fetch draft submission for draft: ${formSubmissionDraft.id}`,\n err,\n )\n return undefined\n })\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n draftSubmission,\n })\n }\n }\n\n const localFormSubmissionDrafts = Array.from(\n localFormSubmissionDraftsMap.values(),\n )\n\n return _orderBy(localFormSubmissionDrafts, (localFormSubmissionDraft) => {\n return (\n localFormSubmissionDraft.draftSubmission?.createdAt ||\n getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)\n ?.createdAt\n )\n })\n}\n\nfunction errorHandler(error: Error): Error {\n console.error('Local Forage Error', error)\n if (/The serialized value is too large/.test(error.message)) {\n return new OneBlinkAppsError(\n 'It seems you have run out of space. Please delete some of your drafts to allow new drafts to be created or existing drafts to be updated.',\n {\n originalError: error,\n },\n )\n }\n\n return error\n}\n\nconst draftsListeners: Array<(drafts: LocalFormSubmissionDraft[]) => unknown> =\n []\n\n/**\n * Register a listener function that will be passed an array of Drafts when a\n * draft is added, updated or deleted.\n *\n * #### Example\n *\n * ```js\n * const listener = async (drafts) => {\n * // use drafts here...\n * }\n * const deregister = await draftService.registerDraftsListener(listener)\n *\n * // When no longer needed, remember to deregister the listener\n * deregister()\n * ```\n *\n * @param listener\n * @returns\n */\nfunction registerDraftsListener(\n listener: (drafts: LocalFormSubmissionDraft[]) => unknown,\n): () => void {\n draftsListeners.push(listener)\n\n return () => {\n const index = draftsListeners.indexOf(listener)\n if (index !== -1) {\n draftsListeners.splice(index, 1)\n }\n }\n}\n\nasync function executeDraftsListeners(\n localFormSubmissionDrafts: LocalFormSubmissionDraft[],\n) {\n for (const draftsListener of draftsListeners) {\n draftsListener(localFormSubmissionDrafts)\n }\n}\n\n/**\n * Create or update a Draft in the local store and sync it with remote drafts.\n * Will also handle cleaning up auto save data (if the `autoSaveKey` property is\n * passed).\n *\n * #### Example\n *\n * ```js\n * const abortController = new AbortController()\n * const formSubmissionDraftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003' // pass `undefined` to create a new draft\n * const autoSaveKey = 'SET ME TO DELETE AUTOSAVE DATA AFTER SAVING DRAFT'\n * const draftSubmissionInput = {\n * title: 1,\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here',\n * },\n * definition: {\n * form: 'definition',\n * goes: 'here',\n * },\n * }\n * await draftService.upsertDraft({\n * formSubmissionDraftId,\n * autoSaveKey,\n * draftSubmissionInput,\n * abortSignal: abortController.signal,\n * onProgress: (progress) => {\n * // ...\n * },\n * })\n * ```\n *\n * @param options\n * @returns\n */\nasync function upsertDraft({\n formSubmissionDraftId,\n draftSubmissionInput,\n autoSaveKey,\n onProgress,\n abortSignal,\n pendingTimestamp,\n}: {\n formSubmissionDraftId: string | undefined\n draftSubmissionInput: DraftSubmissionInput\n autoSaveKey?: string\n onProgress?: ProgressListener\n abortSignal?: AbortSignal\n pendingTimestamp?: string\n}): Promise<void> {\n const draftSubmission: DraftSubmission = {\n ...draftSubmissionInput,\n createdAt: new Date().toISOString(),\n formSubmissionDraftId: formSubmissionDraftId || uuidv4(),\n }\n\n const keyId = getFormsKeyId()\n if (keyId) {\n if (isOffline()) {\n throw new OneBlinkAppsError('Drafts cannot be saved while offline.', {\n isOffline: true,\n })\n }\n\n await uploadDraftData(draftSubmission, onProgress, abortSignal)\n return\n }\n\n try {\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(\n draftSubmission.formsAppId,\n )\n const formSubmissionDraftVersion = await saveDraftSubmission({\n draftSubmission,\n autoSaveKey,\n onProgress,\n skipUpload: !isUsingPrivateDrafts,\n })\n\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n\n if (formSubmissionDraftVersion) {\n console.log('Draft was saved on server', formSubmissionDraftVersion)\n localDraftsStorage.syncedFormSubmissionDrafts =\n await getFormSubmissionDrafts(draftSubmission.formsAppId, abortSignal)\n // Remove draft from unsynced incase it was created offline\n if (formSubmissionDraftId) {\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.filter(\n (unsyncedDraftSubmission) =>\n unsyncedDraftSubmission.formSubmissionDraftId !==\n formSubmissionDraftId,\n )\n }\n } else {\n console.log(\n 'Draft could not be saved on server, saving locally to sync later',\n draftSubmission,\n )\n let updated = false\n\n if (formSubmissionDraftId) {\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.map(\n (unsyncedDraftSubmission) => {\n if (\n unsyncedDraftSubmission.formSubmissionDraftId ===\n formSubmissionDraftId\n ) {\n updated = true\n return draftSubmission\n }\n return unsyncedDraftSubmission\n },\n )\n // Remove draft from synced drafts incase it was retrieved while online\n localDraftsStorage.syncedFormSubmissionDrafts =\n localDraftsStorage.syncedFormSubmissionDrafts.filter(\n ({ id }) => id !== formSubmissionDraftId,\n )\n }\n\n if (!updated) {\n localDraftsStorage.unsyncedDraftSubmissions.push(draftSubmission)\n }\n }\n\n await setAndBroadcastDrafts(localDraftsStorage)\n } else {\n let updated = false\n const publicDraftsStorage = (await getPublicDraftsFromStorage()).map(\n (publicDraftSubmission) => {\n if (\n publicDraftSubmission.formSubmissionDraftId ===\n formSubmissionDraftId\n ) {\n updated = true\n return draftSubmission\n }\n return publicDraftSubmission\n },\n )\n if (!updated) {\n publicDraftsStorage.push(draftSubmission)\n }\n await setAndBroadcastPublicDrafts(publicDraftsStorage)\n }\n\n if (pendingTimestamp) {\n await deletePendingQueueSubmission(pendingTimestamp)\n }\n syncDrafts({\n throwError: false,\n formsAppId: draftSubmission.formsAppId,\n })\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n}\n\nasync function getLocalDraftsFromStorage(): Promise<LocalDraftsStorage> {\n const username = getUsername()\n if (username) {\n try {\n const localDraftsStorage =\n await utilsService.localForage.getItem<LocalDraftsStorage>(\n generateDraftsKey(username),\n )\n if (localDraftsStorage) {\n return localDraftsStorage\n }\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n }\n\n return {\n unsyncedDraftSubmissions: [],\n syncedFormSubmissionDrafts: [],\n deletedFormSubmissionDrafts: [],\n }\n}\n\nasync function getPublicDraftsFromStorage(): Promise<DraftSubmission[]> {\n try {\n const publicDrafts = await utilsService.localForage.getItem<\n DraftSubmission[]\n >(generatePublicDraftsKey())\n if (publicDrafts) {\n return publicDrafts\n }\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n\n return []\n}\n\n/**\n * Get an array of Drafts for the currently logged in user.\n *\n * #### Example\n *\n * ```js\n * const drafts = await draftService.getDrafts()\n * ```\n *\n * @returns\n */\nasync function getDrafts(): Promise<LocalFormSubmissionDraft[]> {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n return await generateLocalFormSubmissionDraftsFromStorage(localDraftsStorage)\n}\n\n/**\n * Get an array of Drafts that have been submitted publicly on this device.\n *\n * #### Example\n *\n * ```js\n * const drafts = await draftService.getPublicDrafts()\n * ```\n *\n * @returns\n */\nasync function getPublicDrafts(): Promise<LocalFormSubmissionDraft[]> {\n const publicDraftsStorage = await getPublicDraftsFromStorage()\n return await generatePublicLocalFormSubmissionDraftsFromStorage(\n publicDraftsStorage,\n )\n}\n\nasync function tryGetFormSubmissionDrafts(\n formsAppId: number,\n abortSignal: AbortSignal | undefined,\n) {\n try {\n return await getFormSubmissionDrafts(formsAppId, abortSignal)\n } catch (error) {\n if (!(error instanceof OneBlinkAppsError) || !error.isOffline) {\n throw error\n }\n }\n}\n\n/**\n * Get a single Draft and the associated submission data.\n *\n * #### Example\n *\n * ```js\n * const draftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003'\n * const { draft, draftData, lastElementUpdated } =\n * await draftService.getDraftAndData(draftId)\n * // use \"draftData\" to prefill a from\n * ```\n *\n * @param draftId\n * @returns\n */\nasync function getDraftAndData(\n formsAppId: number,\n formSubmissionDraftId: string | undefined | null,\n abortSignal: AbortSignal | undefined,\n): Promise<DraftSubmission | undefined> {\n if (!formSubmissionDraftId) {\n return\n }\n\n let formSubmissionDrafts = await tryGetFormSubmissionDrafts(\n formsAppId,\n abortSignal,\n )\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n if (formSubmissionDrafts) {\n localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts\n await setAndBroadcastDrafts(localDraftsStorage)\n } else {\n formSubmissionDrafts = localDraftsStorage.syncedFormSubmissionDrafts\n }\n\n const formSubmissionDraft = formSubmissionDrafts.find(\n ({ id }) => id === formSubmissionDraftId,\n )\n if (!formSubmissionDraft) {\n return (await getLocalDraftSubmission(formSubmissionDraftId)) || undefined\n }\n\n return await getDraftSubmission(formSubmissionDraft)\n } else {\n if (formSubmissionDrafts) {\n return (await getLocalDraftSubmission(formSubmissionDraftId)) || undefined\n }\n }\n}\n\n/**\n * Remove a draft from the local store and sync with remote drafts.\n *\n * #### Example\n *\n * ```js\n * const draftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003'\n * await draftService.deleteDraft(draftId)\n * ```\n *\n * @param draftId\n * @param formsAppId\n * @returns\n */\nasync function deleteDraft(\n formSubmissionDraftId: string,\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<void> {\n try {\n await removeLocalDraftSubmission(formSubmissionDraftId)\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n const formSubmissionDraft =\n localDraftsStorage.syncedFormSubmissionDrafts.find(\n ({ id }) => id === formSubmissionDraftId,\n )\n if (formSubmissionDraft) {\n const { hasDeletedRemoteDraft } = await deleteDraftData(\n formSubmissionDraftId,\n abortSignal,\n )\n localDraftsStorage.syncedFormSubmissionDrafts =\n localDraftsStorage.syncedFormSubmissionDrafts.filter(\n ({ id }) => id !== formSubmissionDraft.id,\n )\n if (!hasDeletedRemoteDraft) {\n localDraftsStorage.deletedFormSubmissionDrafts.push(\n formSubmissionDraft,\n )\n }\n } else {\n console.log(\n 'Could not find existing draft in synced drafts to delete',\n {\n formSubmissionDraftId,\n localDraftsStorage,\n },\n )\n const draftSubmission =\n localDraftsStorage.unsyncedDraftSubmissions.find(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId === formSubmissionDraftId,\n )\n if (!draftSubmission) {\n return\n }\n\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.filter(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId !== formSubmissionDraftId,\n )\n }\n\n await setAndBroadcastDrafts(localDraftsStorage)\n } else {\n let publicDraftsStorage = await getPublicDraftsFromStorage()\n const draftSubmission = publicDraftsStorage.find(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId === formSubmissionDraftId,\n )\n if (!draftSubmission) {\n return\n }\n\n publicDraftsStorage = publicDraftsStorage.filter(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId !== formSubmissionDraftId,\n )\n\n await setAndBroadcastPublicDrafts(publicDraftsStorage)\n }\n\n syncDrafts({\n throwError: false,\n formsAppId,\n })\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n}\n\nasync function setAndBroadcastPublicDrafts(publicDrafts: DraftSubmission[]) {\n await utilsService.localForage.setItem(\n generatePublicDraftsKey(),\n publicDrafts,\n )\n\n console.log('Public drafts have been updated', publicDrafts)\n const localFormSubmissionDrafts =\n await generatePublicLocalFormSubmissionDraftsFromStorage(publicDrafts)\n await executeDraftsListeners(\n localFormSubmissionDrafts.map((draft) => ({ ...draft, isPublic: true })),\n )\n}\n\nasync function setAndBroadcastDrafts(\n localDraftsStorage: LocalDraftsStorage,\n): Promise<void> {\n const username = getUsername()\n if (!username) {\n throw new OneBlinkAppsError(\n 'You cannot set your drafts until you have logged in. Please login and try again.',\n {\n requiresLogin: true,\n },\n )\n }\n await utilsService.localForage.setItem(\n generateDraftsKey(username),\n localDraftsStorage,\n )\n\n console.log('Drafts have been updated', localDraftsStorage)\n const localFormSubmissionDrafts =\n await generateLocalFormSubmissionDraftsFromStorage(localDraftsStorage)\n await executeDraftsListeners(localFormSubmissionDrafts)\n}\n\nlet _isSyncingDrafts = false\n\n/**\n * Force a sync of remote drafts with locally stored drafts. This function will\n * swallow all errors thrown unless `true` is passed for the `throwError`\n * property.\n *\n * #### Example\n *\n * ```js\n * await draftService.syncDrafts({\n * throwError: true,\n * formsAppId: 1,\n * })\n * ```\n *\n * @param param0\n * @returns\n */\nasync function syncDrafts({\n formsAppId,\n throwError,\n abortSignal,\n}: {\n /** The id of the OneBlink Forms App to sync drafts with */\n formsAppId: number\n /** `true` to throw errors while syncing */\n throwError?: boolean\n /** Signal to abort the requests */\n abortSignal?: AbortSignal\n}): Promise<void> {\n if (_isSyncingDrafts) {\n console.log('Application is currently syncing drafts.')\n return\n }\n _isSyncingDrafts = true\n\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n\n if (!isUsingPrivateDrafts) {\n const publicDrafts = await getPublicDraftsFromStorage()\n const filteredPublicDrafts = []\n // iterate through public draft records, and check if a draft submission exists for each record.\n // If no draft submission exists for a record, the draft was likely submitted, so we must remove it\n // from the list of public drafts so it no longer appears in the user's draft list.\n for (const publicDraft of publicDrafts) {\n const localDraftSubmission = await getLocalDraftSubmission(\n publicDraft.formSubmissionDraftId,\n )\n if (localDraftSubmission) {\n filteredPublicDrafts.push(publicDraft)\n }\n }\n await setAndBroadcastPublicDrafts(filteredPublicDrafts)\n _isSyncingDrafts = false\n return\n }\n\n try {\n let localDraftsStorage = await getLocalDraftsFromStorage()\n if (localDraftsStorage.deletedFormSubmissionDrafts.length) {\n console.log(\n 'Removing local draft data for deleted drafts',\n localDraftsStorage.deletedFormSubmissionDrafts,\n )\n const newDeletedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[] =\n []\n for (const formSubmissionDraft of localDraftsStorage.deletedFormSubmissionDrafts) {\n const { hasDeletedRemoteDraft } = await deleteDraftData(\n formSubmissionDraft.id,\n abortSignal,\n )\n if (!hasDeletedRemoteDraft) {\n newDeletedFormSubmissionDrafts.push(formSubmissionDraft)\n }\n }\n\n // Get local drafts again to ensure nothing has happened while processing\n localDraftsStorage = await getLocalDraftsFromStorage()\n localDraftsStorage.deletedFormSubmissionDrafts =\n newDeletedFormSubmissionDrafts\n }\n\n const publicDraftsStorage = await getPublicDraftsFromStorage()\n // if public drafts exist, add them to the current logged in users' unsynced drafts\n // and remove them from local storage\n if (publicDraftsStorage.length) {\n localDraftsStorage.unsyncedDraftSubmissions.push(...publicDraftsStorage)\n await utilsService.localForage.setItem(generatePublicDraftsKey(), [])\n }\n\n if (localDraftsStorage.unsyncedDraftSubmissions.length) {\n console.log(\n `Attempting to upload ${localDraftsStorage.unsyncedDraftSubmissions.length} local unsynced drafts(s).`,\n )\n const newUnsyncedDraftSubmissions: DraftSubmission[] = []\n for (const draftSubmission of localDraftsStorage.unsyncedDraftSubmissions) {\n console.log(\n 'Uploading draft data that was saved while offline',\n draftSubmission.title,\n )\n draftSubmission.backgroundUpload = false\n const formSubmissionDraftVersion = await saveDraftSubmission({\n draftSubmission,\n autoSaveKey: undefined,\n abortSignal,\n skipUpload: !isUsingPrivateDrafts,\n })\n if (!formSubmissionDraftVersion) {\n newUnsyncedDraftSubmissions.push(draftSubmission)\n }\n }\n // Get local drafts again to ensure nothing has happened while processing\n localDraftsStorage = await getLocalDraftsFromStorage()\n localDraftsStorage.unsyncedDraftSubmissions = newUnsyncedDraftSubmissions\n }\n\n const formSubmissionDrafts = await tryGetFormSubmissionDrafts(\n formsAppId,\n abortSignal,\n )\n if (formSubmissionDrafts) {\n localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts\n }\n\n await setAndBroadcastDrafts(localDraftsStorage)\n\n if (localDraftsStorage.syncedFormSubmissionDrafts.length) {\n console.log(\n 'Ensuring all draft data is available for offline use for synced drafts',\n localDraftsStorage.syncedFormSubmissionDrafts,\n )\n for (const formSubmissionDraft of localDraftsStorage.syncedFormSubmissionDrafts) {\n await getDraftSubmission(formSubmissionDraft, abortSignal).catch(\n (error) => {\n console.warn('Could not download Draft Data as JSON', error)\n },\n )\n }\n }\n\n console.log('Finished syncing drafts.')\n _isSyncingDrafts = false\n } catch (error) {\n _isSyncingDrafts = false\n if (abortSignal?.aborted) {\n console.log('Syncing drafts has been aborted')\n return\n }\n console.warn(\n 'Error while attempting to sync and update local drafts',\n error,\n )\n if (!(error instanceof OneBlinkAppsError)) {\n Sentry.captureException(error)\n }\n if (throwError) {\n throw error\n }\n }\n}\n\nexport {\n registerDraftsListener,\n upsertDraft,\n getDraftAndData,\n getDrafts,\n getPublicDrafts,\n deleteDraft,\n syncDrafts,\n getLatestFormSubmissionDraftVersion,\n LocalFormSubmissionDraft,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"draft-service.js","sourceRoot":"","sources":["../../src/apps/draft-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuidv4 } from 'uuid'\nimport _orderBy from 'lodash.orderby'\nimport utilsService from './services/utils'\nimport OneBlinkAppsError from './services/errors/oneBlinkAppsError'\nimport { isOffline } from './offline-service'\nimport { getUsername } from './services/cognito'\nimport { getFormsKeyId, getCurrentFormsAppUser } from './auth-service'\nimport {\n DRAFT_DATA_UNAVAILABLE_ERROR_TITLE,\n getFormSubmissionDrafts,\n uploadDraftData,\n} from './services/api/drafts'\nimport {\n getPendingQueueSubmissions,\n deletePendingQueueSubmission,\n} from './services/pending-queue'\nimport {\n deleteDraftData,\n getDraftSubmission,\n getLatestFormSubmissionDraftVersion,\n getLocalDraftSubmission,\n removeLocalDraftSubmission,\n saveDraftSubmission,\n} from './services/draft-data-store'\nimport { SubmissionTypes } from '@oneblink/types'\nimport Sentry from './Sentry'\nimport {\n DraftSubmission,\n DraftSubmissionInput,\n LocalFormSubmissionDraft,\n ProgressListener,\n} from './types/submissions'\n\nfunction generateDraftsKey(username: string) {\n return `V2_DRAFTS_${username}`\n}\n\nfunction generatePublicDraftsKey() {\n return `V2_DRAFTS_PUBLIC`\n}\n\ninterface LocalDraftsStorage {\n deletedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n unsyncedDraftSubmissions: DraftSubmission[]\n syncedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n}\n\nasync function checkIfUsingPrivateDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<boolean> {\n return getCurrentFormsAppUser(formsAppId, abortSignal)\n .then((user) => !!user)\n .catch((error) => {\n if (error.status >= 400 && error.status < 500) {\n return false\n } else {\n Sentry.captureException(error)\n console.log(\n 'Could not determine if the current user has access to this forms app',\n error,\n )\n return false\n }\n })\n}\n\nfunction generateLocalFormSubmissionDraftsFromDraftSubmissions(\n draftSubmissions: DraftSubmission[],\n pendingSubmissionsDraftIds: Set<string>,\n deletedDraftIds: Set<string>,\n) {\n const localFormSubmissionDraftsMap = new Map<\n string,\n LocalFormSubmissionDraft\n >()\n\n for (const draftSubmission of draftSubmissions) {\n if (\n // Remove drafts that are in the pending queue\n !pendingSubmissionsDraftIds.has(draftSubmission.formSubmissionDraftId) &&\n // Remove any drafts deleted while offline\n !deletedDraftIds.has(draftSubmission.formSubmissionDraftId)\n ) {\n localFormSubmissionDraftsMap.set(draftSubmission.formSubmissionDraftId, {\n formsAppId: draftSubmission.formsAppId,\n formId: draftSubmission.definition.id,\n externalId: draftSubmission.externalId,\n jobId: draftSubmission.jobId,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance\n ?.taskGroupInstanceId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n draftSubmission,\n versions: undefined,\n downloadStatus: 'SUCCESS',\n })\n }\n }\n\n return localFormSubmissionDraftsMap\n}\n\nasync function getPendingSubmissionsDraftIds() {\n const pendingSubmissions = await getPendingQueueSubmissions()\n return pendingSubmissions.reduce<Set<string>>((memo, pendingSubmission) => {\n if (pendingSubmission.formSubmissionDraftId) {\n memo.add(pendingSubmission.formSubmissionDraftId)\n }\n return memo\n }, new Set<string>())\n}\n\nasync function generatePublicLocalFormSubmissionDraftsFromStorage(\n publicDraftsStorage: DraftSubmission[],\n) {\n const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds()\n const localFormSubmissionDraftsMap =\n generateLocalFormSubmissionDraftsFromDraftSubmissions(\n publicDraftsStorage,\n pendingSubmissionsDraftIds,\n new Set(),\n )\n\n const localFormSubmissionDrafts = Array.from(\n localFormSubmissionDraftsMap.values(),\n )\n\n return _orderBy(localFormSubmissionDrafts, (localFormSubmissionDraft) => {\n return localFormSubmissionDraft.downloadStatus === 'SUCCESS'\n ? localFormSubmissionDraft.draftSubmission?.createdAt\n : undefined\n })\n}\n\nasync function generateLocalFormSubmissionDraftsFromStorage(\n localDraftsStorage: LocalDraftsStorage,\n): Promise<LocalFormSubmissionDraft[]> {\n const pendingSubmissionsDraftIds = await getPendingSubmissionsDraftIds()\n const deletedDraftIds = new Set(\n localDraftsStorage.deletedFormSubmissionDrafts.map(({ id }) => id),\n )\n\n const localFormSubmissionDraftsMap =\n generateLocalFormSubmissionDraftsFromDraftSubmissions(\n localDraftsStorage.unsyncedDraftSubmissions,\n pendingSubmissionsDraftIds,\n deletedDraftIds,\n )\n\n async function broadcastUpdate() {\n const draftsToBroadcast = Array.from(localFormSubmissionDraftsMap.values())\n\n const orderedDrafts = _orderBy(\n draftsToBroadcast,\n (localFormSubmissionDraft) =>\n getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)\n ?.createdAt,\n )\n\n await executeDraftsListeners(orderedDrafts)\n }\n\n // At this point we need to store the state of the drafts in localForage\n const draftsToDownload: SubmissionTypes.FormSubmissionDraft[] = []\n\n for (const formSubmissionDraft of localDraftsStorage.syncedFormSubmissionDrafts) {\n if (\n // Unsycned version of draft takes priority over the synced version\n !localFormSubmissionDraftsMap.has(formSubmissionDraft.id) &&\n // Remove drafts that are in the pending queue\n !pendingSubmissionsDraftIds.has(formSubmissionDraft.id) &&\n // Remove any drafts deleted while offline\n !deletedDraftIds.has(formSubmissionDraft.id)\n ) {\n draftsToDownload.push(formSubmissionDraft)\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n downloadStatus: 'PENDING',\n })\n }\n }\n\n await broadcastUpdate()\n\n // TODO Batch the downloads instead of sequentially\n if (draftsToDownload.length) {\n for (const formSubmissionDraft of draftsToDownload) {\n const currentValue = localFormSubmissionDraftsMap.get(\n formSubmissionDraft.id,\n )\n if (currentValue) {\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...currentValue,\n downloadStatus: 'DOWNLOADING',\n })\n }\n await broadcastUpdate()\n\n const draftSubmission = await getDraftSubmission(\n formSubmissionDraft,\n ).catch((err) => {\n console.warn(\n `Could not fetch draft submission for draft: ${formSubmissionDraft.id}`,\n err,\n )\n\n if (\n err instanceof OneBlinkAppsError &&\n err.title === DRAFT_DATA_UNAVAILABLE_ERROR_TITLE\n ) {\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n downloadStatus: 'NOT_AVAILABLE',\n })\n return\n }\n\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n downloadStatus: 'ERROR',\n downloadError: err.message,\n })\n\n return undefined\n })\n if (draftSubmission) {\n localFormSubmissionDraftsMap.set(formSubmissionDraft.id, {\n ...formSubmissionDraft,\n draftSubmission: draftSubmission,\n downloadStatus: 'SUCCESS',\n })\n }\n\n await broadcastUpdate()\n }\n }\n\n const localFormSubmissionDrafts = Array.from(\n localFormSubmissionDraftsMap.values(),\n )\n\n return _orderBy(\n localFormSubmissionDrafts,\n (localFormSubmissionDraft) =>\n getLatestFormSubmissionDraftVersion(localFormSubmissionDraft.versions)\n ?.createdAt,\n )\n}\n\nfunction errorHandler(error: Error): Error {\n console.error('Local Forage Error', error)\n if (/The serialized value is too large/.test(error.message)) {\n return new OneBlinkAppsError(\n 'It seems you have run out of space. Please delete some of your drafts to allow new drafts to be created or existing drafts to be updated.',\n {\n originalError: error,\n },\n )\n }\n\n return error\n}\n\nconst draftsListeners: Array<(drafts: LocalFormSubmissionDraft[]) => unknown> =\n []\n\n/**\n * Register a listener function that will be passed an array of Drafts when a\n * draft is added, updated or deleted.\n *\n * #### Example\n *\n * ```js\n * const listener = async (drafts) => {\n * // use drafts here...\n * }\n * const deregister = await draftService.registerDraftsListener(listener)\n *\n * // When no longer needed, remember to deregister the listener\n * deregister()\n * ```\n *\n * @param listener\n * @returns\n */\nfunction registerDraftsListener(\n listener: (drafts: LocalFormSubmissionDraft[]) => unknown,\n): () => void {\n draftsListeners.push(listener)\n\n return () => {\n const index = draftsListeners.indexOf(listener)\n if (index !== -1) {\n draftsListeners.splice(index, 1)\n }\n }\n}\n\nasync function executeDraftsListeners(\n localFormSubmissionDrafts: LocalFormSubmissionDraft[],\n) {\n for (const draftsListener of draftsListeners) {\n draftsListener(localFormSubmissionDrafts)\n }\n}\n\n/**\n * Create or update a Draft in the local store and sync it with remote drafts.\n * Will also handle cleaning up auto save data (if the `autoSaveKey` property is\n * passed).\n *\n * #### Example\n *\n * ```js\n * const abortController = new AbortController()\n * const formSubmissionDraftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003' // pass `undefined` to create a new draft\n * const autoSaveKey = 'SET ME TO DELETE AUTOSAVE DATA AFTER SAVING DRAFT'\n * const draftSubmissionInput = {\n * title: 1,\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here',\n * },\n * definition: {\n * form: 'definition',\n * goes: 'here',\n * },\n * }\n * await draftService.upsertDraft({\n * formSubmissionDraftId,\n * autoSaveKey,\n * draftSubmissionInput,\n * abortSignal: abortController.signal,\n * onProgress: (progress) => {\n * // ...\n * },\n * })\n * ```\n *\n * @param options\n * @returns\n */\nasync function upsertDraft({\n formSubmissionDraftId,\n draftSubmissionInput,\n autoSaveKey,\n onProgress,\n abortSignal,\n pendingTimestamp,\n}: {\n formSubmissionDraftId: string | undefined\n draftSubmissionInput: DraftSubmissionInput\n autoSaveKey?: string\n onProgress?: ProgressListener\n abortSignal?: AbortSignal\n pendingTimestamp?: string\n}): Promise<void> {\n const draftSubmission: DraftSubmission = {\n ...draftSubmissionInput,\n createdAt: new Date().toISOString(),\n formSubmissionDraftId: formSubmissionDraftId || uuidv4(),\n }\n\n const keyId = getFormsKeyId()\n if (keyId) {\n if (isOffline()) {\n throw new OneBlinkAppsError('Drafts cannot be saved while offline.', {\n isOffline: true,\n })\n }\n\n await uploadDraftData(draftSubmission, onProgress, abortSignal)\n return\n }\n\n try {\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(\n draftSubmission.formsAppId,\n )\n const formSubmissionDraftVersion = await saveDraftSubmission({\n draftSubmission,\n autoSaveKey,\n onProgress,\n skipUpload: !isUsingPrivateDrafts,\n })\n\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n\n if (formSubmissionDraftVersion) {\n console.log('Draft was saved on server', formSubmissionDraftVersion)\n localDraftsStorage.syncedFormSubmissionDrafts =\n await getFormSubmissionDrafts(draftSubmission.formsAppId, abortSignal)\n // Remove draft from unsynced incase it was created offline\n if (formSubmissionDraftId) {\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.filter(\n (unsyncedDraftSubmission) =>\n unsyncedDraftSubmission.formSubmissionDraftId !==\n formSubmissionDraftId,\n )\n }\n } else {\n console.log(\n 'Draft could not be saved on server, saving locally to sync later',\n draftSubmission,\n )\n let updated = false\n\n if (formSubmissionDraftId) {\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.map(\n (unsyncedDraftSubmission) => {\n if (\n unsyncedDraftSubmission.formSubmissionDraftId ===\n formSubmissionDraftId\n ) {\n updated = true\n return draftSubmission\n }\n return unsyncedDraftSubmission\n },\n )\n // Remove draft from synced drafts incase it was retrieved while online\n localDraftsStorage.syncedFormSubmissionDrafts =\n localDraftsStorage.syncedFormSubmissionDrafts.filter(\n ({ id }) => id !== formSubmissionDraftId,\n )\n }\n\n if (!updated) {\n localDraftsStorage.unsyncedDraftSubmissions.push(draftSubmission)\n }\n }\n\n await setAndBroadcastDrafts(localDraftsStorage)\n } else {\n let updated = false\n const publicDraftsStorage = (await getPublicDraftsFromStorage()).map(\n (publicDraftSubmission) => {\n if (\n publicDraftSubmission.formSubmissionDraftId ===\n formSubmissionDraftId\n ) {\n updated = true\n return draftSubmission\n }\n return publicDraftSubmission\n },\n )\n if (!updated) {\n publicDraftsStorage.push(draftSubmission)\n }\n await setAndBroadcastPublicDrafts(publicDraftsStorage)\n }\n\n if (pendingTimestamp) {\n await deletePendingQueueSubmission(pendingTimestamp)\n }\n syncDrafts({\n throwError: false,\n formsAppId: draftSubmission.formsAppId,\n })\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n}\n\nasync function getLocalDraftsFromStorage(): Promise<LocalDraftsStorage> {\n const username = getUsername()\n if (username) {\n try {\n const localDraftsStorage =\n await utilsService.localForage.getItem<LocalDraftsStorage>(\n generateDraftsKey(username),\n )\n if (localDraftsStorage) {\n return localDraftsStorage\n }\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n }\n\n return {\n unsyncedDraftSubmissions: [],\n syncedFormSubmissionDrafts: [],\n deletedFormSubmissionDrafts: [],\n }\n}\n\nasync function getPublicDraftsFromStorage(): Promise<DraftSubmission[]> {\n try {\n const publicDrafts = await utilsService.localForage.getItem<\n DraftSubmission[]\n >(generatePublicDraftsKey())\n if (publicDrafts) {\n return publicDrafts\n }\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n\n return []\n}\n\n/**\n * Get an array of Drafts for the currently logged in user.\n *\n * #### Example\n *\n * ```js\n * const drafts = await draftService.getDrafts()\n * ```\n *\n * @returns\n */\nasync function getDrafts(): Promise<LocalFormSubmissionDraft[]> {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n return await generateLocalFormSubmissionDraftsFromStorage(localDraftsStorage)\n}\n\n/**\n * Get an array of Drafts that have been submitted publicly on this device.\n *\n * #### Example\n *\n * ```js\n * const drafts = await draftService.getPublicDrafts()\n * ```\n *\n * @returns\n */\nasync function getPublicDrafts(): Promise<LocalFormSubmissionDraft[]> {\n const publicDraftsStorage = await getPublicDraftsFromStorage()\n return await generatePublicLocalFormSubmissionDraftsFromStorage(\n publicDraftsStorage,\n )\n}\n\nasync function tryGetFormSubmissionDrafts(\n formsAppId: number,\n abortSignal: AbortSignal | undefined,\n) {\n try {\n return await getFormSubmissionDrafts(formsAppId, abortSignal)\n } catch (error) {\n if (!(error instanceof OneBlinkAppsError) || !error.isOffline) {\n throw error\n }\n }\n}\n\n/**\n * Get a single Draft and the associated submission data.\n *\n * #### Example\n *\n * ```js\n * const draftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003'\n * const { draft, draftData, lastElementUpdated } =\n * await draftService.getDraftAndData(draftId)\n * // use \"draftData\" to prefill a from\n * ```\n *\n * @param draftId\n * @returns\n */\nasync function getDraftAndData(\n formsAppId: number,\n formSubmissionDraftId: string | undefined | null,\n abortSignal: AbortSignal | undefined,\n): Promise<DraftSubmission | undefined> {\n if (!formSubmissionDraftId) {\n return\n }\n\n let formSubmissionDrafts = await tryGetFormSubmissionDrafts(\n formsAppId,\n abortSignal,\n )\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n if (formSubmissionDrafts) {\n localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts\n await setAndBroadcastDrafts(localDraftsStorage)\n } else {\n formSubmissionDrafts = localDraftsStorage.syncedFormSubmissionDrafts\n }\n\n const formSubmissionDraft = formSubmissionDrafts.find(\n ({ id }) => id === formSubmissionDraftId,\n )\n if (!formSubmissionDraft) {\n return (await getLocalDraftSubmission(formSubmissionDraftId)) || undefined\n }\n\n return await getDraftSubmission(formSubmissionDraft)\n } else {\n if (formSubmissionDrafts) {\n return (await getLocalDraftSubmission(formSubmissionDraftId)) || undefined\n }\n }\n}\n\n/**\n * Remove a draft from the local store and sync with remote drafts.\n *\n * #### Example\n *\n * ```js\n * const draftId = 'd3aeb944-d0b3-11ea-87d0-0242ac130003'\n * await draftService.deleteDraft(draftId)\n * ```\n *\n * @param draftId\n * @param formsAppId\n * @returns\n */\nasync function deleteDraft(\n formSubmissionDraftId: string,\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<void> {\n try {\n await removeLocalDraftSubmission(formSubmissionDraftId)\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n if (isUsingPrivateDrafts) {\n const localDraftsStorage = await getLocalDraftsFromStorage()\n const formSubmissionDraft =\n localDraftsStorage.syncedFormSubmissionDrafts.find(\n ({ id }) => id === formSubmissionDraftId,\n )\n if (formSubmissionDraft) {\n const { hasDeletedRemoteDraft } = await deleteDraftData(\n formSubmissionDraftId,\n abortSignal,\n )\n localDraftsStorage.syncedFormSubmissionDrafts =\n localDraftsStorage.syncedFormSubmissionDrafts.filter(\n ({ id }) => id !== formSubmissionDraft.id,\n )\n if (!hasDeletedRemoteDraft) {\n localDraftsStorage.deletedFormSubmissionDrafts.push(\n formSubmissionDraft,\n )\n }\n } else {\n console.log(\n 'Could not find existing draft in synced drafts to delete',\n {\n formSubmissionDraftId,\n localDraftsStorage,\n },\n )\n const draftSubmission =\n localDraftsStorage.unsyncedDraftSubmissions.find(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId === formSubmissionDraftId,\n )\n if (!draftSubmission) {\n return\n }\n\n localDraftsStorage.unsyncedDraftSubmissions =\n localDraftsStorage.unsyncedDraftSubmissions.filter(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId !== formSubmissionDraftId,\n )\n }\n\n await setAndBroadcastDrafts(localDraftsStorage)\n } else {\n let publicDraftsStorage = await getPublicDraftsFromStorage()\n const draftSubmission = publicDraftsStorage.find(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId === formSubmissionDraftId,\n )\n if (!draftSubmission) {\n return\n }\n\n publicDraftsStorage = publicDraftsStorage.filter(\n (draftSubmission) =>\n draftSubmission.formSubmissionDraftId !== formSubmissionDraftId,\n )\n\n await setAndBroadcastPublicDrafts(publicDraftsStorage)\n }\n\n syncDrafts({\n throwError: false,\n formsAppId,\n })\n } catch (err) {\n Sentry.captureException(err)\n throw errorHandler(err as Error)\n }\n}\n\nasync function setAndBroadcastPublicDrafts(publicDrafts: DraftSubmission[]) {\n await utilsService.localForage.setItem(\n generatePublicDraftsKey(),\n publicDrafts,\n )\n\n console.log('Public drafts have been updated', publicDrafts)\n const localFormSubmissionDrafts =\n await generatePublicLocalFormSubmissionDraftsFromStorage(publicDrafts)\n await executeDraftsListeners(\n localFormSubmissionDrafts.map((draft) => ({ ...draft, isPublic: true })),\n )\n}\n\nasync function setAndBroadcastDrafts(\n localDraftsStorage: LocalDraftsStorage,\n): Promise<void> {\n const username = getUsername()\n if (!username) {\n throw new OneBlinkAppsError(\n 'You cannot set your drafts until you have logged in. Please login and try again.',\n {\n requiresLogin: true,\n },\n )\n }\n await utilsService.localForage.setItem(\n generateDraftsKey(username),\n localDraftsStorage,\n )\n\n console.log('Drafts have been updated', localDraftsStorage)\n const localFormSubmissionDrafts =\n await generateLocalFormSubmissionDraftsFromStorage(localDraftsStorage)\n await executeDraftsListeners(localFormSubmissionDrafts)\n}\n\nlet _isSyncingDrafts = false\n\n/**\n * Force a sync of remote drafts with locally stored drafts. This function will\n * swallow all errors thrown unless `true` is passed for the `throwError`\n * property.\n *\n * #### Example\n *\n * ```js\n * await draftService.syncDrafts({\n * throwError: true,\n * formsAppId: 1,\n * })\n * ```\n *\n * @param param0\n * @returns\n */\nasync function syncDrafts({\n formsAppId,\n throwError,\n abortSignal,\n}: {\n /** The id of the OneBlink Forms App to sync drafts with */\n formsAppId: number\n /** `true` to throw errors while syncing */\n throwError?: boolean\n /** Signal to abort the requests */\n abortSignal?: AbortSignal\n}): Promise<void> {\n if (_isSyncingDrafts) {\n console.log('Application is currently syncing drafts.')\n return\n }\n _isSyncingDrafts = true\n\n const isUsingPrivateDrafts = await checkIfUsingPrivateDrafts(formsAppId)\n\n if (!isUsingPrivateDrafts) {\n const publicDrafts = await getPublicDraftsFromStorage()\n const filteredPublicDrafts = []\n // iterate through public draft records, and check if a draft submission exists for each record.\n // If no draft submission exists for a record, the draft was likely submitted, so we must remove it\n // from the list of public drafts so it no longer appears in the user's draft list.\n for (const publicDraft of publicDrafts) {\n const localDraftSubmission = await getLocalDraftSubmission(\n publicDraft.formSubmissionDraftId,\n )\n if (localDraftSubmission) {\n filteredPublicDrafts.push(publicDraft)\n }\n }\n await setAndBroadcastPublicDrafts(filteredPublicDrafts)\n _isSyncingDrafts = false\n return\n }\n\n try {\n let localDraftsStorage = await getLocalDraftsFromStorage()\n if (localDraftsStorage.deletedFormSubmissionDrafts.length) {\n console.log(\n 'Removing local draft data for deleted drafts',\n localDraftsStorage.deletedFormSubmissionDrafts,\n )\n const newDeletedFormSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[] =\n []\n for (const formSubmissionDraft of localDraftsStorage.deletedFormSubmissionDrafts) {\n const { hasDeletedRemoteDraft } = await deleteDraftData(\n formSubmissionDraft.id,\n abortSignal,\n )\n if (!hasDeletedRemoteDraft) {\n newDeletedFormSubmissionDrafts.push(formSubmissionDraft)\n }\n }\n\n // Get local drafts again to ensure nothing has happened while processing\n localDraftsStorage = await getLocalDraftsFromStorage()\n localDraftsStorage.deletedFormSubmissionDrafts =\n newDeletedFormSubmissionDrafts\n }\n\n const publicDraftsStorage = await getPublicDraftsFromStorage()\n // if public drafts exist, add them to the current logged in users' unsynced drafts\n // and remove them from local storage\n if (publicDraftsStorage.length) {\n localDraftsStorage.unsyncedDraftSubmissions.push(...publicDraftsStorage)\n await utilsService.localForage.setItem(generatePublicDraftsKey(), [])\n }\n\n if (localDraftsStorage.unsyncedDraftSubmissions.length) {\n console.log(\n `Attempting to upload ${localDraftsStorage.unsyncedDraftSubmissions.length} local unsynced drafts(s).`,\n )\n const newUnsyncedDraftSubmissions: DraftSubmission[] = []\n for (const draftSubmission of localDraftsStorage.unsyncedDraftSubmissions) {\n console.log(\n 'Uploading draft data that was saved while offline',\n draftSubmission.title,\n )\n draftSubmission.backgroundUpload = false\n const formSubmissionDraftVersion = await saveDraftSubmission({\n draftSubmission,\n autoSaveKey: undefined,\n abortSignal,\n skipUpload: !isUsingPrivateDrafts,\n })\n if (!formSubmissionDraftVersion) {\n newUnsyncedDraftSubmissions.push(draftSubmission)\n }\n }\n // Get local drafts again to ensure nothing has happened while processing\n localDraftsStorage = await getLocalDraftsFromStorage()\n localDraftsStorage.unsyncedDraftSubmissions = newUnsyncedDraftSubmissions\n }\n\n const formSubmissionDrafts = await tryGetFormSubmissionDrafts(\n formsAppId,\n abortSignal,\n )\n if (formSubmissionDrafts) {\n localDraftsStorage.syncedFormSubmissionDrafts = formSubmissionDrafts\n }\n\n console.log('Downloading drafts in the background')\n setAndBroadcastDrafts(localDraftsStorage)\n .then(async () => {\n console.log('Finished syncing drafts.')\n })\n .catch((error) => {\n if (abortSignal?.aborted) {\n console.log('Syncing drafts has been aborted')\n return\n }\n console.warn(\n 'Error while attempting download drafts in the background',\n error,\n )\n if (!(error instanceof OneBlinkAppsError)) {\n Sentry.captureException(error)\n }\n })\n .finally(() => {\n _isSyncingDrafts = false\n })\n\n // broadcast the drafts and download the draft data in the background\n } catch (error) {\n _isSyncingDrafts = false\n if (abortSignal?.aborted) {\n console.log('Syncing drafts has been aborted')\n return\n }\n console.warn(\n 'Error while attempting to sync and update local drafts',\n error,\n )\n if (!(error instanceof OneBlinkAppsError)) {\n Sentry.captureException(error)\n }\n if (throwError) {\n throw error\n }\n }\n}\n\nexport {\n registerDraftsListener,\n upsertDraft,\n getDraftAndData,\n getDrafts,\n getPublicDrafts,\n deleteDraft,\n syncDrafts,\n getLatestFormSubmissionDraftVersion,\n LocalFormSubmissionDraft,\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SubmissionTypes } from '@oneblink/types';
|
|
2
2
|
import { DraftSubmission, ProgressListener } from '../../types/submissions';
|
|
3
|
+
export declare const DRAFT_DATA_UNAVAILABLE_ERROR_TITLE = "Draft Data Unavailable";
|
|
3
4
|
declare function uploadDraftData(draftSubmission: DraftSubmission, onProgress?: ProgressListener, abortSignal?: AbortSignal): Promise<import("@oneblink/storage/dist/http-handlers/types").OneBlinkResponse<SubmissionTypes.FormSubmissionDraftVersion>>;
|
|
4
5
|
declare function getFormSubmissionDrafts(formsAppId: number, abortSignal?: AbortSignal): Promise<SubmissionTypes.FormSubmissionDraft[]>;
|
|
5
6
|
declare function downloadDraftData(formSubmissionDraftVersionId: string, abortSignal?: AbortSignal): Promise<SubmissionTypes.S3SubmissionData>;
|
|
@@ -9,6 +9,7 @@ import prepareSubmissionData from '../prepareSubmissionData';
|
|
|
9
9
|
import generateOneBlinkUploader from '../generateOneBlinkUploader';
|
|
10
10
|
import { OneBlinkStorageError } from '@oneblink/storage';
|
|
11
11
|
import generateOneBlinkDownloader from '../generateOneBlinkDownloader';
|
|
12
|
+
export const DRAFT_DATA_UNAVAILABLE_ERROR_TITLE = 'Draft Data Unavailable';
|
|
12
13
|
async function uploadDraftData(draftSubmission, onProgress, abortSignal) {
|
|
13
14
|
var _a, _b, _c, _d;
|
|
14
15
|
try {
|
|
@@ -134,7 +135,7 @@ async function downloadDraftData(formSubmissionDraftVersionId, abortSignal) {
|
|
|
134
135
|
});
|
|
135
136
|
if (!data) {
|
|
136
137
|
throw new OneBlinkAppsError("Data has been removed based on your administrator's draft data retention policy.", {
|
|
137
|
-
title:
|
|
138
|
+
title: DRAFT_DATA_UNAVAILABLE_ERROR_TITLE,
|
|
138
139
|
});
|
|
139
140
|
}
|
|
140
141
|
return data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../../src/apps/services/api/drafts.ts"],"names":[],"mappings":"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","sourcesContent":["import { SubmissionTypes } from '@oneblink/types'\nimport { getRequest, HTTPError, deleteRequest } from '../fetch'\nimport { isLoggedIn } from '../../auth-service'\nimport { getDeviceInformation } from '../getDeviceInformation'\nimport OneBlinkAppsError from '../errors/oneBlinkAppsError'\nimport tenants from '../../tenants'\nimport { getUserToken } from '../user-token'\nimport Sentry from '../../Sentry'\nimport prepareSubmissionData from '../prepareSubmissionData'\nimport { DraftSubmission, ProgressListener } from '../../types/submissions'\nimport generateOneBlinkUploader from '../generateOneBlinkUploader'\nimport { OneBlinkStorageError } from '@oneblink/storage'\nimport generateOneBlinkDownloader from '../generateOneBlinkDownloader'\n\nasync function uploadDraftData(\n draftSubmission: DraftSubmission,\n onProgress?: ProgressListener,\n abortSignal?: AbortSignal,\n) {\n try {\n const submission = await prepareSubmissionData(draftSubmission)\n const oneblinkUploader = generateOneBlinkUploader()\n const userToken = getUserToken()\n console.log('Attempting to upload draft data')\n return await oneblinkUploader.uploadFormSubmissionDraft({\n submission,\n definition: draftSubmission.definition,\n device: getDeviceInformation(),\n userToken: userToken || undefined,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n jobId: draftSubmission.jobId,\n formsAppId: draftSubmission.formsAppId,\n externalId: draftSubmission.externalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance?.taskGroupInstanceId,\n formSubmissionDraftId: draftSubmission.formSubmissionDraftId,\n createdAt: draftSubmission.createdAt,\n title: draftSubmission.title,\n lastElementUpdated: draftSubmission.lastElementUpdated,\n sectionState: draftSubmission.sectionState,\n previousElapsedDurationSeconds:\n draftSubmission.previousElapsedDurationSeconds,\n onProgress,\n abortSignal,\n })\n } catch (error) {\n console.warn('Error occurred while attempting to upload draft data', error)\n Sentry.captureException(error)\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot save drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n requiresLogin: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting upload a draft for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Application',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error instanceof Error ? error : undefined,\n },\n )\n }\n}\n\nasync function getFormSubmissionDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<SubmissionTypes.FormSubmissionDraft[]> {\n if (!isLoggedIn()) {\n console.log(\n 'Could not retrieve drafts from API as the current user is not logged in.',\n )\n return []\n }\n\n const url = new URL('/form-submission-drafts', tenants.current.apiOrigin)\n url.searchParams.append('formsAppId', formsAppId.toString())\n url.searchParams.append('isSubmitted', 'false')\n console.log('Attempting to retrieve drafts from API', url.href)\n\n try {\n const { formSubmissionDrafts } = await getRequest<{\n formSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n }>(url.href, abortSignal)\n return formSubmissionDrafts\n } catch (err) {\n console.warn(\n 'Error occurred while attempting to retrieve drafts from API',\n err,\n )\n if (err instanceof OneBlinkAppsError) {\n throw err\n }\n\n const error = err as HTTPError\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve your drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting retrieve drafts for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Error Syncing Drafts',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n },\n )\n }\n }\n }\n}\n\nasync function downloadDraftData(\n formSubmissionDraftVersionId: string,\n abortSignal?: AbortSignal,\n) {\n try {\n console.log('Attempting to download draft form data:', {\n formSubmissionDraftVersionId,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const data = await oneblinkDownloader.downloadDraftSubmission({\n formSubmissionDraftVersionId,\n abortSignal,\n })\n if (!data) {\n throw new OneBlinkAppsError(\n \"Data has been removed based on your administrator's draft data retention policy.\",\n {\n title: 'Draft Data Unavailable',\n },\n )\n }\n return data\n } catch (error) {\n console.error(\n 'Error occurred while attempting to download draft data',\n error,\n )\n\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.httpStatusCode,\n })\n }\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve draft data until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresAccessRequest: true,\n },\n )\n }\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the draft your attempting retrieve. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Draft',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n title: 'Unexpected Error',\n originalError: error instanceof Error ? error : undefined,\n httpStatusCode:\n error instanceof OneBlinkStorageError\n ? error.httpStatusCode\n : undefined,\n },\n )\n }\n}\n\nasync function deleteFormSubmissionDraft(\n formSubmissionDraftId: string,\n abortSignal?: AbortSignal,\n) {\n const url = `${tenants.current.apiOrigin}/form-submission-drafts/${formSubmissionDraftId}`\n console.log('Attempting to delete form submission draft remotely', url)\n try {\n await deleteRequest(url, abortSignal)\n } catch (error) {\n console.warn(\n 'Error occurred while attempting to delete a draft from API',\n error,\n )\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof HTTPError) {\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot delete drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n case 404: {\n console.warn(\n 'Remote draft does not exist, we will assume it has already been deleted.',\n formSubmissionDraftId,\n error,\n )\n return\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error as Error,\n },\n )\n }\n}\n\nexport {\n uploadDraftData,\n getFormSubmissionDrafts,\n downloadDraftData,\n deleteFormSubmissionDraft,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../../src/apps/services/api/drafts.ts"],"names":[],"mappings":"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","sourcesContent":["import { SubmissionTypes } from '@oneblink/types'\nimport { getRequest, HTTPError, deleteRequest } from '../fetch'\nimport { isLoggedIn } from '../../auth-service'\nimport { getDeviceInformation } from '../getDeviceInformation'\nimport OneBlinkAppsError from '../errors/oneBlinkAppsError'\nimport tenants from '../../tenants'\nimport { getUserToken } from '../user-token'\nimport Sentry from '../../Sentry'\nimport prepareSubmissionData from '../prepareSubmissionData'\nimport { DraftSubmission, ProgressListener } from '../../types/submissions'\nimport generateOneBlinkUploader from '../generateOneBlinkUploader'\nimport { OneBlinkStorageError } from '@oneblink/storage'\nimport generateOneBlinkDownloader from '../generateOneBlinkDownloader'\n\nexport const DRAFT_DATA_UNAVAILABLE_ERROR_TITLE = 'Draft Data Unavailable'\n\nasync function uploadDraftData(\n draftSubmission: DraftSubmission,\n onProgress?: ProgressListener,\n abortSignal?: AbortSignal,\n) {\n try {\n const submission = await prepareSubmissionData(draftSubmission)\n const oneblinkUploader = generateOneBlinkUploader()\n const userToken = getUserToken()\n console.log('Attempting to upload draft data')\n return await oneblinkUploader.uploadFormSubmissionDraft({\n submission,\n definition: draftSubmission.definition,\n device: getDeviceInformation(),\n userToken: userToken || undefined,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n jobId: draftSubmission.jobId,\n formsAppId: draftSubmission.formsAppId,\n externalId: draftSubmission.externalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance?.taskGroupInstanceId,\n formSubmissionDraftId: draftSubmission.formSubmissionDraftId,\n createdAt: draftSubmission.createdAt,\n title: draftSubmission.title,\n lastElementUpdated: draftSubmission.lastElementUpdated,\n sectionState: draftSubmission.sectionState,\n previousElapsedDurationSeconds:\n draftSubmission.previousElapsedDurationSeconds,\n onProgress,\n abortSignal,\n })\n } catch (error) {\n console.warn('Error occurred while attempting to upload draft data', error)\n Sentry.captureException(error)\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot save drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n requiresLogin: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting upload a draft for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Application',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error instanceof Error ? error : undefined,\n },\n )\n }\n}\n\nasync function getFormSubmissionDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<SubmissionTypes.FormSubmissionDraft[]> {\n if (!isLoggedIn()) {\n console.log(\n 'Could not retrieve drafts from API as the current user is not logged in.',\n )\n return []\n }\n\n const url = new URL('/form-submission-drafts', tenants.current.apiOrigin)\n url.searchParams.append('formsAppId', formsAppId.toString())\n url.searchParams.append('isSubmitted', 'false')\n console.log('Attempting to retrieve drafts from API', url.href)\n\n try {\n const { formSubmissionDrafts } = await getRequest<{\n formSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n }>(url.href, abortSignal)\n return formSubmissionDrafts\n } catch (err) {\n console.warn(\n 'Error occurred while attempting to retrieve drafts from API',\n err,\n )\n if (err instanceof OneBlinkAppsError) {\n throw err\n }\n\n const error = err as HTTPError\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve your drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting retrieve drafts for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Error Syncing Drafts',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n },\n )\n }\n }\n }\n}\n\nasync function downloadDraftData(\n formSubmissionDraftVersionId: string,\n abortSignal?: AbortSignal,\n) {\n try {\n console.log('Attempting to download draft form data:', {\n formSubmissionDraftVersionId,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const data = await oneblinkDownloader.downloadDraftSubmission({\n formSubmissionDraftVersionId,\n abortSignal,\n })\n if (!data) {\n throw new OneBlinkAppsError(\n \"Data has been removed based on your administrator's draft data retention policy.\",\n {\n title: DRAFT_DATA_UNAVAILABLE_ERROR_TITLE,\n },\n )\n }\n return data\n } catch (error) {\n console.error(\n 'Error occurred while attempting to download draft data',\n error,\n )\n\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.httpStatusCode,\n })\n }\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve draft data until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresAccessRequest: true,\n },\n )\n }\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the draft your attempting retrieve. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Draft',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n title: 'Unexpected Error',\n originalError: error instanceof Error ? error : undefined,\n httpStatusCode:\n error instanceof OneBlinkStorageError\n ? error.httpStatusCode\n : undefined,\n },\n )\n }\n}\n\nasync function deleteFormSubmissionDraft(\n formSubmissionDraftId: string,\n abortSignal?: AbortSignal,\n) {\n const url = `${tenants.current.apiOrigin}/form-submission-drafts/${formSubmissionDraftId}`\n console.log('Attempting to delete form submission draft remotely', url)\n try {\n await deleteRequest(url, abortSignal)\n } catch (error) {\n console.warn(\n 'Error occurred while attempting to delete a draft from API',\n error,\n )\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof HTTPError) {\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot delete drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n case 404: {\n console.warn(\n 'Remote draft does not exist, we will assume it has already been deleted.',\n formSubmissionDraftId,\n error,\n )\n return\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error as Error,\n },\n )\n }\n}\n\nexport {\n uploadDraftData,\n getFormSubmissionDrafts,\n downloadDraftData,\n deleteFormSubmissionDraft,\n}\n"]}
|
|
@@ -86,14 +86,17 @@ export type LocalFormSubmissionDraft = Omit<SubmissionTypes.FormSubmissionDraft,
|
|
|
86
86
|
* remotely yet.
|
|
87
87
|
*/
|
|
88
88
|
versions: SubmissionTypes.FormSubmissionDraftVersion[] | undefined;
|
|
89
|
-
/**
|
|
90
|
-
* The draft submission data. `undefined` if it has not been downloaded
|
|
91
|
-
* locally yet.
|
|
92
|
-
*/
|
|
93
|
-
draftSubmission: DraftSubmission | undefined;
|
|
94
89
|
/** `true` if the draft was created by a public user (not logged in). */
|
|
95
90
|
isPublic?: boolean;
|
|
96
|
-
}
|
|
91
|
+
} & ({
|
|
92
|
+
downloadStatus: 'PENDING' | 'DOWNLOADING' | 'NOT_AVAILABLE';
|
|
93
|
+
} | {
|
|
94
|
+
downloadStatus: 'ERROR';
|
|
95
|
+
downloadError: string;
|
|
96
|
+
} | {
|
|
97
|
+
downloadStatus: 'SUCCESS';
|
|
98
|
+
draftSubmission: DraftSubmission;
|
|
99
|
+
});
|
|
97
100
|
export type FormSubmission = NewFormSubmission & BaseFormSubmission & {
|
|
98
101
|
/** The id of the Forms App submitting for */
|
|
99
102
|
formsAppId?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submissions.js","sourceRoot":"","sources":["../../../src/apps/types/submissions.ts"],"names":[],"mappings":"","sourcesContent":["import {\n FormTypes,\n SubmissionEventTypes,\n SubmissionTypes,\n ScheduledTasksTypes,\n} from '@oneblink/types'\nimport { FormElement } from '@oneblink/types/typescript/forms'\n\nexport { ProgressListener, ProgressListenerEvent } from '@oneblink/storage'\n\nexport type BaseNewFormSubmission = {\n /** The submission data */\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** The form definition when the draft was saved */\n definition: FormTypes.Form\n}\n\nexport type NewDraftSubmission = BaseNewFormSubmission & {\n /**\n * Set to true if the submission should be uploaded in the background, false\n * or undefined if the submission should be uploaded immediately\n */\n backgroundUpload?: boolean\n /** The element that was last updated before the draft was saved */\n lastElementUpdated?: FormElement\n /** The state of sections before the draft was saved */\n sectionState?: SubmissionTypes.NewS3SubmissionData['sectionState']\n /**\n * The elapsed duration in seconds the user took to complete the submission\n * before the draft was saved\n */\n\n previousElapsedDurationSeconds?: SubmissionTypes.NewS3SubmissionData['previousElapsedDurationSeconds']\n}\n\nexport type NewFormSubmission = BaseNewFormSubmission & {\n /** The reCAPTCHA tokens to validate the submission */\n recaptchas?: Array<{\n /** The site key that was used to generate the reCAPTCHA token */\n siteKey: string\n /** A reCAPTCHA token */\n token: string\n }>\n}\n\nexport type BaseFormSubmission = {\n /** The id of the job to submit */\n jobId?: string\n /** The id of the Forms App submitting for */\n externalId?: string\n /**\n * The id of the previous form submission approval id. Only used when the form\n * submission is in response to `CLARIFICATION_REQUIRED` approval.\n */\n previousFormSubmissionApprovalId?: string\n /**\n * Will have a value if the user was attempting to complete a scheduled task\n * via a form submission\n */\n taskCompletion?: {\n /** The task */\n task: ScheduledTasksTypes.Task\n /** The task action */\n taskAction: ScheduledTasksTypes.TaskAction\n /** The task group */\n taskGroup: ScheduledTasksTypes.TaskGroup | undefined\n /** The task group instance */\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance | undefined\n /**\n * The URL to redirect the user to after completing the task via form\n * submission\n */\n redirectUrl: string\n }\n}\n\nexport type DraftSubmissionInput = NewDraftSubmission &\n BaseFormSubmission & {\n /** The id of the Forms App submitting for */\n formsAppId: number\n /** The title input by a user to identify the draft. */\n title: string\n }\n\nexport type DraftSubmission = DraftSubmissionInput & {\n /**\n * The date and time (in ISO format) when this version of the draft was\n * created.\n */\n createdAt: string\n /**\n * The identifier for the parent draft record. Created client side to store\n * the draft locally for offline capability\n */\n formSubmissionDraftId: string\n}\n\nexport type LocalFormSubmissionDraft = Omit<\n SubmissionTypes.FormSubmissionDraft,\n 'id' | 'versions'\n> & {\n /**\n * The versions of the draft data. `undefined` if it has not been uploaded\n * remotely yet.\n */\n versions: SubmissionTypes.FormSubmissionDraftVersion[] | undefined\n
|
|
1
|
+
{"version":3,"file":"submissions.js","sourceRoot":"","sources":["../../../src/apps/types/submissions.ts"],"names":[],"mappings":"","sourcesContent":["import {\n FormTypes,\n SubmissionEventTypes,\n SubmissionTypes,\n ScheduledTasksTypes,\n} from '@oneblink/types'\nimport { FormElement } from '@oneblink/types/typescript/forms'\n\nexport { ProgressListener, ProgressListenerEvent } from '@oneblink/storage'\n\nexport type BaseNewFormSubmission = {\n /** The submission data */\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** The form definition when the draft was saved */\n definition: FormTypes.Form\n}\n\nexport type NewDraftSubmission = BaseNewFormSubmission & {\n /**\n * Set to true if the submission should be uploaded in the background, false\n * or undefined if the submission should be uploaded immediately\n */\n backgroundUpload?: boolean\n /** The element that was last updated before the draft was saved */\n lastElementUpdated?: FormElement\n /** The state of sections before the draft was saved */\n sectionState?: SubmissionTypes.NewS3SubmissionData['sectionState']\n /**\n * The elapsed duration in seconds the user took to complete the submission\n * before the draft was saved\n */\n\n previousElapsedDurationSeconds?: SubmissionTypes.NewS3SubmissionData['previousElapsedDurationSeconds']\n}\n\nexport type NewFormSubmission = BaseNewFormSubmission & {\n /** The reCAPTCHA tokens to validate the submission */\n recaptchas?: Array<{\n /** The site key that was used to generate the reCAPTCHA token */\n siteKey: string\n /** A reCAPTCHA token */\n token: string\n }>\n}\n\nexport type BaseFormSubmission = {\n /** The id of the job to submit */\n jobId?: string\n /** The id of the Forms App submitting for */\n externalId?: string\n /**\n * The id of the previous form submission approval id. Only used when the form\n * submission is in response to `CLARIFICATION_REQUIRED` approval.\n */\n previousFormSubmissionApprovalId?: string\n /**\n * Will have a value if the user was attempting to complete a scheduled task\n * via a form submission\n */\n taskCompletion?: {\n /** The task */\n task: ScheduledTasksTypes.Task\n /** The task action */\n taskAction: ScheduledTasksTypes.TaskAction\n /** The task group */\n taskGroup: ScheduledTasksTypes.TaskGroup | undefined\n /** The task group instance */\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance | undefined\n /**\n * The URL to redirect the user to after completing the task via form\n * submission\n */\n redirectUrl: string\n }\n}\n\nexport type DraftSubmissionInput = NewDraftSubmission &\n BaseFormSubmission & {\n /** The id of the Forms App submitting for */\n formsAppId: number\n /** The title input by a user to identify the draft. */\n title: string\n }\n\nexport type DraftSubmission = DraftSubmissionInput & {\n /**\n * The date and time (in ISO format) when this version of the draft was\n * created.\n */\n createdAt: string\n /**\n * The identifier for the parent draft record. Created client side to store\n * the draft locally for offline capability\n */\n formSubmissionDraftId: string\n}\n\nexport type LocalFormSubmissionDraft = Omit<\n SubmissionTypes.FormSubmissionDraft,\n 'id' | 'versions'\n> & {\n /**\n * The versions of the draft data. `undefined` if it has not been uploaded\n * remotely yet.\n */\n versions: SubmissionTypes.FormSubmissionDraftVersion[] | undefined\n /** `true` if the draft was created by a public user (not logged in). */\n isPublic?: boolean\n} & (\n | {\n downloadStatus: 'PENDING' | 'DOWNLOADING' | 'NOT_AVAILABLE'\n }\n | {\n downloadStatus: 'ERROR'\n downloadError: string\n }\n | {\n downloadStatus: 'SUCCESS'\n draftSubmission: DraftSubmission\n }\n )\n\nexport type FormSubmission = NewFormSubmission &\n BaseFormSubmission & {\n /** The id of the Forms App submitting for */\n formsAppId?: number\n /** The id of the draft to clean up after successful submission */\n formSubmissionDraftId?: string\n /** The id of the prefill data to clean up after successful submission */\n preFillFormDataId: string | null\n }\n\nexport type FormSubmissionResult = FormSubmission & {\n /**\n * The identifier that represents the submission. `null` if the form\n * submission was unsuccessful\n */\n submissionId: string | null\n /**\n * The timestamp the form was submitted, `null` if the form submission was\n * unsuccessful\n */\n submissionTimestamp: string | null\n /** `null` if the form submission does not require a payment */\n payment: {\n /** The amount required to pay */\n amount: number\n /** The URL to redirect the user to after payment to display a receipt */\n paymentReceiptUrl: string\n /**\n * The URL to redirect the user to to make a payment for a form hosted by\n * customer instead of payment provider\n */\n paymentFormUrl: string | undefined\n /** The URL to redirect the user to to complete the payment process */\n hostedFormUrl: string\n /** The payment submission event */\n submissionEvent: SubmissionEventTypes.FormPaymentEvent\n } | null\n /** `null` if the form submission does not require a booking */\n scheduling: {\n /** The URL to redirect the user to to complete the booking process */\n bookingUrl: string\n /** The scheduling submission event */\n submissionEvent: SubmissionEventTypes.FormSchedulingEvent\n } | null\n /**\n * `true` if the submission was not submitted yet and was added to the pending\n * queue\n */\n isInPendingQueue: boolean\n /** `true` if the submission was attempted offline */\n isOffline: boolean\n /** True if the submission was attempted whilst attachments were uploading */\n isUploadingAttachments: boolean\n /** Exists if the form allows PDF download */\n /**\n * @deprecated Only returned when legacy post submission download\n * configuration is in use. For non legacy configured forms, use\n * `downloadSubmissionPdfs` instead.\n */\n downloadSubmissionPdfUrl?: string\n\n downloadSubmissionPdfs?: Array<{\n id: string\n configuration: SubmissionEventTypes.PDFConfiguration\n url: string\n }>\n /** The access token to download post-submission attachment urls and metadata. */\n attachmentsAccessToken?: string\n}\n\nexport type PendingFormSubmission = FormSubmission & {\n /** The date and time (in ISO format) the submission was attempted */\n pendingTimestamp: string\n /** `true` if the submission is currently being processed by the pending queue */\n isSubmitting?: boolean\n /** `true` if the submission is currently being edited */\n isEditing?: boolean\n /**\n * An error message that might be set while attempting to process the\n * submission in the pending queue\n */\n error?: string\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
export declare function Clickable(props: React.ComponentProps<'div'> & {
|
|
2
|
+
export declare function Clickable({ disabled, onClick, ...props }: React.ComponentProps<'div'> & {
|
|
3
3
|
disabled?: boolean;
|
|
4
4
|
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import clsx from 'clsx';
|
|
4
|
-
export function Clickable(props) {
|
|
4
|
+
export function Clickable({ disabled, onClick, ...props }) {
|
|
5
5
|
const ref = React.useRef(null);
|
|
6
|
-
return (_jsx("div", { ...props, role: "button", tabIndex:
|
|
7
|
-
var _a
|
|
6
|
+
return (_jsx("div", { ...props, onClick: disabled ? undefined : onClick, role: "button", tabIndex: disabled ? -1 : 0, ref: ref, onKeyDown: (event) => {
|
|
7
|
+
var _a;
|
|
8
|
+
if (disabled)
|
|
9
|
+
return;
|
|
8
10
|
if (ref.current === event.target &&
|
|
9
11
|
(event.key === 'Enter' || event.key === ' ')) {
|
|
10
|
-
|
|
12
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
11
13
|
}
|
|
12
|
-
(
|
|
14
|
+
(_a = props.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(props, event);
|
|
13
15
|
}, className: clsx(props.className, {
|
|
14
|
-
'is-clickable': !
|
|
15
|
-
}), "aria-disabled":
|
|
16
|
+
'is-clickable': !disabled,
|
|
17
|
+
}), "aria-disabled": disabled }));
|
|
16
18
|
}
|
|
17
19
|
//# sourceMappingURL=Clickable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Clickable.js","sourceRoot":"","sources":["../../src/components/Clickable.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,UAAU,SAAS,
|
|
1
|
+
{"version":3,"file":"Clickable.js","sourceRoot":"","sources":["../../src/components/Clickable.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,UAAU,SAAS,CAAC,EACxB,QAAQ,EACR,OAAO,EACP,GAAG,KAAK,EAGT;IACC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAA;IAC9C,OAAO,CACL,iBACM,KAAK,EACT,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EACvC,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;;YACnB,IAAI,QAAQ;gBAAE,OAAM;YACpB,IACE,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM;gBAC5B,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,EAC5C,CAAC;gBACD,OAAO,aAAP,OAAO,uBAAP,OAAO,CACL,KAAgE,CACjE,CAAA;YACH,CAAC;YACD,MAAA,KAAK,CAAC,SAAS,sDAAG,KAAK,CAAC,CAAA;QAC1B,CAAC,EACD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YAC/B,cAAc,EAAE,CAAC,QAAQ;SAC1B,CAAC,mBACa,QAAQ,GACvB,CACH,CAAA;AACH,CAAC","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\n\nexport function Clickable({\n disabled,\n onClick,\n ...props\n}: React.ComponentProps<'div'> & {\n disabled?: boolean\n}) {\n const ref = React.useRef<HTMLDivElement>(null)\n return (\n <div\n {...props}\n onClick={disabled ? undefined : onClick}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n ref={ref}\n onKeyDown={(event) => {\n if (disabled) return\n if (\n ref.current === event.target &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n onClick?.(\n event as unknown as React.MouseEvent<HTMLDivElement, MouseEvent>,\n )\n }\n props.onKeyDown?.(event)\n }}\n className={clsx(props.className, {\n 'is-clickable': !disabled,\n })}\n aria-disabled={disabled}\n />\n )\n}\n"]}
|
package/dist/hooks/useDrafts.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDrafts.js","sourceRoot":"","sources":["../../src/hooks/useDrafts.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { draftService, submissionService } from '../apps'\nimport useAuth from './useAuth'\nimport useIsMounted from './useIsMounted'\nimport useIsOffline from './useIsOffline'\n\n/** The value returned from `useDrafts()` hook */\nexport type DraftsContextValue = {\n /** `true` if drafts are currently loading for the first time. */\n isLoading: boolean\n /** The incomplete submissions that were saved for later */\n drafts: draftService.LocalFormSubmissionDraft[]\n /** `true` drafts are syncing with other devices */\n isSyncing: boolean\n /**\n * The date when the sync process last completed successfully, will be `null`\n * until it has completed the first time.\n */\n lastSyncTime: Date | null\n /** A function to trigger syncing of the drafts */\n syncDrafts: (abortSignal: AbortSignal | undefined) => Promise<void>\n /** An Error object if syncing drafts fails */\n syncError: Error | null\n /** A function to clear Error object from syncing drafts */\n clearSyncError: () => void\n /** A function to remove a draft */\n deleteDraft: (formSubmissionDraftId: string) => Promise<void>\n}\n\nconst DraftsContext = React.createContext<DraftsContextValue | undefined>(\n undefined,\n)\n\n/**\n * React Component that provides the context for the `useDrafts()` hook to be\n * used by components further down your component tree. **It should only be\n * included in your component tree once and ideally at the root of the\n * application.**\n *\n * #### Example\n *\n * ```jsx\n * import * as React from 'react'\n * import { DraftsContextProvider, useDrafts } from '@oneblink/apps-react'\n *\n * function Component() {\n * const draftsContext = useDrafts()\n * // use drafts here\n * }\n *\n * function App() {\n * return (\n * <DraftsContextProvider>\n * <Component />\n * </DraftsContextProvider>\n * )\n * }\n *\n * const root = document.getElementById('root')\n * if (root) {\n * ReactDOM.render(<App />, root)\n * }\n * ```\n *\n * @param props\n * @returns\n * @group Components\n */\nexport function DraftsContextProvider({\n /** The identifier for the forms app associated with the user's drafts */\n formsAppId,\n /**\n * `true` if drafts are enabled, otherwise `false`. Can be used for account\n * tier validation.\n */\n isDraftsEnabled,\n /** Your application components */\n children,\n}: {\n formsAppId: number\n isDraftsEnabled: boolean\n children: React.ReactNode\n}) {\n const isMounted = useIsMounted()\n const isOffline = useIsOffline()\n const { isUsingFormsKey } = useAuth()\n\n const [syncState, setSyncState] = React.useState<{\n lastSyncTime: Date | null\n isSyncing: boolean\n syncError: Error | null\n }>({\n lastSyncTime: null,\n isSyncing: false,\n syncError: null,\n })\n const clearSyncError = React.useCallback(() => {\n setSyncState((currentState) => ({\n ...currentState,\n syncError: null,\n }))\n }, [])\n const syncDrafts = React.useCallback(\n async (abortSignal: AbortSignal | undefined) => {\n if (!isDraftsEnabled || isUsingFormsKey) {\n return\n }\n\n if (isMounted.current) {\n setSyncState((currentState) => ({\n ...currentState,\n isSyncing: true,\n syncError: null,\n }))\n }\n\n let newError = null\n\n try {\n await draftService.syncDrafts({\n formsAppId,\n throwError: true,\n abortSignal,\n })\n } catch (error) {\n newError = error as Error\n }\n\n if (isMounted.current) {\n setSyncState({\n lastSyncTime: new Date(),\n isSyncing: false,\n syncError: newError,\n })\n }\n },\n [formsAppId, isDraftsEnabled, isMounted, isUsingFormsKey],\n )\n\n const [drafts, setDrafts] = React.useState<\n draftService.LocalFormSubmissionDraft[] | null\n >(null)\n\n const deleteDraft = React.useCallback(\n (draftId: string) => {\n return draftService.deleteDraft(draftId, formsAppId)\n },\n [formsAppId],\n )\n\n const value = React.useMemo<DraftsContextValue>(\n () => ({\n // Sync\n syncDrafts,\n isSyncing: syncState.isSyncing,\n syncError: syncState.syncError,\n lastSyncTime: syncState.lastSyncTime,\n clearSyncError,\n // Load\n isLoading: !drafts,\n drafts: drafts || [],\n // Delete,\n deleteDraft,\n }),\n [\n syncDrafts,\n syncState.isSyncing,\n syncState.syncError,\n syncState.lastSyncTime,\n clearSyncError,\n drafts,\n deleteDraft,\n ],\n )\n\n React.useEffect(() => {\n const abortController = new AbortController()\n const unregisterPendingQueueListener =\n submissionService.registerPendingQueueListener(() =>\n syncDrafts(undefined),\n )\n const unregisterDraftsListener =\n draftService.registerDraftsListener(setDrafts)\n return () => {\n abortController.abort()\n unregisterPendingQueueListener()\n unregisterDraftsListener()\n }\n }, [syncDrafts])\n\n React.useEffect(() => {\n if (!isOffline) {\n const abortController = new AbortController()\n syncDrafts(abortController.signal)\n return () => {\n abortController.abort()\n }\n }\n }, [isOffline, syncDrafts])\n\n return (\n <DraftsContext.Provider value={value}>{children}</DraftsContext.Provider>\n )\n}\n\n/**\n * React hook to get the context value for Drafts. Will throw an Error if used\n * outside of the `<DraftsContextProvider />` component.\n *\n * @returns\n * @group Hooks\n */\nexport default function useDrafts(): DraftsContextValue {\n const value = React.useContext(DraftsContext)\n if (!value) {\n throw new Error(\n `\"useDrafts\" hook was used outside of the \"<DraftsContextProvider />\" component's children.`,\n )\n }\n return value\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useDrafts.js","sourceRoot":"","sources":["../../src/hooks/useDrafts.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { draftService, submissionService } from '../apps'\nimport useAuth from './useAuth'\nimport useIsMounted from './useIsMounted'\nimport useIsOffline from './useIsOffline'\n\n/** The value returned from `useDrafts()` hook */\nexport type DraftsContextValue = {\n /** `true` if drafts are currently loading for the first time. */\n isLoading: boolean\n /** The incomplete submissions that were saved for later */\n drafts: draftService.LocalFormSubmissionDraft[]\n /** `true` drafts are syncing with other devices */\n isSyncing: boolean\n /**\n * The date when the sync process last completed successfully, will be `null`\n * until it has completed the first time.\n */\n lastSyncTime: Date | null\n /** A function to trigger syncing of the drafts */\n syncDrafts: (abortSignal: AbortSignal | undefined) => Promise<void>\n /** An Error object if syncing drafts fails */\n syncError: Error | null\n /** A function to clear Error object from syncing drafts */\n clearSyncError: () => void\n /** A function to remove a draft */\n deleteDraft: (formSubmissionDraftId: string) => Promise<void>\n}\n\nconst DraftsContext = React.createContext<DraftsContextValue | undefined>(\n undefined,\n)\n\n/**\n * React Component that provides the context for the `useDrafts()` hook to be\n * used by components further down your component tree. **It should only be\n * included in your component tree once and ideally at the root of the\n * application.**\n *\n * #### Example\n *\n * ```jsx\n * import * as React from 'react'\n * import { DraftsContextProvider, useDrafts } from '@oneblink/apps-react'\n *\n * function Component() {\n * const draftsContext = useDrafts()\n * // use drafts here\n * }\n *\n * function App() {\n * return (\n * <DraftsContextProvider>\n * <Component />\n * </DraftsContextProvider>\n * )\n * }\n *\n * const root = document.getElementById('root')\n * if (root) {\n * ReactDOM.render(<App />, root)\n * }\n * ```\n *\n * @param props\n * @returns\n * @group Components\n */\nexport function DraftsContextProvider({\n /** The identifier for the forms app associated with the user's drafts */\n formsAppId,\n /**\n * `true` if drafts are enabled, otherwise `false`. Can be used for account\n * tier validation.\n */\n isDraftsEnabled,\n /** Your application components */\n children,\n}: {\n formsAppId: number\n isDraftsEnabled: boolean\n children: React.ReactNode\n}) {\n const isMounted = useIsMounted()\n const isOffline = useIsOffline()\n const { isUsingFormsKey } = useAuth()\n\n const [syncState, setSyncState] = React.useState<{\n lastSyncTime: Date | null\n isSyncing: boolean\n syncError: Error | null\n }>({\n lastSyncTime: null,\n isSyncing: false,\n syncError: null,\n })\n const clearSyncError = React.useCallback(() => {\n setSyncState((currentState) => ({\n ...currentState,\n syncError: null,\n }))\n }, [])\n // TODO add formId to prioritize downloads for specific forms\n const syncDrafts = React.useCallback(\n async (abortSignal: AbortSignal | undefined) => {\n if (!isDraftsEnabled || isUsingFormsKey) {\n return\n }\n\n if (isMounted.current) {\n setSyncState((currentState) => ({\n ...currentState,\n isSyncing: true,\n syncError: null,\n }))\n }\n\n let newError = null\n\n try {\n await draftService.syncDrafts({\n formsAppId,\n throwError: true,\n abortSignal,\n })\n } catch (error) {\n newError = error as Error\n }\n\n if (isMounted.current) {\n setSyncState({\n lastSyncTime: new Date(),\n isSyncing: false,\n syncError: newError,\n })\n }\n },\n [formsAppId, isDraftsEnabled, isMounted, isUsingFormsKey],\n )\n\n const [drafts, setDrafts] = React.useState<\n draftService.LocalFormSubmissionDraft[] | null\n >(null)\n\n const deleteDraft = React.useCallback(\n (draftId: string) => {\n return draftService.deleteDraft(draftId, formsAppId)\n },\n [formsAppId],\n )\n\n const value = React.useMemo<DraftsContextValue>(\n () => ({\n // Sync\n syncDrafts,\n isSyncing: syncState.isSyncing,\n syncError: syncState.syncError,\n lastSyncTime: syncState.lastSyncTime,\n clearSyncError,\n // Load\n isLoading: !drafts,\n drafts: drafts || [],\n // Delete,\n deleteDraft,\n }),\n [\n syncDrafts,\n syncState.isSyncing,\n syncState.syncError,\n syncState.lastSyncTime,\n clearSyncError,\n drafts,\n deleteDraft,\n ],\n )\n\n React.useEffect(() => {\n const abortController = new AbortController()\n const unregisterPendingQueueListener =\n submissionService.registerPendingQueueListener(() =>\n syncDrafts(undefined),\n )\n const unregisterDraftsListener =\n draftService.registerDraftsListener(setDrafts)\n return () => {\n abortController.abort()\n unregisterPendingQueueListener()\n unregisterDraftsListener()\n }\n }, [syncDrafts])\n\n React.useEffect(() => {\n if (!isOffline) {\n const abortController = new AbortController()\n syncDrafts(abortController.signal)\n return () => {\n abortController.abort()\n }\n }\n }, [isOffline, syncDrafts])\n\n return (\n <DraftsContext.Provider value={value}>{children}</DraftsContext.Provider>\n )\n}\n\n/**\n * React hook to get the context value for Drafts. Will throw an Error if used\n * outside of the `<DraftsContextProvider />` component.\n *\n * @returns\n * @group Hooks\n */\nexport default function useDrafts(): DraftsContextValue {\n const value = React.useContext(DraftsContext)\n if (!value) {\n throw new Error(\n `\"useDrafts\" hook was used outside of the \"<DraftsContextProvider />\" component's children.`,\n )\n }\n return value\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oneblink/apps-react",
|
|
3
3
|
"description": "Helper functions for OneBlink apps in ReactJS.",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "10.0.0-beta.1",
|
|
5
5
|
"author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/oneblink/apps-react/issues"
|