@oneblink/apps-react 13.0.0-beta.6 → 13.0.0-beta.7

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.
@@ -214,15 +214,18 @@ declare function executePostSubmissionAction(submissionResult: FormSubmissionRes
214
214
  * })
215
215
  * ```
216
216
  *
217
- * @param formId
218
- * @param submissionId
219
- * @param abortSignal
217
+ * @param options
218
+ * @param options.formId
219
+ * @param options.submissionId
220
+ * @param options.abortSignal
221
+ * @param options.versionId
220
222
  * @returns
221
223
  */
222
- declare function getSubmissionData({ formId, submissionId, abortSignal, }: {
224
+ declare function getSubmissionData({ formId, submissionId, abortSignal, versionId, }: {
223
225
  formId: number;
224
226
  submissionId: string;
225
227
  abortSignal?: AbortSignal;
228
+ versionId?: string;
226
229
  }): Promise<{
227
230
  data: SubmissionTypes.S3SubmissionData;
228
231
  versionId: string | undefined;
@@ -409,16 +409,19 @@ async function executeAction(submissionResult, { action, redirectUrl, onRedirect
409
409
  * })
410
410
  * ```
411
411
  *
412
- * @param formId
413
- * @param submissionId
414
- * @param abortSignal
412
+ * @param options
413
+ * @param options.formId
414
+ * @param options.submissionId
415
+ * @param options.abortSignal
416
+ * @param options.versionId
415
417
  * @returns
416
418
  */
417
- async function getSubmissionData({ formId, submissionId, abortSignal, }) {
419
+ async function getSubmissionData({ formId, submissionId, abortSignal, versionId, }) {
418
420
  return await downloadFormSubmission({
419
421
  formId,
420
422
  submissionId,
421
423
  abortSignal,
424
+ versionId,
422
425
  });
423
426
  }
424
427
  export { submit, executePostSubmissionAction, executeCancelAction, goBackOrCloseWindow, getPendingQueueSubmissions, deletePendingQueueSubmission, editPendingQueueSubmission, cancelEditingPendingQueueSubmission, registerPendingQueueListener, processPendingQueue, registerPendingQueueAttachmentProgressListener, registerPendingQueueProgressListener, getSubmissionData, uploadFormSubmissionEdit, getPostSubmissionAttachments, };
@@ -1 +1 @@
1
- {"version":3,"file":"submission-service.js","sourceRoot":"","sources":["../../src/apps/submission-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { isOffline } from './offline-service'\nimport { getFormsKeyId, isLoggedIn } from './auth-service'\nimport {\n registerPendingQueueListener,\n getPendingQueueSubmissions,\n updatePendingQueueSubmission,\n cancelEditingPendingQueueSubmission,\n deletePendingQueueSubmission,\n editPendingQueueSubmission,\n registerPendingQueueAttachmentProgressListener,\n registerPendingQueueProgressListener,\n executePendingQueueProgressListeners,\n removePendingQueueSubmission,\n PendingQueueListener,\n PendingQueueAction,\n} from './services/pending-queue'\nimport replaceInjectablesWithSubmissionValues from './services/replaceInjectablesWithSubmissionValues'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport Sentry from './Sentry'\nimport prepareSubmissionData from './services/prepareSubmissionData'\nimport submitForm, {\n SubmissionParams,\n ProgressListener,\n ProgressListenerEvent,\n} from './services/submit'\nimport {\n PendingFormSubmission,\n FormSubmission,\n FormSubmissionResult,\n BaseFormSubmission,\n NewDraftSubmission,\n NewFormSubmission,\n DraftSubmission,\n DraftSubmissionInput,\n} from './types/submissions'\nimport { deleteAutoSaveData } from './auto-save-service'\nimport {\n downloadFormSubmission,\n uploadFormSubmissionEdit,\n} from './services/api/submissions'\nimport { getSubmissionAttachmentDetails } from './attachments-service'\nimport getPostSubmissionAttachments from './services/api/post-submission-attachment-urls'\n\nlet _isProcessingPendingQueue = false\n\n/**\n * Force processing the pending queue. This must be called to process the\n * pending queue and is best used when the application comes back online.\n *\n * ### Example\n *\n * ```js\n * await submissionService.processPendingQueue()\n * ```\n *\n * @returns\n */\nasync function processPendingQueue({\n shouldRunExternalIdGeneration,\n shouldRunServerValidation,\n}: {\n shouldRunExternalIdGeneration: boolean\n shouldRunServerValidation: boolean\n}): Promise<void> {\n if (_isProcessingPendingQueue) {\n return\n }\n _isProcessingPendingQueue = true\n\n console.log('Checking pending queue for submissions.')\n const pendingQueueSubmissions = await getPendingQueueSubmissions()\n\n console.log(\n `Found ${pendingQueueSubmissions.length} submission(s) in the pending queue.`,\n )\n for (const pendingQueueSubmission of pendingQueueSubmissions) {\n if (isOffline()) {\n console.log(\n 'Application is offline, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n if (pendingQueueSubmission.isEditing) {\n console.log(\n 'submission is being edited, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n if (\n pendingQueueSubmission.definition.isAuthenticated &&\n !isLoggedIn() &&\n !getFormsKeyId()\n ) {\n console.log(\n 'Authentication is required for this form but the user does not have a valid token, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n try {\n console.log(\n 'Attempting to process submission from pending queue:',\n pendingQueueSubmission,\n )\n\n pendingQueueSubmission.isSubmitting = true\n pendingQueueSubmission.error = undefined\n await updatePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n pendingQueueSubmission,\n 'SUBMIT_STARTED',\n )\n\n const preparedSubmission = await prepareSubmissionData(\n pendingQueueSubmission,\n )\n pendingQueueSubmission.submission = {\n ...preparedSubmission,\n }\n const attachments = getSubmissionAttachmentDetails(\n pendingQueueSubmission.definition.elements,\n pendingQueueSubmission.submission,\n )\n const failedAttachments = attachments.filter(\n (attachment) => attachment.value.type === 'ERROR',\n )\n if (failedAttachments.length) {\n throw new Error(\n `Failed to upload ${failedAttachments.length} attachment${\n failedAttachments.length > 1 ? 's' : ''\n }.`,\n )\n }\n await submitWithCompletionTimestamp({\n isPendingQueueEnabled: true,\n formSubmission: pendingQueueSubmission,\n onProgress: (event) => {\n executePendingQueueProgressListeners({\n ...event,\n pendingTimestamp: pendingQueueSubmission.pendingTimestamp,\n })\n },\n shouldRunExternalIdGeneration,\n shouldRunServerValidation,\n paymentFormUrl: undefined,\n paymentReceiptUrl: undefined,\n completionTimestamp: pendingQueueSubmission.pendingTimestamp,\n })\n\n await removePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n 'SUBMIT_SUCCEEDED',\n )\n\n console.log(\n 'Successfully processed submission from the pending queue',\n pendingQueueSubmission,\n )\n } catch (error) {\n Sentry.captureException(error)\n console.error('Error processing submission from the pending queue', error)\n pendingQueueSubmission.isSubmitting = false\n if ((error as Error).message) {\n pendingQueueSubmission.error = (error as Error).message\n } else {\n pendingQueueSubmission.error =\n 'An unknown error has occurred, which has prevented your Form from submitting. Please try again, or contact your Administrator if the problem persists.'\n }\n await updatePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n pendingQueueSubmission,\n 'SUBMIT_FAILED',\n )\n }\n }\n\n console.log(\n 'Finished attempting to processing submissions in the pending queue.',\n )\n _isProcessingPendingQueue = false\n}\n\n/**\n * Submit a FormSubmission. Offline submissions will be added to a pending queue\n * and be processed using the `processPendingQueue()` function. FormSubmissions\n * with payment submission events will return the FormSubmissionResult with a\n * `payment` property set, this should be used to redirect the user to the\n * payment URL. Will also handle cleaning up auto save data (if the\n * `autoSaveKey` property is passed), locally stored drafts and prefill data.\n *\n * ### Example\n *\n * ```js\n * const formSubmission = {\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here',\n * },\n * definition: OneBlinkForm,\n * captchaTokens: [],\n * formSubmissionDraftId: '2974602c-2c5b-4b46-b086-87ee9b2aa233',\n * jobId: 'bb37d1da-9cda-4950-a36a-22f58b25de3a',\n * preFillFormDataId: '7763f828-4aaf-49dc-9c1b-e2eeea8fa990',\n * externalId: 'external-id-set-by-developer',\n * }\n *\n * // Pass paymentReceiptUrl if submission may require a payment\n * const paymentReceiptUrl = `${window.location.origin}/payment-receipt`\n *\n * // Pass schedulingBookingUrlConfiguration if submission utilise scheduling\n * const schedulingBookingUrlConfiguration = {\n * schedulingBookingUrl: 'https://my-website.com/booking',\n * schedulingRescheduleUrl: 'https://my-website.com/reschedule',\n * schedulingCancelUrl: 'https://my-website.com/cancel',\n * }\n * const submissionResult = await submissionService.submit({\n * formSubmission,\n * paymentReceiptUrl,\n * schedulingBookingUrlConfiguration,\n * })\n *\n * if (submissionResult.scheduling) {\n * // Redirect user to booking form\n * window.location.href = submissionResult.scheduling.bookingUrl\n * return\n * }\n *\n * if (submissionResult.payment) {\n * // Redirect user to payment form\n * window.location.href = submissionResult.payment.hostedFormUrl\n * return\n * }\n *\n * if (submissionResult.isOffline) {\n * if (submissionResult.isInPendingQueue) {\n * // Display message to user that the submission\n * // has been added to the pending queue\n * } else {\n * // Display message to user that this submission can\n * // not be processed while offline (most likely because it requires a payment)\n * }\n * return\n * }\n *\n * // submissionResult.submissionId and submissionResult.submissionTimestamp\n * // will be set if the submission was successful\n * ```\n *\n * @param params\n * @returns\n */\nasync function submit(\n params: SubmissionParams & {\n autoSaveKey?: string\n },\n): Promise<FormSubmissionResult> {\n return await submitWithCompletionTimestamp({\n ...params,\n completionTimestamp: new Date().toISOString(),\n })\n}\n\nasync function submitWithCompletionTimestamp({\n autoSaveKey,\n ...params\n}: SubmissionParams & {\n autoSaveKey?: string\n completionTimestamp: string\n}): Promise<FormSubmissionResult> {\n const formSubmissionResult = await submitForm(params)\n if (typeof autoSaveKey === 'string') {\n try {\n await deleteAutoSaveData(params.formSubmission.definition.id, autoSaveKey)\n } catch (error) {\n console.warn('Error removing auto save data: ', error)\n Sentry.captureException(error)\n }\n }\n return formSubmissionResult\n}\n\nasync function closeWindow(): Promise<void> {\n // @ts-expect-error\n if (window.cordova && window.cordova.plugins.exit) {\n // @ts-expect-error\n window.cordova.plugins.exit()\n return\n }\n\n window.close()\n\n // If the browser has not closed after timeout,\n // we throw an error to display to the user\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n console.log('Could not close as window was not opened using JavaScript')\n reject(\n new Error(\n 'We were unable to close your browser, could you please close it manually for us?',\n ),\n )\n }, 500)\n })\n}\n\n/**\n * Go back in the browser history or attempts to close the browser tab if there\n * is no history.\n *\n * ### Example\n *\n * ```js\n * try {\n * await submissionService.goBackOrCloseWindow()\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @returns\n */\nasync function goBackOrCloseWindow(): Promise<void> {\n if (window.history.length <= 1) {\n return closeWindow()\n } else {\n window.history.back()\n }\n}\n\n/**\n * Action to cancel completing a form, currently goes back in the browser\n * history or attempts to close the browser tab if there is no history.\n *\n * ### Example\n *\n * ```js\n * const options = {\n * definition: OneBlinkForm,\n * externalId: 'external-id-set-by-developer',\n * }\n * // Only used for relative URLs\n * const pushRelativePath = (path) => {\n * window.location.href = path\n * }\n * // Only used for aboslute URLS\n * const replaceAbsolutePath = window.location.replace\n *\n * try {\n * await submissionService.executeCancelAction(options, {\n * onRedirectToRelativeUrl: pushRelativePath,\n * onRedirectToAbsoluteUrl: replaceAbsolutePath,\n * })\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @param options\n * @param redirectConfig\n */\nasync function executeCancelAction(\n formSubmissionResultOptions: {\n definition: FormTypes.Form\n externalId: string | null\n taskCompletion?: FormSubmissionResult['taskCompletion']\n },\n {\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n const formSubmissionResult: FormSubmissionResult = {\n ...formSubmissionResultOptions,\n formsAppId: NaN,\n formSubmissionDraftId: undefined,\n jobId: undefined,\n externalId: undefined,\n preFillFormDataId: null,\n recaptchas: [],\n submission: {},\n isInPendingQueue: false,\n isOffline: false,\n payment: null,\n scheduling: null,\n submissionId: null,\n submissionTimestamp: null,\n isUploadingAttachments: false,\n }\n\n let cancelAction = formSubmissionResult.definition.cancelAction\n let cancelRedirectUrl = formSubmissionResult.definition.cancelRedirectUrl\n\n if (formSubmissionResult.taskCompletion) {\n cancelAction = 'URL'\n cancelRedirectUrl = formSubmissionResult.taskCompletion.redirectUrl\n }\n\n await executeAction(formSubmissionResult, {\n action: cancelAction,\n redirectUrl: cancelRedirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n })\n}\n\n/**\n * Execute the post submission action for a form after a successful form\n * submission.\n *\n * ### Example\n *\n * ```js\n * const formSubmissionResult = {\n * submissionId: '89c6e98e-f56f-45fc-84fe-c4fc62331d34',\n * submissionTimestamp: '2020-07-29T01:03:26.573Z'\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here'\n * },\n * definition: OneBlinkForm,\n * payment: {\n * hostedFormUrl: 'https://payment.com/transaction'\n * },\n * formSubmissionDraftId: '2974602c-2c5b-4b46-b086-87ee9b2aa233',\n * jobId: 'bb37d1da-9cda-4950-a36a-22f58b25de3a',\n * preFillFormDataId: '7763f828-4aaf-49dc-9c1b-e2eeea8fa990',\n * externalId: 'external-id-set-by-developer',\n * }\n * // Only used for relative URLs\n * const pushRelativePath = (path) => {\n * window.location.href = path\n * }\n * // Only used for aboslute URLS\n * const replaceAbsolutePath = window.location.replace\n *\n * try {\n * await submissionService.executePostSubmissionAction(formSubmissionResult, {\n * onRedirectToRelativeUrl: pushRelativePath,\n * onRedirectToAbsoluteUrl: replaceAbsolutePath,\n * })\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @param submissionResult\n * @param redirectConfig\n */\nasync function executePostSubmissionAction(\n submissionResult: FormSubmissionResult,\n {\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n console.log('Attempting to run post submission action')\n let postSubmissionAction = submissionResult.definition.postSubmissionAction\n let redirectUrl = submissionResult.definition.redirectUrl\n\n if (submissionResult.scheduling) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.scheduling.bookingUrl\n } else if (submissionResult.payment) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.payment.hostedFormUrl\n } else if (submissionResult.taskCompletion) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.taskCompletion.redirectUrl\n }\n\n await executeAction(submissionResult, {\n action: postSubmissionAction,\n redirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n })\n}\n\nasync function executeAction(\n submissionResult: FormSubmissionResult,\n {\n action,\n redirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n action: FormTypes.FormPostSubmissionAction\n redirectUrl: string | undefined\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n switch (action) {\n case 'CLOSE':\n return closeWindow()\n case 'FORMS_LIBRARY': {\n if (window.location.pathname === '/') {\n onRedirectToAbsoluteUrl(window.location.origin)\n } else {\n onRedirectToRelativeUrl('/')\n }\n break\n }\n case 'URL': {\n const newUrl = replaceInjectablesWithSubmissionValues(\n redirectUrl || '/',\n submissionResult,\n ).text\n // Relative URLs can be navigated to internally\n if (newUrl[0] === '/') {\n onRedirectToRelativeUrl(newUrl)\n return\n }\n\n onRedirectToAbsoluteUrl(newUrl)\n\n // If we are in cordova land, we will navigate\n // back to the home screen after redirect\n if (window.cordova) {\n // Wait a couple of seconds to ensure the browser has\n // been opened before navigating away from form.\n setTimeout(() => {\n onRedirectToRelativeUrl('/')\n }, 2000)\n }\n break\n }\n case 'BACK':\n default: {\n // if there's no post submission action for some reason, use prev. logic...\n return goBackOrCloseWindow()\n }\n }\n}\n\n/**\n * Retrieve submission data for a known formId and submissionId\n *\n * #### Example\n *\n * ```js\n * const formId = 1\n * const submissionId = 'fba95b9d-5a9c-463d-ab68-867f431e4120'\n * const credentials = await formSubmissionService.getSubmissionData({\n * formId,\n * submissionId,\n * })\n * ```\n *\n * @param formId\n * @param submissionId\n * @param abortSignal\n * @returns\n */\nasync function getSubmissionData({\n formId,\n submissionId,\n abortSignal,\n}: {\n formId: number\n submissionId: string\n abortSignal?: AbortSignal\n}): Promise<{\n data: SubmissionTypes.S3SubmissionData\n versionId: string | undefined\n}> {\n return await downloadFormSubmission({\n formId,\n submissionId,\n abortSignal,\n })\n}\n\nexport {\n submit,\n executePostSubmissionAction,\n executeCancelAction,\n goBackOrCloseWindow,\n getPendingQueueSubmissions,\n deletePendingQueueSubmission,\n editPendingQueueSubmission,\n cancelEditingPendingQueueSubmission,\n registerPendingQueueListener,\n processPendingQueue,\n BaseFormSubmission,\n NewDraftSubmission,\n NewFormSubmission,\n DraftSubmissionInput,\n DraftSubmission,\n FormSubmission,\n FormSubmissionResult,\n PendingFormSubmission,\n SubmissionParams,\n registerPendingQueueAttachmentProgressListener,\n registerPendingQueueProgressListener,\n ProgressListener,\n ProgressListenerEvent,\n PendingQueueListener,\n PendingQueueAction,\n getSubmissionData,\n uploadFormSubmissionEdit,\n getPostSubmissionAttachments,\n}\n"]}
1
+ {"version":3,"file":"submission-service.js","sourceRoot":"","sources":["../../src/apps/submission-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,mCAAmC,EACnC,4BAA4B,EAC5B,0BAA0B,EAC1B,8CAA8C,EAC9C,oCAAoC,EACpC,oCAAoC,EACpC,4BAA4B,GAG7B,MAAM,0BAA0B,CAAA;AACjC,OAAO,sCAAsC,MAAM,mDAAmD,CAAA;AAEtG,OAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,OAAO,qBAAqB,MAAM,kCAAkC,CAAA;AACpE,OAAO,UAIN,MAAM,mBAAmB,CAAA;AAW1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,4BAA4B,MAAM,gDAAgD,CAAA;AAEzF,IAAI,yBAAyB,GAAG,KAAK,CAAA;AAErC;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,mBAAmB,CAAC,EACjC,6BAA6B,EAC7B,yBAAyB,GAI1B;IACC,IAAI,yBAAyB,EAAE,CAAC;QAC9B,OAAM;IACR,CAAC;IACD,yBAAyB,GAAG,IAAI,CAAA;IAEhC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;IACtD,MAAM,uBAAuB,GAAG,MAAM,0BAA0B,EAAE,CAAA;IAElE,OAAO,CAAC,GAAG,CACT,SAAS,uBAAuB,CAAC,MAAM,sCAAsC,CAC9E,CAAA;IACD,KAAK,MAAM,sBAAsB,IAAI,uBAAuB,EAAE,CAAC;QAC7D,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,kEAAkE,EAClE,sBAAsB,CACvB,CAAA;YACD,SAAQ;QACV,CAAC;QAED,IAAI,sBAAsB,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CACT,sEAAsE,EACtE,sBAAsB,CACvB,CAAA;YACD,SAAQ;QACV,CAAC;QAED,IACE,sBAAsB,CAAC,UAAU,CAAC,eAAe;YACjD,CAAC,UAAU,EAAE;YACb,CAAC,aAAa,EAAE,EAChB,CAAC;YACD,OAAO,CAAC,GAAG,CACT,6HAA6H,EAC7H,sBAAsB,CACvB,CAAA;YACD,SAAQ;QACV,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CACT,sDAAsD,EACtD,sBAAsB,CACvB,CAAA;YAED,sBAAsB,CAAC,YAAY,GAAG,IAAI,CAAA;YAC1C,sBAAsB,CAAC,KAAK,GAAG,SAAS,CAAA;YACxC,MAAM,4BAA4B,CAChC,sBAAsB,CAAC,gBAAgB,EACvC,sBAAsB,EACtB,gBAAgB,CACjB,CAAA;YAED,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CACpD,sBAAsB,CACvB,CAAA;YACD,sBAAsB,CAAC,UAAU,GAAG;gBAClC,GAAG,kBAAkB;aACtB,CAAA;YACD,MAAM,WAAW,GAAG,8BAA8B,CAChD,sBAAsB,CAAC,UAAU,CAAC,QAAQ,EAC1C,sBAAsB,CAAC,UAAU,CAClC,CAAA;YACD,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAC1C,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAClD,CAAA;YACD,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,oBAAoB,iBAAiB,CAAC,MAAM,cAC1C,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EACvC,GAAG,CACJ,CAAA;YACH,CAAC;YACD,MAAM,6BAA6B,CAAC;gBAClC,qBAAqB,EAAE,IAAI;gBAC3B,cAAc,EAAE,sBAAsB;gBACtC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;oBACpB,oCAAoC,CAAC;wBACnC,GAAG,KAAK;wBACR,gBAAgB,EAAE,sBAAsB,CAAC,gBAAgB;qBAC1D,CAAC,CAAA;gBACJ,CAAC;gBACD,6BAA6B;gBAC7B,yBAAyB;gBACzB,cAAc,EAAE,SAAS;gBACzB,iBAAiB,EAAE,SAAS;gBAC5B,mBAAmB,EAAE,sBAAsB,CAAC,gBAAgB;aAC7D,CAAC,CAAA;YAEF,MAAM,4BAA4B,CAChC,sBAAsB,CAAC,gBAAgB,EACvC,kBAAkB,CACnB,CAAA;YAED,OAAO,CAAC,GAAG,CACT,0DAA0D,EAC1D,sBAAsB,CACvB,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;YAC9B,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAA;YAC1E,sBAAsB,CAAC,YAAY,GAAG,KAAK,CAAA;YAC3C,IAAK,KAAe,CAAC,OAAO,EAAE,CAAC;gBAC7B,sBAAsB,CAAC,KAAK,GAAI,KAAe,CAAC,OAAO,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,sBAAsB,CAAC,KAAK;oBAC1B,wJAAwJ,CAAA;YAC5J,CAAC;YACD,MAAM,4BAA4B,CAChC,sBAAsB,CAAC,gBAAgB,EACvC,sBAAsB,EACtB,eAAe,CAChB,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,qEAAqE,CACtE,CAAA;IACD,yBAAyB,GAAG,KAAK,CAAA;AACnC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,KAAK,UAAU,MAAM,CACnB,MAEC;IAED,OAAO,MAAM,6BAA6B,CAAC;QACzC,GAAG,MAAM;QACT,mBAAmB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC9C,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,6BAA6B,CAAC,EAC3C,WAAW,EACX,GAAG,MAAM,EAIV;IACC,MAAM,oBAAoB,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;IACrD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,CAAA;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAA;YACtD,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAA;AAC7B,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,mBAAmB;IACnB,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,mBAAmB;QACnB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QAC7B,OAAM;IACR,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAA;IAEd,+CAA+C;IAC/C,2CAA2C;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;YACxE,MAAM,CACJ,IAAI,KAAK,CACP,kFAAkF,CACnF,CACF,CAAA;QACH,CAAC,EAAE,GAAG,CAAC,CAAA;IACT,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,UAAU,mBAAmB;IAChC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,EAAE,CAAA;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IACvB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,KAAK,UAAU,mBAAmB,CAChC,2BAIC,EACD,EACE,uBAAuB,EACvB,uBAAuB,GAIxB;IAED,MAAM,oBAAoB,GAAyB;QACjD,GAAG,2BAA2B;QAC9B,UAAU,EAAE,GAAG;QACf,qBAAqB,EAAE,SAAS;QAChC,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,SAAS;QACrB,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;QACd,gBAAgB,EAAE,KAAK;QACvB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;QAClB,mBAAmB,EAAE,IAAI;QACzB,sBAAsB,EAAE,KAAK;KAC9B,CAAA;IAED,IAAI,YAAY,GAAG,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAA;IAC/D,IAAI,iBAAiB,GAAG,oBAAoB,CAAC,UAAU,CAAC,iBAAiB,CAAA;IAEzE,IAAI,oBAAoB,CAAC,cAAc,EAAE,CAAC;QACxC,YAAY,GAAG,KAAK,CAAA;QACpB,iBAAiB,GAAG,oBAAoB,CAAC,cAAc,CAAC,WAAW,CAAA;IACrE,CAAC;IAED,MAAM,aAAa,CAAC,oBAAoB,EAAE;QACxC,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,iBAAiB;QAC9B,uBAAuB;QACvB,uBAAuB;KACxB,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,KAAK,UAAU,2BAA2B,CACxC,gBAAsC,EACtC,EACE,uBAAuB,EACvB,uBAAuB,GAIxB;IAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;IACvD,IAAI,oBAAoB,GAAG,gBAAgB,CAAC,UAAU,CAAC,oBAAoB,CAAA;IAC3E,IAAI,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAA;IAEzD,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC;QAChC,oBAAoB,GAAG,KAAK,CAAA;QAC5B,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAA;IACtD,CAAC;SAAM,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;QACpC,oBAAoB,GAAG,KAAK,CAAA;QAC5B,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAA;IACtD,CAAC;SAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,CAAC;QAC3C,oBAAoB,GAAG,KAAK,CAAA;QAC5B,WAAW,GAAG,gBAAgB,CAAC,cAAc,CAAC,WAAW,CAAA;IAC3D,CAAC;IAED,MAAM,aAAa,CAAC,gBAAgB,EAAE;QACpC,MAAM,EAAE,oBAAoB;QAC5B,WAAW;QACX,uBAAuB;QACvB,uBAAuB;KACxB,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,gBAAsC,EACtC,EACE,MAAM,EACN,WAAW,EACX,uBAAuB,EACvB,uBAAuB,GAMxB;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,WAAW,EAAE,CAAA;QACtB,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACrC,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACjD,CAAC;iBAAM,CAAC;gBACN,uBAAuB,CAAC,GAAG,CAAC,CAAA;YAC9B,CAAC;YACD,MAAK;QACP,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,MAAM,GAAG,sCAAsC,CACnD,WAAW,IAAI,GAAG,EAClB,gBAAgB,CACjB,CAAC,IAAI,CAAA;YACN,+CAA+C;YAC/C,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACtB,uBAAuB,CAAC,MAAM,CAAC,CAAA;gBAC/B,OAAM;YACR,CAAC;YAED,uBAAuB,CAAC,MAAM,CAAC,CAAA;YAE/B,8CAA8C;YAC9C,yCAAyC;YACzC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,qDAAqD;gBACrD,gDAAgD;gBAChD,UAAU,CAAC,GAAG,EAAE;oBACd,uBAAuB,CAAC,GAAG,CAAC,CAAA;gBAC9B,CAAC,EAAE,IAAI,CAAC,CAAA;YACV,CAAC;YACD,MAAK;QACP,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,OAAO,CAAC,CAAC,CAAC;YACR,2EAA2E;YAC3E,OAAO,mBAAmB,EAAE,CAAA;QAC9B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,KAAK,UAAU,iBAAiB,CAAC,EAC/B,MAAM,EACN,YAAY,EACZ,WAAW,EACX,SAAS,GAMV;IAIC,OAAO,MAAM,sBAAsB,CAAC;QAClC,MAAM;QACN,YAAY;QACZ,WAAW;QACX,SAAS;KACV,CAAC,CAAA;AACJ,CAAC;AAED,OAAO,EACL,MAAM,EACN,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,mBAAmB,EAUnB,8CAA8C,EAC9C,oCAAoC,EAKpC,iBAAiB,EACjB,wBAAwB,EACxB,4BAA4B,GAC7B,CAAA","sourcesContent":["import { isOffline } from './offline-service'\nimport { getFormsKeyId, isLoggedIn } from './auth-service'\nimport {\n registerPendingQueueListener,\n getPendingQueueSubmissions,\n updatePendingQueueSubmission,\n cancelEditingPendingQueueSubmission,\n deletePendingQueueSubmission,\n editPendingQueueSubmission,\n registerPendingQueueAttachmentProgressListener,\n registerPendingQueueProgressListener,\n executePendingQueueProgressListeners,\n removePendingQueueSubmission,\n PendingQueueListener,\n PendingQueueAction,\n} from './services/pending-queue'\nimport replaceInjectablesWithSubmissionValues from './services/replaceInjectablesWithSubmissionValues'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport Sentry from './Sentry'\nimport prepareSubmissionData from './services/prepareSubmissionData'\nimport submitForm, {\n SubmissionParams,\n ProgressListener,\n ProgressListenerEvent,\n} from './services/submit'\nimport {\n PendingFormSubmission,\n FormSubmission,\n FormSubmissionResult,\n BaseFormSubmission,\n NewDraftSubmission,\n NewFormSubmission,\n DraftSubmission,\n DraftSubmissionInput,\n} from './types/submissions'\nimport { deleteAutoSaveData } from './auto-save-service'\nimport {\n downloadFormSubmission,\n uploadFormSubmissionEdit,\n} from './services/api/submissions'\nimport { getSubmissionAttachmentDetails } from './attachments-service'\nimport getPostSubmissionAttachments from './services/api/post-submission-attachment-urls'\n\nlet _isProcessingPendingQueue = false\n\n/**\n * Force processing the pending queue. This must be called to process the\n * pending queue and is best used when the application comes back online.\n *\n * ### Example\n *\n * ```js\n * await submissionService.processPendingQueue()\n * ```\n *\n * @returns\n */\nasync function processPendingQueue({\n shouldRunExternalIdGeneration,\n shouldRunServerValidation,\n}: {\n shouldRunExternalIdGeneration: boolean\n shouldRunServerValidation: boolean\n}): Promise<void> {\n if (_isProcessingPendingQueue) {\n return\n }\n _isProcessingPendingQueue = true\n\n console.log('Checking pending queue for submissions.')\n const pendingQueueSubmissions = await getPendingQueueSubmissions()\n\n console.log(\n `Found ${pendingQueueSubmissions.length} submission(s) in the pending queue.`,\n )\n for (const pendingQueueSubmission of pendingQueueSubmissions) {\n if (isOffline()) {\n console.log(\n 'Application is offline, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n if (pendingQueueSubmission.isEditing) {\n console.log(\n 'submission is being edited, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n if (\n pendingQueueSubmission.definition.isAuthenticated &&\n !isLoggedIn() &&\n !getFormsKeyId()\n ) {\n console.log(\n 'Authentication is required for this form but the user does not have a valid token, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n try {\n console.log(\n 'Attempting to process submission from pending queue:',\n pendingQueueSubmission,\n )\n\n pendingQueueSubmission.isSubmitting = true\n pendingQueueSubmission.error = undefined\n await updatePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n pendingQueueSubmission,\n 'SUBMIT_STARTED',\n )\n\n const preparedSubmission = await prepareSubmissionData(\n pendingQueueSubmission,\n )\n pendingQueueSubmission.submission = {\n ...preparedSubmission,\n }\n const attachments = getSubmissionAttachmentDetails(\n pendingQueueSubmission.definition.elements,\n pendingQueueSubmission.submission,\n )\n const failedAttachments = attachments.filter(\n (attachment) => attachment.value.type === 'ERROR',\n )\n if (failedAttachments.length) {\n throw new Error(\n `Failed to upload ${failedAttachments.length} attachment${\n failedAttachments.length > 1 ? 's' : ''\n }.`,\n )\n }\n await submitWithCompletionTimestamp({\n isPendingQueueEnabled: true,\n formSubmission: pendingQueueSubmission,\n onProgress: (event) => {\n executePendingQueueProgressListeners({\n ...event,\n pendingTimestamp: pendingQueueSubmission.pendingTimestamp,\n })\n },\n shouldRunExternalIdGeneration,\n shouldRunServerValidation,\n paymentFormUrl: undefined,\n paymentReceiptUrl: undefined,\n completionTimestamp: pendingQueueSubmission.pendingTimestamp,\n })\n\n await removePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n 'SUBMIT_SUCCEEDED',\n )\n\n console.log(\n 'Successfully processed submission from the pending queue',\n pendingQueueSubmission,\n )\n } catch (error) {\n Sentry.captureException(error)\n console.error('Error processing submission from the pending queue', error)\n pendingQueueSubmission.isSubmitting = false\n if ((error as Error).message) {\n pendingQueueSubmission.error = (error as Error).message\n } else {\n pendingQueueSubmission.error =\n 'An unknown error has occurred, which has prevented your Form from submitting. Please try again, or contact your Administrator if the problem persists.'\n }\n await updatePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n pendingQueueSubmission,\n 'SUBMIT_FAILED',\n )\n }\n }\n\n console.log(\n 'Finished attempting to processing submissions in the pending queue.',\n )\n _isProcessingPendingQueue = false\n}\n\n/**\n * Submit a FormSubmission. Offline submissions will be added to a pending queue\n * and be processed using the `processPendingQueue()` function. FormSubmissions\n * with payment submission events will return the FormSubmissionResult with a\n * `payment` property set, this should be used to redirect the user to the\n * payment URL. Will also handle cleaning up auto save data (if the\n * `autoSaveKey` property is passed), locally stored drafts and prefill data.\n *\n * ### Example\n *\n * ```js\n * const formSubmission = {\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here',\n * },\n * definition: OneBlinkForm,\n * captchaTokens: [],\n * formSubmissionDraftId: '2974602c-2c5b-4b46-b086-87ee9b2aa233',\n * jobId: 'bb37d1da-9cda-4950-a36a-22f58b25de3a',\n * preFillFormDataId: '7763f828-4aaf-49dc-9c1b-e2eeea8fa990',\n * externalId: 'external-id-set-by-developer',\n * }\n *\n * // Pass paymentReceiptUrl if submission may require a payment\n * const paymentReceiptUrl = `${window.location.origin}/payment-receipt`\n *\n * // Pass schedulingBookingUrlConfiguration if submission utilise scheduling\n * const schedulingBookingUrlConfiguration = {\n * schedulingBookingUrl: 'https://my-website.com/booking',\n * schedulingRescheduleUrl: 'https://my-website.com/reschedule',\n * schedulingCancelUrl: 'https://my-website.com/cancel',\n * }\n * const submissionResult = await submissionService.submit({\n * formSubmission,\n * paymentReceiptUrl,\n * schedulingBookingUrlConfiguration,\n * })\n *\n * if (submissionResult.scheduling) {\n * // Redirect user to booking form\n * window.location.href = submissionResult.scheduling.bookingUrl\n * return\n * }\n *\n * if (submissionResult.payment) {\n * // Redirect user to payment form\n * window.location.href = submissionResult.payment.hostedFormUrl\n * return\n * }\n *\n * if (submissionResult.isOffline) {\n * if (submissionResult.isInPendingQueue) {\n * // Display message to user that the submission\n * // has been added to the pending queue\n * } else {\n * // Display message to user that this submission can\n * // not be processed while offline (most likely because it requires a payment)\n * }\n * return\n * }\n *\n * // submissionResult.submissionId and submissionResult.submissionTimestamp\n * // will be set if the submission was successful\n * ```\n *\n * @param params\n * @returns\n */\nasync function submit(\n params: SubmissionParams & {\n autoSaveKey?: string\n },\n): Promise<FormSubmissionResult> {\n return await submitWithCompletionTimestamp({\n ...params,\n completionTimestamp: new Date().toISOString(),\n })\n}\n\nasync function submitWithCompletionTimestamp({\n autoSaveKey,\n ...params\n}: SubmissionParams & {\n autoSaveKey?: string\n completionTimestamp: string\n}): Promise<FormSubmissionResult> {\n const formSubmissionResult = await submitForm(params)\n if (typeof autoSaveKey === 'string') {\n try {\n await deleteAutoSaveData(params.formSubmission.definition.id, autoSaveKey)\n } catch (error) {\n console.warn('Error removing auto save data: ', error)\n Sentry.captureException(error)\n }\n }\n return formSubmissionResult\n}\n\nasync function closeWindow(): Promise<void> {\n // @ts-expect-error\n if (window.cordova && window.cordova.plugins.exit) {\n // @ts-expect-error\n window.cordova.plugins.exit()\n return\n }\n\n window.close()\n\n // If the browser has not closed after timeout,\n // we throw an error to display to the user\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n console.log('Could not close as window was not opened using JavaScript')\n reject(\n new Error(\n 'We were unable to close your browser, could you please close it manually for us?',\n ),\n )\n }, 500)\n })\n}\n\n/**\n * Go back in the browser history or attempts to close the browser tab if there\n * is no history.\n *\n * ### Example\n *\n * ```js\n * try {\n * await submissionService.goBackOrCloseWindow()\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @returns\n */\nasync function goBackOrCloseWindow(): Promise<void> {\n if (window.history.length <= 1) {\n return closeWindow()\n } else {\n window.history.back()\n }\n}\n\n/**\n * Action to cancel completing a form, currently goes back in the browser\n * history or attempts to close the browser tab if there is no history.\n *\n * ### Example\n *\n * ```js\n * const options = {\n * definition: OneBlinkForm,\n * externalId: 'external-id-set-by-developer',\n * }\n * // Only used for relative URLs\n * const pushRelativePath = (path) => {\n * window.location.href = path\n * }\n * // Only used for aboslute URLS\n * const replaceAbsolutePath = window.location.replace\n *\n * try {\n * await submissionService.executeCancelAction(options, {\n * onRedirectToRelativeUrl: pushRelativePath,\n * onRedirectToAbsoluteUrl: replaceAbsolutePath,\n * })\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @param options\n * @param redirectConfig\n */\nasync function executeCancelAction(\n formSubmissionResultOptions: {\n definition: FormTypes.Form\n externalId: string | null\n taskCompletion?: FormSubmissionResult['taskCompletion']\n },\n {\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n const formSubmissionResult: FormSubmissionResult = {\n ...formSubmissionResultOptions,\n formsAppId: NaN,\n formSubmissionDraftId: undefined,\n jobId: undefined,\n externalId: undefined,\n preFillFormDataId: null,\n recaptchas: [],\n submission: {},\n isInPendingQueue: false,\n isOffline: false,\n payment: null,\n scheduling: null,\n submissionId: null,\n submissionTimestamp: null,\n isUploadingAttachments: false,\n }\n\n let cancelAction = formSubmissionResult.definition.cancelAction\n let cancelRedirectUrl = formSubmissionResult.definition.cancelRedirectUrl\n\n if (formSubmissionResult.taskCompletion) {\n cancelAction = 'URL'\n cancelRedirectUrl = formSubmissionResult.taskCompletion.redirectUrl\n }\n\n await executeAction(formSubmissionResult, {\n action: cancelAction,\n redirectUrl: cancelRedirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n })\n}\n\n/**\n * Execute the post submission action for a form after a successful form\n * submission.\n *\n * ### Example\n *\n * ```js\n * const formSubmissionResult = {\n * submissionId: '89c6e98e-f56f-45fc-84fe-c4fc62331d34',\n * submissionTimestamp: '2020-07-29T01:03:26.573Z'\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here'\n * },\n * definition: OneBlinkForm,\n * payment: {\n * hostedFormUrl: 'https://payment.com/transaction'\n * },\n * formSubmissionDraftId: '2974602c-2c5b-4b46-b086-87ee9b2aa233',\n * jobId: 'bb37d1da-9cda-4950-a36a-22f58b25de3a',\n * preFillFormDataId: '7763f828-4aaf-49dc-9c1b-e2eeea8fa990',\n * externalId: 'external-id-set-by-developer',\n * }\n * // Only used for relative URLs\n * const pushRelativePath = (path) => {\n * window.location.href = path\n * }\n * // Only used for aboslute URLS\n * const replaceAbsolutePath = window.location.replace\n *\n * try {\n * await submissionService.executePostSubmissionAction(formSubmissionResult, {\n * onRedirectToRelativeUrl: pushRelativePath,\n * onRedirectToAbsoluteUrl: replaceAbsolutePath,\n * })\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @param submissionResult\n * @param redirectConfig\n */\nasync function executePostSubmissionAction(\n submissionResult: FormSubmissionResult,\n {\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n console.log('Attempting to run post submission action')\n let postSubmissionAction = submissionResult.definition.postSubmissionAction\n let redirectUrl = submissionResult.definition.redirectUrl\n\n if (submissionResult.scheduling) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.scheduling.bookingUrl\n } else if (submissionResult.payment) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.payment.hostedFormUrl\n } else if (submissionResult.taskCompletion) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.taskCompletion.redirectUrl\n }\n\n await executeAction(submissionResult, {\n action: postSubmissionAction,\n redirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n })\n}\n\nasync function executeAction(\n submissionResult: FormSubmissionResult,\n {\n action,\n redirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n action: FormTypes.FormPostSubmissionAction\n redirectUrl: string | undefined\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n switch (action) {\n case 'CLOSE':\n return closeWindow()\n case 'FORMS_LIBRARY': {\n if (window.location.pathname === '/') {\n onRedirectToAbsoluteUrl(window.location.origin)\n } else {\n onRedirectToRelativeUrl('/')\n }\n break\n }\n case 'URL': {\n const newUrl = replaceInjectablesWithSubmissionValues(\n redirectUrl || '/',\n submissionResult,\n ).text\n // Relative URLs can be navigated to internally\n if (newUrl[0] === '/') {\n onRedirectToRelativeUrl(newUrl)\n return\n }\n\n onRedirectToAbsoluteUrl(newUrl)\n\n // If we are in cordova land, we will navigate\n // back to the home screen after redirect\n if (window.cordova) {\n // Wait a couple of seconds to ensure the browser has\n // been opened before navigating away from form.\n setTimeout(() => {\n onRedirectToRelativeUrl('/')\n }, 2000)\n }\n break\n }\n case 'BACK':\n default: {\n // if there's no post submission action for some reason, use prev. logic...\n return goBackOrCloseWindow()\n }\n }\n}\n\n/**\n * Retrieve submission data for a known formId and submissionId\n *\n * #### Example\n *\n * ```js\n * const formId = 1\n * const submissionId = 'fba95b9d-5a9c-463d-ab68-867f431e4120'\n * const credentials = await formSubmissionService.getSubmissionData({\n * formId,\n * submissionId,\n * })\n * ```\n *\n * @param options\n * @param options.formId\n * @param options.submissionId\n * @param options.abortSignal\n * @param options.versionId\n * @returns\n */\nasync function getSubmissionData({\n formId,\n submissionId,\n abortSignal,\n versionId,\n}: {\n formId: number\n submissionId: string\n abortSignal?: AbortSignal\n versionId?: string\n}): Promise<{\n data: SubmissionTypes.S3SubmissionData\n versionId: string | undefined\n}> {\n return await downloadFormSubmission({\n formId,\n submissionId,\n abortSignal,\n versionId,\n })\n}\n\nexport {\n submit,\n executePostSubmissionAction,\n executeCancelAction,\n goBackOrCloseWindow,\n getPendingQueueSubmissions,\n deletePendingQueueSubmission,\n editPendingQueueSubmission,\n cancelEditingPendingQueueSubmission,\n registerPendingQueueListener,\n processPendingQueue,\n BaseFormSubmission,\n NewDraftSubmission,\n NewFormSubmission,\n DraftSubmissionInput,\n DraftSubmission,\n FormSubmission,\n FormSubmissionResult,\n PendingFormSubmission,\n SubmissionParams,\n registerPendingQueueAttachmentProgressListener,\n registerPendingQueueProgressListener,\n ProgressListener,\n ProgressListenerEvent,\n PendingQueueListener,\n PendingQueueAction,\n getSubmissionData,\n uploadFormSubmissionEdit,\n getPostSubmissionAttachments,\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": "13.0.0-beta.6",
4
+ "version": "13.0.0-beta.7",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"