@oneblink/apps-react 9.0.0-beta.2 → 9.0.0-beta.4
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/OneBlinkForm.d.ts +6 -10
- package/dist/OneBlinkForm.js +0 -4
- package/dist/OneBlinkForm.js.map +1 -1
- package/dist/OneBlinkFormBase.d.ts +1 -1
- package/dist/OneBlinkFormBase.js +2 -1
- package/dist/OneBlinkFormBase.js.map +1 -1
- package/dist/OneBlinkReadOnlyForm.d.ts +1 -1
- package/dist/OneBlinkReadOnlyForm.js +1 -1
- package/dist/OneBlinkReadOnlyForm.js.map +1 -1
- package/dist/PaymentReceipt.d.ts +1 -1
- package/dist/PaymentReceipt.js +1 -1
- package/dist/PaymentReceipt.js.map +1 -1
- package/dist/apps/Sentry.d.ts +7 -0
- package/dist/apps/Sentry.js +16 -0
- package/dist/apps/Sentry.js.map +1 -0
- package/dist/apps/approvals-service.d.ts +390 -0
- package/dist/apps/approvals-service.js +987 -0
- package/dist/apps/approvals-service.js.map +1 -0
- package/dist/apps/attachments-service.d.ts +49 -0
- package/dist/apps/attachments-service.js +134 -0
- package/dist/apps/attachments-service.js.map +1 -0
- package/dist/apps/auth-service.d.ts +114 -0
- package/dist/apps/auth-service.js +194 -0
- package/dist/apps/auth-service.js.map +1 -0
- package/dist/apps/auto-save-service.d.ts +82 -0
- package/dist/apps/auto-save-service.js +105 -0
- package/dist/apps/auto-save-service.js.map +1 -0
- package/dist/apps/draft-service.d.ts +148 -0
- package/dist/apps/draft-service.js +583 -0
- package/dist/apps/draft-service.js.map +1 -0
- package/dist/apps/form-service.d.ts +204 -0
- package/dist/apps/form-service.js +718 -0
- package/dist/apps/form-service.js.map +1 -0
- package/dist/apps/form-store-service.d.ts +141 -0
- package/dist/apps/form-store-service.js +114 -0
- package/dist/apps/form-store-service.js.map +1 -0
- package/dist/apps/forms-app-environment-service.d.ts +19 -0
- package/dist/apps/forms-app-environment-service.js +55 -0
- package/dist/apps/forms-app-environment-service.js.map +1 -0
- package/dist/apps/forms-app-service.d.ts +18 -0
- package/dist/apps/forms-app-service.js +53 -0
- package/dist/apps/forms-app-service.js.map +1 -0
- package/dist/apps/index.d.ts +252 -0
- package/dist/apps/index.js +254 -0
- package/dist/apps/index.js.map +1 -0
- package/dist/apps/job-service.d.ts +20 -0
- package/dist/apps/job-service.js +95 -0
- package/dist/apps/job-service.js.map +1 -0
- package/dist/apps/localisation-service.d.ts +207 -0
- package/dist/apps/localisation-service.js +321 -0
- package/dist/apps/localisation-service.js.map +1 -0
- package/dist/apps/notification-service.d.ts +83 -0
- package/dist/apps/notification-service.js +315 -0
- package/dist/apps/notification-service.js.map +1 -0
- package/dist/apps/offline-service.d.ts +18 -0
- package/dist/apps/offline-service.js +25 -0
- package/dist/apps/offline-service.js.map +1 -0
- package/dist/apps/payment-service.d.ts +110 -0
- package/dist/apps/payment-service.js +182 -0
- package/dist/apps/payment-service.js.map +1 -0
- package/dist/apps/prefill-service.d.ts +14 -0
- package/dist/apps/prefill-service.js +19 -0
- package/dist/apps/prefill-service.js.map +1 -0
- package/dist/apps/scheduled-tasks-service.d.ts +127 -0
- package/dist/apps/scheduled-tasks-service.js +240 -0
- package/dist/apps/scheduled-tasks-service.js.map +1 -0
- package/dist/apps/scheduling-service.d.ts +101 -0
- package/dist/apps/scheduling-service.js +171 -0
- package/dist/apps/scheduling-service.js.map +1 -0
- package/dist/apps/services/AWSCognitoClient.d.ts +55 -0
- package/dist/apps/services/AWSCognitoClient.js +436 -0
- package/dist/apps/services/AWSCognitoClient.js.map +1 -0
- package/dist/apps/services/api/drafts.d.ts +7 -0
- package/dist/apps/services/api/drafts.js +236 -0
- package/dist/apps/services/api/drafts.js.map +1 -0
- package/dist/apps/services/api/notifications.d.ts +3 -0
- package/dist/apps/services/api/notifications.js +60 -0
- package/dist/apps/services/api/notifications.js.map +1 -0
- package/dist/apps/services/api/payment.d.ts +23 -0
- package/dist/apps/services/api/payment.js +235 -0
- package/dist/apps/services/api/payment.js.map +1 -0
- package/dist/apps/services/api/post-submission-attachment-urls.d.ts +7 -0
- package/dist/apps/services/api/post-submission-attachment-urls.js +19 -0
- package/dist/apps/services/api/post-submission-attachment-urls.js.map +1 -0
- package/dist/apps/services/api/prefill.d.ts +1 -0
- package/dist/apps/services/api/prefill.js +70 -0
- package/dist/apps/services/api/prefill.js.map +1 -0
- package/dist/apps/services/api/receipt-id.d.ts +2 -0
- package/dist/apps/services/api/receipt-id.js +54 -0
- package/dist/apps/services/api/receipt-id.js.map +1 -0
- package/dist/apps/services/api/scheduling.d.ts +38 -0
- package/dist/apps/services/api/scheduling.js +142 -0
- package/dist/apps/services/api/scheduling.js.map +1 -0
- package/dist/apps/services/api/submissions.d.ts +18 -0
- package/dist/apps/services/api/submissions.js +166 -0
- package/dist/apps/services/api/submissions.js.map +1 -0
- package/dist/apps/services/cognito.d.ts +302 -0
- package/dist/apps/services/cognito.js +441 -0
- package/dist/apps/services/cognito.js.map +1 -0
- package/dist/apps/services/draft-data-store.d.ts +16 -0
- package/dist/apps/services/draft-data-store.js +115 -0
- package/dist/apps/services/draft-data-store.js.map +1 -0
- package/dist/apps/services/errors/oneBlinkAppsError.d.ts +35 -0
- package/dist/apps/services/errors/oneBlinkAppsError.js +32 -0
- package/dist/apps/services/errors/oneBlinkAppsError.js.map +1 -0
- package/dist/apps/services/external-id-generation.d.ts +4 -0
- package/dist/apps/services/external-id-generation.js +59 -0
- package/dist/apps/services/external-id-generation.js.map +1 -0
- package/dist/apps/services/fetch.d.ts +12 -0
- package/dist/apps/services/fetch.js +95 -0
- package/dist/apps/services/fetch.js.map +1 -0
- package/dist/apps/services/forms-key.d.ts +51 -0
- package/dist/apps/services/forms-key.js +83 -0
- package/dist/apps/services/forms-key.js.map +1 -0
- package/dist/apps/services/generate-generic-error.d.ts +3 -0
- package/dist/apps/services/generate-generic-error.js +52 -0
- package/dist/apps/services/generate-generic-error.js.map +1 -0
- package/dist/apps/services/generateOneBlinkDownloader.d.ts +2 -0
- package/dist/apps/services/generateOneBlinkDownloader.js +11 -0
- package/dist/apps/services/generateOneBlinkDownloader.js.map +1 -0
- package/dist/apps/services/generateOneBlinkUploader.d.ts +2 -0
- package/dist/apps/services/generateOneBlinkUploader.js +11 -0
- package/dist/apps/services/generateOneBlinkUploader.js.map +1 -0
- package/dist/apps/services/getDeviceInformation.d.ts +17 -0
- package/dist/apps/services/getDeviceInformation.js +38 -0
- package/dist/apps/services/getDeviceInformation.js.map +1 -0
- package/dist/apps/services/integration-elements.d.ts +383 -0
- package/dist/apps/services/integration-elements.js +761 -0
- package/dist/apps/services/integration-elements.js.map +1 -0
- package/dist/apps/services/job-prefill.d.ts +40 -0
- package/dist/apps/services/job-prefill.js +78 -0
- package/dist/apps/services/job-prefill.js.map +1 -0
- package/dist/apps/services/payment-providers/BPOINTPaymentProvider.d.ts +29 -0
- package/dist/apps/services/payment-providers/BPOINTPaymentProvider.js +59 -0
- package/dist/apps/services/payment-providers/BPOINTPaymentProvider.js.map +1 -0
- package/dist/apps/services/payment-providers/CPPayPaymentProvider.d.ts +27 -0
- package/dist/apps/services/payment-providers/CPPayPaymentProvider.js +63 -0
- package/dist/apps/services/payment-providers/CPPayPaymentProvider.js.map +1 -0
- package/dist/apps/services/payment-providers/NSWGovPayPaymentProvider.d.ts +30 -0
- package/dist/apps/services/payment-providers/NSWGovPayPaymentProvider.js +116 -0
- package/dist/apps/services/payment-providers/NSWGovPayPaymentProvider.js.map +1 -0
- package/dist/apps/services/payment-providers/WestpacQuickStreamPaymentProvider.d.ts +49 -0
- package/dist/apps/services/payment-providers/WestpacQuickStreamPaymentProvider.js +116 -0
- package/dist/apps/services/payment-providers/WestpacQuickStreamPaymentProvider.js.map +1 -0
- package/dist/apps/services/payment-providers/receipt-items.d.ts +8 -0
- package/dist/apps/services/payment-providers/receipt-items.js +58 -0
- package/dist/apps/services/payment-providers/receipt-items.js.map +1 -0
- package/dist/apps/services/pending-queue.d.ts +150 -0
- package/dist/apps/services/pending-queue.js +316 -0
- package/dist/apps/services/pending-queue.js.map +1 -0
- package/dist/apps/services/prepareSubmissionData.d.ts +2 -0
- package/dist/apps/services/prepareSubmissionData.js +113 -0
- package/dist/apps/services/prepareSubmissionData.js.map +1 -0
- package/dist/apps/services/query-string.d.ts +1 -0
- package/dist/apps/services/query-string.js +16 -0
- package/dist/apps/services/query-string.js.map +1 -0
- package/dist/apps/services/replaceInjectablesWithSubmissionValues.d.ts +3 -0
- package/dist/apps/services/replaceInjectablesWithSubmissionValues.js +18 -0
- package/dist/apps/services/replaceInjectablesWithSubmissionValues.js.map +1 -0
- package/dist/apps/services/schedulingHandlers.d.ts +36 -0
- package/dist/apps/services/schedulingHandlers.js +76 -0
- package/dist/apps/services/schedulingHandlers.js.map +1 -0
- package/dist/apps/services/server-validation.d.ts +2 -0
- package/dist/apps/services/server-validation.js +36 -0
- package/dist/apps/services/server-validation.js.map +1 -0
- package/dist/apps/services/serverRequest.d.ts +5 -0
- package/dist/apps/services/serverRequest.js +24 -0
- package/dist/apps/services/serverRequest.js.map +1 -0
- package/dist/apps/services/submit.d.ts +19 -0
- package/dist/apps/services/submit.js +219 -0
- package/dist/apps/services/submit.js.map +1 -0
- package/dist/apps/services/uploadAttachment.d.ts +52 -0
- package/dist/apps/services/uploadAttachment.js +73 -0
- package/dist/apps/services/uploadAttachment.js.map +1 -0
- package/dist/apps/services/user-token.d.ts +27 -0
- package/dist/apps/services/user-token.js +33 -0
- package/dist/apps/services/user-token.js.map +1 -0
- package/dist/apps/services/utils.d.ts +12 -0
- package/dist/apps/services/utils.js +100 -0
- package/dist/apps/services/utils.js.map +1 -0
- package/dist/apps/submission-service.d.ts +226 -0
- package/dist/apps/submission-service.js +425 -0
- package/dist/apps/submission-service.js.map +1 -0
- package/dist/apps/tenants.d.ts +29 -0
- package/dist/apps/tenants.js +127 -0
- package/dist/apps/tenants.js.map +1 -0
- package/dist/apps/types/form.d.ts +4 -0
- package/dist/apps/types/form.js +2 -0
- package/dist/apps/types/form.js.map +1 -0
- package/dist/apps/types/payments.d.ts +45 -0
- package/dist/apps/types/payments.js +2 -0
- package/dist/apps/types/payments.js.map +1 -0
- package/dist/apps/types/scheduling.d.ts +5 -0
- package/dist/apps/types/scheduling.js +2 -0
- package/dist/apps/types/scheduling.js.map +1 -0
- package/dist/apps/types/submissions.d.ts +175 -0
- package/dist/apps/types/submissions.js +2 -0
- package/dist/apps/types/submissions.js.map +1 -0
- package/dist/components/ArcGISWebMap.js +1 -1
- package/dist/components/ArcGISWebMap.js.map +1 -1
- package/dist/components/CustomAccordion.d.ts +3 -3
- package/dist/components/Lists.d.ts +4 -1
- package/dist/components/calendar-bookings/CalendarBookingsCancelForm.js +1 -1
- package/dist/components/calendar-bookings/CalendarBookingsCancelForm.js.map +1 -1
- package/dist/components/calendar-bookings/CalendarBookingsForm.d.ts +1 -1
- package/dist/components/calendar-bookings/CalendarBookingsForm.js +1 -1
- package/dist/components/calendar-bookings/CalendarBookingsForm.js.map +1 -1
- package/dist/components/calendar-bookings/CalendarBookingsReschedulingForm.js +1 -1
- package/dist/components/calendar-bookings/CalendarBookingsReschedulingForm.js.map +1 -1
- package/dist/components/calendar-bookings/ErrorModal.d.ts +1 -1
- package/dist/components/calendar-bookings/ErrorModal.js +1 -1
- package/dist/components/calendar-bookings/ErrorModal.js.map +1 -1
- package/dist/components/downloadable-files/index.d.ts +1 -1
- package/dist/components/downloadable-files/index.js +1 -1
- package/dist/components/downloadable-files/index.js.map +1 -1
- package/dist/components/downloadable-files/resource-components.d.ts +1 -1
- package/dist/components/downloadable-files/resource-components.js +1 -1
- package/dist/components/downloadable-files/resource-components.js.map +1 -1
- package/dist/components/formStore/FormStoreTableProvider.js +1 -1
- package/dist/components/formStore/FormStoreTableProvider.js.map +1 -1
- package/dist/components/formStore/OneBlinkFormStoreClearFiltersButton.js.map +1 -1
- package/dist/components/formStore/OneBlinkFormStoreDownloadButton.js +1 -1
- package/dist/components/formStore/OneBlinkFormStoreDownloadButton.js.map +1 -1
- package/dist/components/formStore/OneBlinkFormStoreProvider.js +1 -1
- package/dist/components/formStore/OneBlinkFormStoreProvider.js.map +1 -1
- package/dist/components/formStore/OneBlinkFormStoreTable.js.map +1 -1
- package/dist/components/formStore/display/ElementDisplay.js +2 -2
- package/dist/components/formStore/display/ElementDisplay.js.map +1 -1
- package/dist/components/formStore/table/ColumnFilters.js +1 -1
- package/dist/components/formStore/table/ColumnFilters.js.map +1 -1
- package/dist/components/formStore/table/FormElementTableCell.js +1 -1
- package/dist/components/formStore/table/FormElementTableCell.js.map +1 -1
- package/dist/components/formStore/table/Pickers.js +1 -1
- package/dist/components/formStore/table/Pickers.js.map +1 -1
- package/dist/components/formStore/table/generateColumns.d.ts +1 -1
- package/dist/components/formStore/table/generateColumns.js.map +1 -1
- package/dist/components/formStore/table/useFormStoreTable.d.ts +1 -1
- package/dist/components/formStore/table/useFormStoreTable.js +1 -1
- package/dist/components/formStore/table/useFormStoreTable.js.map +1 -1
- package/dist/components/formStore/useFormStoreTableContext.d.ts +2 -2
- package/dist/components/mfa/MfaDialog.d.ts +1 -1
- package/dist/components/mfa/MfaDialog.js +1 -1
- package/dist/components/mfa/MfaDialog.js.map +1 -1
- package/dist/components/mfa/MultiFactorAuthentication.d.ts +1 -1
- package/dist/components/payments/PaymentForm.js +1 -1
- package/dist/components/payments/PaymentForm.js.map +1 -1
- package/dist/components/payments/WestpacQuickStreamPaymentForm.d.ts +1 -1
- package/dist/components/payments/WestpacQuickStreamPaymentForm.js +1 -1
- package/dist/components/payments/WestpacQuickStreamPaymentForm.js.map +1 -1
- package/dist/components/renderer/AutocompleteDropdown.js +1 -1
- package/dist/components/renderer/AutocompleteDropdown.js.map +1 -1
- package/dist/components/renderer/LookupNotification.js +2 -2
- package/dist/components/renderer/LookupNotification.js.map +1 -1
- package/dist/components/renderer/OneBlinkAppsErrorOriginalMessage.js +1 -1
- package/dist/components/renderer/OneBlinkAppsErrorOriginalMessage.js.map +1 -1
- package/dist/components/renderer/OneBlinkFormElements.js.map +1 -1
- package/dist/components/renderer/ReverseGeocode.js +1 -1
- package/dist/components/renderer/ReverseGeocode.js.map +1 -1
- package/dist/form-elements/FormElementAPINSWLiquorLicence.js +1 -1
- package/dist/form-elements/FormElementAPINSWLiquorLicence.js.map +1 -1
- package/dist/form-elements/FormElementArcGISWebMap.js.map +1 -1
- package/dist/form-elements/FormElementAutocomplete.js +1 -1
- package/dist/form-elements/FormElementAutocomplete.js.map +1 -1
- package/dist/form-elements/FormElementBSB.js +1 -1
- package/dist/form-elements/FormElementBSB.js.map +1 -1
- package/dist/form-elements/FormElementCalculation.js +2 -2
- package/dist/form-elements/FormElementCalculation.js.map +1 -1
- package/dist/form-elements/FormElementCivicaNameRecord.js +1 -1
- package/dist/form-elements/FormElementCivicaNameRecord.js.map +1 -1
- package/dist/form-elements/FormElementCivicaStreetName.js +1 -1
- package/dist/form-elements/FormElementCivicaStreetName.js.map +1 -1
- package/dist/form-elements/FormElementCompliance.d.ts +1 -1
- package/dist/form-elements/FormElementCompliance.js.map +1 -1
- package/dist/form-elements/FormElementDate.js +1 -1
- package/dist/form-elements/FormElementDate.js.map +1 -1
- package/dist/form-elements/FormElementDateTime.js +1 -1
- package/dist/form-elements/FormElementDateTime.js.map +1 -1
- package/dist/form-elements/FormElementFile.d.ts +1 -1
- package/dist/form-elements/FormElementFile.js.map +1 -1
- package/dist/form-elements/FormElementFiles.d.ts +1 -1
- package/dist/form-elements/FormElementFiles.js.map +1 -1
- package/dist/form-elements/FormElementGeoscapeAddress.js +1 -1
- package/dist/form-elements/FormElementGeoscapeAddress.js.map +1 -1
- package/dist/form-elements/FormElementGoogleAddress.js +1 -1
- package/dist/form-elements/FormElementGoogleAddress.js.map +1 -1
- package/dist/form-elements/FormElementLocation.js +1 -1
- package/dist/form-elements/FormElementLocation.js.map +1 -1
- package/dist/form-elements/FormElementNumber.js +1 -1
- package/dist/form-elements/FormElementNumber.js.map +1 -1
- package/dist/form-elements/FormElementPointAddress.js +1 -1
- package/dist/form-elements/FormElementPointAddress.js.map +1 -1
- package/dist/form-elements/FormElementPointAddressV3.js +1 -1
- package/dist/form-elements/FormElementPointAddressV3.js.map +1 -1
- package/dist/form-elements/FormElementPointCadastralParcel.js +1 -1
- package/dist/form-elements/FormElementPointCadastralParcel.js.map +1 -1
- package/dist/form-elements/FormElementSummary.js +1 -1
- package/dist/form-elements/FormElementSummary.js.map +1 -1
- package/dist/form-elements/FormElementTime.js +1 -1
- package/dist/form-elements/FormElementTime.js.map +1 -1
- package/dist/hooks/attachments/useAttachment.d.ts +1 -1
- package/dist/hooks/attachments/useAttachment.js +1 -1
- package/dist/hooks/attachments/useAttachment.js.map +1 -1
- package/dist/hooks/attachments/useAttachments.d.ts +1 -1
- package/dist/hooks/attachments/useAttachments.js.map +1 -1
- package/dist/hooks/useAuth.js +1 -1
- package/dist/hooks/useAuth.js.map +1 -1
- package/dist/hooks/useConditionalLogic.js +1 -1
- package/dist/hooks/useConditionalLogic.js.map +1 -1
- package/dist/hooks/useDrafts.d.ts +1 -1
- package/dist/hooks/useDrafts.js +1 -1
- package/dist/hooks/useDrafts.js.map +1 -1
- package/dist/hooks/useDynamicOptionsLoaderState.d.ts +1 -1
- package/dist/hooks/useDynamicOptionsLoaderState.js +1 -1
- package/dist/hooks/useDynamicOptionsLoaderState.js.map +1 -1
- package/dist/hooks/useFormElementLookups.d.ts +1 -1
- package/dist/hooks/useFormElementLookups.js +1 -1
- package/dist/hooks/useFormElementLookups.js.map +1 -1
- package/dist/hooks/useFormSubmissionAutoSaveState.d.ts +1 -1
- package/dist/hooks/useFormSubmissionAutoSaveState.js +1 -1
- package/dist/hooks/useFormSubmissionAutoSaveState.js.map +1 -1
- package/dist/hooks/useIsOffline.js +1 -1
- package/dist/hooks/useIsOffline.js.map +1 -1
- package/dist/hooks/useLogin.js +1 -1
- package/dist/hooks/useLogin.js.map +1 -1
- package/dist/hooks/useMfa.d.ts +1 -1
- package/dist/hooks/useMfa.js +1 -1
- package/dist/hooks/useMfa.js.map +1 -1
- package/dist/hooks/useOnUploadAttachment.d.ts +1 -1
- package/dist/hooks/useOnUploadAttachment.js +1 -1
- package/dist/hooks/useOnUploadAttachment.js.map +1 -1
- package/dist/hooks/usePendingSubmissions.d.ts +1 -1
- package/dist/hooks/usePendingSubmissions.js +1 -1
- package/dist/hooks/usePendingSubmissions.js.map +1 -1
- package/dist/hooks/useReplaceableText.js +1 -1
- package/dist/hooks/useReplaceableText.js.map +1 -1
- package/dist/hooks/useSignUp.js +1 -1
- package/dist/hooks/useSignUp.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/attachments.d.ts +1 -1
- package/dist/services/attachments.js +1 -1
- package/dist/services/attachments.js.map +1 -1
- package/dist/services/blob-utils.js +1 -1
- package/dist/services/blob-utils.js.map +1 -1
- package/dist/services/checkIfAttachmentsExist.d.ts +1 -1
- package/dist/services/checkIfAttachmentsExist.js.map +1 -1
- package/dist/services/defaultCoordinates.js +1 -1
- package/dist/services/defaultCoordinates.js.map +1 -1
- package/dist/services/download-file.d.ts +1 -1
- package/dist/services/download-file.js +2 -2
- package/dist/services/download-file.js.map +1 -1
- package/dist/services/drawTimestampOnCanvas.js +1 -1
- package/dist/services/drawTimestampOnCanvas.js.map +1 -1
- package/dist/services/form-validation/validateSubmission.js +1 -1
- package/dist/services/form-validation/validateSubmission.js.map +1 -1
- package/dist/services/form-validation/validators.d.ts +1 -1
- package/dist/services/form-validation/validators.js.map +1 -1
- package/dist/services/generate-default-data.js +1 -1
- package/dist/services/generate-default-data.js.map +1 -1
- package/dist/services/injectableOptions.js +1 -1
- package/dist/services/injectableOptions.js.map +1 -1
- package/dist/styles.css +208 -204
- package/dist/types/attachments.d.ts +1 -1
- package/dist/types/attachments.js.map +1 -1
- package/dist/utils/sendGoogleAnalyticsEvent.js +1 -1
- package/dist/utils/sendGoogleAnalyticsEvent.js.map +1 -1
- package/package.json +42 -34
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { jwtDecode } from 'jwt-decode';
|
|
2
|
+
import AWSCognitoClient from './AWSCognitoClient';
|
|
3
|
+
import * as offlineService from '../offline-service';
|
|
4
|
+
import { userService } from '@oneblink/sdk-core';
|
|
5
|
+
import { postRequest } from './fetch';
|
|
6
|
+
import tenants from '../tenants';
|
|
7
|
+
import OneBlinkAppsError from './errors/oneBlinkAppsError';
|
|
8
|
+
const CONTINUE_TO = 'continueTo';
|
|
9
|
+
let awsCognitoClient = null;
|
|
10
|
+
function init(cognitoServiceData) {
|
|
11
|
+
console.log('Initiating CognitoIdentityServiceProvider', cognitoServiceData);
|
|
12
|
+
awsCognitoClient = new AWSCognitoClient({
|
|
13
|
+
clientId: cognitoServiceData.oAuthClientId,
|
|
14
|
+
region: cognitoServiceData.region,
|
|
15
|
+
loginDomain: cognitoServiceData.loginDomain,
|
|
16
|
+
redirectUri: cognitoServiceData.redirectUri,
|
|
17
|
+
logoutUri: cognitoServiceData.logoutUri,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Register a listener function that will be call when authentication tokens are
|
|
22
|
+
* updated or removed.
|
|
23
|
+
*
|
|
24
|
+
* #### Example
|
|
25
|
+
*
|
|
26
|
+
* ```js
|
|
27
|
+
* const listener = async () => {
|
|
28
|
+
* // Check if the user is logged in still
|
|
29
|
+
* const isLoggedIn = authService.isLoggedIn()
|
|
30
|
+
* }
|
|
31
|
+
* const deregister = await authService.registerAuthListener(listener)
|
|
32
|
+
*
|
|
33
|
+
* // When no longer needed, remember to deregister the listener
|
|
34
|
+
* deregister()
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @param listener
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
40
|
+
function registerAuthListener(listener) {
|
|
41
|
+
if (!awsCognitoClient) {
|
|
42
|
+
throw new Error('"authService" has not been initiated. You must call the init() function before attempting to register a listener.');
|
|
43
|
+
}
|
|
44
|
+
return awsCognitoClient.registerListener(listener);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Create a session for a user by entering a username and password. If the user
|
|
48
|
+
* requires a password reset, the "resetPasswordCallback" property will be
|
|
49
|
+
* returned. This function should be called with the new password once entered
|
|
50
|
+
* by the user. If the user requires an MFA token, the "mfaCodeCallback"
|
|
51
|
+
* property will be returned. This function should be called with a one-time
|
|
52
|
+
* token generated from an authenticator app. The functions returned are
|
|
53
|
+
* recursive and the result from each of them is the same result from the
|
|
54
|
+
* loginUsernamePassword() function. Each time the response includes a callback,
|
|
55
|
+
* you will need to begin the process again until all callbacks are handled.
|
|
56
|
+
*
|
|
57
|
+
* #### Example
|
|
58
|
+
*
|
|
59
|
+
* ```js
|
|
60
|
+
* async function handleLoginAttemptResponse({
|
|
61
|
+
* resetPasswordCallback,
|
|
62
|
+
* mfaCodeCallback,
|
|
63
|
+
* }) {
|
|
64
|
+
* // "resetPasswordCallback" will be undefined if a password reset was not required.
|
|
65
|
+
* if (resetPasswordCallback) {
|
|
66
|
+
* // Prompt the user to enter a new password
|
|
67
|
+
* const newPassword = prompt(
|
|
68
|
+
* 'The password you entered was only temporary, and must be reset for security purposes. Please enter your new password below to continue.',
|
|
69
|
+
* )
|
|
70
|
+
* const resetPasswordResponse =
|
|
71
|
+
* await resetPasswordCallback(newPassword)
|
|
72
|
+
* return await handleLoginAttemptResponse(resetPasswordResponse)
|
|
73
|
+
* }
|
|
74
|
+
*
|
|
75
|
+
* // "mfaCodeCallback" will be undefined if MFA is not setup.
|
|
76
|
+
* if (mfaCodeCallback) {
|
|
77
|
+
* // Prompt the user to enter an MFA code
|
|
78
|
+
* const code = prompt(
|
|
79
|
+
* 'Please enter a one-time code from your MFA app.',
|
|
80
|
+
* )
|
|
81
|
+
* const mfaCodeResponse = await mfaCodeCallback(code)
|
|
82
|
+
* return await handleLoginAttemptResponse(mfaCodeResponse)
|
|
83
|
+
* }
|
|
84
|
+
* }
|
|
85
|
+
*
|
|
86
|
+
* const username = 'user@email.io'
|
|
87
|
+
* const password = 'P@$5w0rd'
|
|
88
|
+
*
|
|
89
|
+
* const loginAttemptResponse = await authService.loginUsernamePassword(
|
|
90
|
+
* username,
|
|
91
|
+
* password,
|
|
92
|
+
* )
|
|
93
|
+
*
|
|
94
|
+
* await handleLoginAttemptResponse(loginAttemptResponse)
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* @param username
|
|
98
|
+
* @param password
|
|
99
|
+
* @returns
|
|
100
|
+
*/
|
|
101
|
+
async function loginUsernamePassword(username, password) {
|
|
102
|
+
if (!awsCognitoClient) {
|
|
103
|
+
throw new Error('"authService" has not been initiated. You must call the init() function before attempting to login.');
|
|
104
|
+
}
|
|
105
|
+
console.log('Attempting sign using username', username);
|
|
106
|
+
return awsCognitoClient.loginUsernamePassword(username.toLowerCase(), password);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Redirect the user to the login screen. Passing an `identityProvider` is
|
|
110
|
+
* optionally, it will allow users to skip the login page and be directed
|
|
111
|
+
* straight to that providers login page
|
|
112
|
+
*
|
|
113
|
+
* #### Example
|
|
114
|
+
*
|
|
115
|
+
* ```js
|
|
116
|
+
* // OPtionally pass a
|
|
117
|
+
* const identityProvider = 'Google'
|
|
118
|
+
* await authService.loginHostedUI(identityProvider)
|
|
119
|
+
* // User will be redirected to login page or promise will resolve
|
|
120
|
+
* ```
|
|
121
|
+
*
|
|
122
|
+
* @param identityProviderName
|
|
123
|
+
* @returns
|
|
124
|
+
*/
|
|
125
|
+
async function loginHostedUI(identityProviderName) {
|
|
126
|
+
if (!awsCognitoClient) {
|
|
127
|
+
throw new Error('"authService" has not been initiated. You must call the init() function before attempting to login.');
|
|
128
|
+
}
|
|
129
|
+
const continueTo = `${window.location.pathname}${window.location.search}`;
|
|
130
|
+
localStorage.setItem(CONTINUE_TO, continueTo);
|
|
131
|
+
return awsCognitoClient.loginHostedUI(identityProviderName);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* This function should be called when the user is redirected back to your app
|
|
135
|
+
* after a login attempt. It will use the query string add the redirect URL to
|
|
136
|
+
* create a session for the current user. It will return a URL as a `string`
|
|
137
|
+
* that should be redirected to within your app.
|
|
138
|
+
*
|
|
139
|
+
* #### Example
|
|
140
|
+
*
|
|
141
|
+
* ```js
|
|
142
|
+
* try {
|
|
143
|
+
* const continueTo = await authService.handleAuthentication()
|
|
144
|
+
* // Redirect the user back to where they were before attempting to login
|
|
145
|
+
* window.location.href = continueTo
|
|
146
|
+
* } catch (error) {
|
|
147
|
+
* // handle failed login attempts here.
|
|
148
|
+
* }
|
|
149
|
+
* ```
|
|
150
|
+
*
|
|
151
|
+
* @returns
|
|
152
|
+
*/
|
|
153
|
+
async function handleAuthentication() {
|
|
154
|
+
if (!awsCognitoClient) {
|
|
155
|
+
throw new Error('"authService" has not been initiated. You must call the init() function before attempting to handle authentication in URL.');
|
|
156
|
+
}
|
|
157
|
+
const continueTo = localStorage.getItem(CONTINUE_TO) || '/';
|
|
158
|
+
if (isLoggedIn()) {
|
|
159
|
+
console.log('Already authenticated, redirecting to:', continueTo);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
await awsCognitoClient.handleAuthentication();
|
|
163
|
+
}
|
|
164
|
+
localStorage.removeItem(CONTINUE_TO);
|
|
165
|
+
return continueTo;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Allow the currently logged in user to change their password by passing their
|
|
169
|
+
* existing password and a new password.
|
|
170
|
+
*
|
|
171
|
+
* #### Example
|
|
172
|
+
*
|
|
173
|
+
* ```js
|
|
174
|
+
* const currentPassword = 'P@$5w0rd'
|
|
175
|
+
* const newPassword = 'P@$5w0rD'
|
|
176
|
+
* await authService.changePassword(currentPassword, newPassword)
|
|
177
|
+
* ```
|
|
178
|
+
*
|
|
179
|
+
* @param existingPassword
|
|
180
|
+
* @param newPassword
|
|
181
|
+
* @returns
|
|
182
|
+
*/
|
|
183
|
+
async function changePassword(existingPassword, newPassword) {
|
|
184
|
+
if (!awsCognitoClient) {
|
|
185
|
+
throw new Error('"authService" has not been initiated. You must call the init() function before attempting to change passwords.');
|
|
186
|
+
}
|
|
187
|
+
return await awsCognitoClient.changePassword(existingPassword, newPassword);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Allow a user to start the forgot password process. The user will be emailed a
|
|
191
|
+
* temporary code that must be passed with a new password to the function
|
|
192
|
+
* returned.
|
|
193
|
+
*
|
|
194
|
+
* #### Example
|
|
195
|
+
*
|
|
196
|
+
* ```js
|
|
197
|
+
* const username = 'user@email.io'
|
|
198
|
+
* const finishForgotPassword = await authService.forgotPassword(username)
|
|
199
|
+
*
|
|
200
|
+
* // Prompt the user to enter the code and a new password
|
|
201
|
+
* const code = prompt(
|
|
202
|
+
* 'You have been emailed a verification code, please enter it here.',
|
|
203
|
+
* )
|
|
204
|
+
* const newPassword = prompt('Please enter a new password to continue.')
|
|
205
|
+
* await finishForgotPassword(code, newPassword)
|
|
206
|
+
* ```
|
|
207
|
+
*
|
|
208
|
+
* @param username
|
|
209
|
+
* @param formsAppId Used to give the resulting email sent to the user
|
|
210
|
+
* associated forms app branding and sending address
|
|
211
|
+
* @returns
|
|
212
|
+
*/
|
|
213
|
+
async function forgotPassword(username,
|
|
214
|
+
/**
|
|
215
|
+
* Used to give the resulting email sent to the user associated forms app
|
|
216
|
+
* branding and sending address
|
|
217
|
+
*/
|
|
218
|
+
formsAppId) {
|
|
219
|
+
if (!awsCognitoClient) {
|
|
220
|
+
throw new Error('"authService" has not been initiated. You must call the init() function before starting the forgot password process.');
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
const url = `${tenants.current.apiOrigin}/authentication/reset-password`;
|
|
224
|
+
await postRequest(url, {
|
|
225
|
+
username,
|
|
226
|
+
formsAppId,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
const error = err;
|
|
231
|
+
switch (error.status) {
|
|
232
|
+
case 400: {
|
|
233
|
+
throw new OneBlinkAppsError(error.message, {
|
|
234
|
+
title: 'Invalid Request',
|
|
235
|
+
httpStatusCode: error.status,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
default: {
|
|
239
|
+
throw new OneBlinkAppsError('An unknown error has occurred. Please contact support if the problem persists.', {
|
|
240
|
+
originalError: error,
|
|
241
|
+
httpStatusCode: error.status,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return async (code, password) => {
|
|
247
|
+
await (awsCognitoClient === null || awsCognitoClient === void 0 ? void 0 : awsCognitoClient.confirmForgotPassword({
|
|
248
|
+
username,
|
|
249
|
+
code,
|
|
250
|
+
password,
|
|
251
|
+
}));
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Redirect the user to the logout screen to clear the users session on the
|
|
256
|
+
* hosted login page. User will then be redirected to `/logout`. After being
|
|
257
|
+
* redirected back to the application, the `logout()` function should be called
|
|
258
|
+
* to clear the session data from browser storage.
|
|
259
|
+
*
|
|
260
|
+
* #### Example
|
|
261
|
+
*
|
|
262
|
+
* ```js
|
|
263
|
+
* authService.logoutHostedUI()
|
|
264
|
+
* ```
|
|
265
|
+
*/
|
|
266
|
+
function logoutHostedUI() {
|
|
267
|
+
if (awsCognitoClient) {
|
|
268
|
+
awsCognitoClient.logoutHostedUI();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async function logout() {
|
|
272
|
+
if (awsCognitoClient) {
|
|
273
|
+
await awsCognitoClient.logout();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Check if the user is currently logged in
|
|
278
|
+
*
|
|
279
|
+
* #### Example
|
|
280
|
+
*
|
|
281
|
+
* ```js
|
|
282
|
+
* const isLoggedIn = authService.isLoggedIn()
|
|
283
|
+
* // handle user being logged in or not
|
|
284
|
+
* ```
|
|
285
|
+
*
|
|
286
|
+
* @returns
|
|
287
|
+
*/
|
|
288
|
+
function isLoggedIn() {
|
|
289
|
+
return !!(awsCognitoClient && awsCognitoClient._getRefreshToken());
|
|
290
|
+
}
|
|
291
|
+
async function getCognitoIdToken() {
|
|
292
|
+
if (!awsCognitoClient) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
if (offlineService.isOffline()) {
|
|
296
|
+
return awsCognitoClient._getIdToken();
|
|
297
|
+
}
|
|
298
|
+
return await awsCognitoClient.getIdToken();
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get current users profile based on there Id Token payload. This will return
|
|
302
|
+
* `null` if the the current user is not logged in.
|
|
303
|
+
*
|
|
304
|
+
* #### Example
|
|
305
|
+
*
|
|
306
|
+
* ```js
|
|
307
|
+
* const profile = authService.getUserProfile()
|
|
308
|
+
* if (profile) {
|
|
309
|
+
* // Use profile here
|
|
310
|
+
* }
|
|
311
|
+
* ```
|
|
312
|
+
*
|
|
313
|
+
* @returns
|
|
314
|
+
*/
|
|
315
|
+
function getUserProfile() {
|
|
316
|
+
if (!awsCognitoClient) {
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
const idToken = awsCognitoClient._getIdToken();
|
|
320
|
+
if (!idToken) {
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
const jwtToken = jwtDecode(idToken);
|
|
324
|
+
return userService.parseUserProfile(jwtToken) || null;
|
|
325
|
+
}
|
|
326
|
+
export function getUsername() {
|
|
327
|
+
const profile = getUserProfile();
|
|
328
|
+
if (!profile) {
|
|
329
|
+
return undefined;
|
|
330
|
+
}
|
|
331
|
+
return profile.username;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* A friendly `string` that represents the current user. Uses first name, last
|
|
335
|
+
* name, full name and username. This will return `null` the current user is not
|
|
336
|
+
* logged in.
|
|
337
|
+
*
|
|
338
|
+
* #### Example
|
|
339
|
+
*
|
|
340
|
+
* ```js
|
|
341
|
+
* const name = authService.getUserFriendlyName()
|
|
342
|
+
* if (name) {
|
|
343
|
+
* // Display current user's name
|
|
344
|
+
* }
|
|
345
|
+
* ```
|
|
346
|
+
*
|
|
347
|
+
* @returns
|
|
348
|
+
*/
|
|
349
|
+
function getUserFriendlyName() {
|
|
350
|
+
const profile = getUserProfile();
|
|
351
|
+
if (!profile) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
return userService.getUserFriendlyName(profile);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Generate a QR code link to display to a user after they have initiated MFA
|
|
358
|
+
* setup.
|
|
359
|
+
*
|
|
360
|
+
* #### Example
|
|
361
|
+
*
|
|
362
|
+
* ```js
|
|
363
|
+
* const mfaSetupQrCodeUrl = authService.generateMfaQrCodeUrl()
|
|
364
|
+
* if (mfaSetupQrCodeUrl) {
|
|
365
|
+
* // use mfaSetupQrCodeUrl to display QR code to user
|
|
366
|
+
* }
|
|
367
|
+
* ```
|
|
368
|
+
*
|
|
369
|
+
* @returns
|
|
370
|
+
*/
|
|
371
|
+
function generateMfaQrCodeUrl(mfaSetupConfiguration) {
|
|
372
|
+
const profile = getUserProfile();
|
|
373
|
+
if (!profile || !mfaSetupConfiguration) {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
return `otpauth://totp/${tenants.current.productShortName}:${profile.email}?secret=${mfaSetupConfiguration.secretCode}&issuer=${tenants.current.productShortName}`;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Check if MFA is enabled for this current user.
|
|
380
|
+
*
|
|
381
|
+
* #### Example
|
|
382
|
+
*
|
|
383
|
+
* ```js
|
|
384
|
+
* const isMfaEnabled = await authService.checkIsMfaEnabled()
|
|
385
|
+
* if (isMfaEnabled) {
|
|
386
|
+
* // Allow disabling MFA
|
|
387
|
+
* } else {
|
|
388
|
+
* // Allow enabling MFA
|
|
389
|
+
* }
|
|
390
|
+
* ```
|
|
391
|
+
*
|
|
392
|
+
* @returns
|
|
393
|
+
*/
|
|
394
|
+
async function checkIsMfaEnabled() {
|
|
395
|
+
if (!awsCognitoClient) {
|
|
396
|
+
throw new Error('"authService" has not been initiated. You must call the init() function before checking if the current user has MFA enabled.');
|
|
397
|
+
}
|
|
398
|
+
return await awsCognitoClient.checkIsMfaEnabled();
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Disable MFA for the current user.
|
|
402
|
+
*
|
|
403
|
+
* #### Example
|
|
404
|
+
*
|
|
405
|
+
* ```js
|
|
406
|
+
* await authService.disableMfa()
|
|
407
|
+
* ```
|
|
408
|
+
*
|
|
409
|
+
* @returns
|
|
410
|
+
*/
|
|
411
|
+
async function disableMfa() {
|
|
412
|
+
if (!awsCognitoClient) {
|
|
413
|
+
throw new Error('"authService" has not been initiated. You must call the init() function before attempting to disable MFA.');
|
|
414
|
+
}
|
|
415
|
+
return await awsCognitoClient.disableMfa();
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Setup MFA for the current user. The result will include a callback that
|
|
419
|
+
* should be called with the valid TOTP from an authenticator app.
|
|
420
|
+
*
|
|
421
|
+
* #### Example
|
|
422
|
+
*
|
|
423
|
+
* ```js
|
|
424
|
+
* const { secretCode, mfaCodeCallback } = await authService.setupMfa()
|
|
425
|
+
* // Prompt the user to enter an MFA code
|
|
426
|
+
* const code = prompt(
|
|
427
|
+
* `Please enter a one-time code from your MFA app after creating a new entry with secret: ${secretCode}.`,
|
|
428
|
+
* )
|
|
429
|
+
* await mfaCodeCallback(code)
|
|
430
|
+
* ```
|
|
431
|
+
*
|
|
432
|
+
* @returns
|
|
433
|
+
*/
|
|
434
|
+
async function setupMfa() {
|
|
435
|
+
if (!awsCognitoClient) {
|
|
436
|
+
throw new Error('"authService" has not been initiated. You must call the init() function before attempting to setup MFA.');
|
|
437
|
+
}
|
|
438
|
+
return await awsCognitoClient.setupMfa();
|
|
439
|
+
}
|
|
440
|
+
export { init, registerAuthListener, loginUsernamePassword, loginHostedUI, handleAuthentication, changePassword, forgotPassword, logoutHostedUI, logout, isLoggedIn, getCognitoIdToken, getUserProfile, getUserFriendlyName, checkIsMfaEnabled, disableMfa, setupMfa, generateMfaQrCodeUrl, };
|
|
441
|
+
//# sourceMappingURL=cognito.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cognito.js","sourceRoot":"","sources":["../../../src/apps/services/cognito.ts"],"names":[],"mappings":"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","sourcesContent":["import { jwtDecode } from 'jwt-decode'\n\nimport AWSCognitoClient, { LoginAttemptResponse } from './AWSCognitoClient'\n\nimport * as offlineService from '../offline-service'\nimport { userService } from '@oneblink/sdk-core'\nimport { MiscTypes } from '@oneblink/types'\nimport { HTTPError, postRequest } from './fetch'\nimport tenants from '../tenants'\nimport OneBlinkAppsError from './errors/oneBlinkAppsError'\n\ninterface CognitoServiceData {\n oAuthClientId: string\n loginDomain: string\n region: string\n redirectUri: string\n logoutUri: string\n}\n\nconst CONTINUE_TO = 'continueTo'\n\nlet awsCognitoClient: null | AWSCognitoClient = null\n\nfunction init(cognitoServiceData: CognitoServiceData) {\n console.log('Initiating CognitoIdentityServiceProvider', cognitoServiceData)\n\n awsCognitoClient = new AWSCognitoClient({\n clientId: cognitoServiceData.oAuthClientId,\n region: cognitoServiceData.region,\n loginDomain: cognitoServiceData.loginDomain,\n redirectUri: cognitoServiceData.redirectUri,\n logoutUri: cognitoServiceData.logoutUri,\n })\n}\n\n/**\n * Register a listener function that will be call when authentication tokens are\n * updated or removed.\n *\n * #### Example\n *\n * ```js\n * const listener = async () => {\n * // Check if the user is logged in still\n * const isLoggedIn = authService.isLoggedIn()\n * }\n * const deregister = await authService.registerAuthListener(listener)\n *\n * // When no longer needed, remember to deregister the listener\n * deregister()\n * ```\n *\n * @param listener\n * @returns\n */\nfunction registerAuthListener(listener: () => unknown): () => void {\n if (!awsCognitoClient) {\n throw new Error(\n '\"authService\" has not been initiated. You must call the init() function before attempting to register a listener.',\n )\n }\n return awsCognitoClient.registerListener(listener)\n}\n\n/**\n * Create a session for a user by entering a username and password. If the user\n * requires a password reset, the \"resetPasswordCallback\" property will be\n * returned. This function should be called with the new password once entered\n * by the user. If the user requires an MFA token, the \"mfaCodeCallback\"\n * property will be returned. This function should be called with a one-time\n * token generated from an authenticator app. The functions returned are\n * recursive and the result from each of them is the same result from the\n * loginUsernamePassword() function. Each time the response includes a callback,\n * you will need to begin the process again until all callbacks are handled.\n *\n * #### Example\n *\n * ```js\n * async function handleLoginAttemptResponse({\n * resetPasswordCallback,\n * mfaCodeCallback,\n * }) {\n * // \"resetPasswordCallback\" will be undefined if a password reset was not required.\n * if (resetPasswordCallback) {\n * // Prompt the user to enter a new password\n * const newPassword = prompt(\n * 'The password you entered was only temporary, and must be reset for security purposes. Please enter your new password below to continue.',\n * )\n * const resetPasswordResponse =\n * await resetPasswordCallback(newPassword)\n * return await handleLoginAttemptResponse(resetPasswordResponse)\n * }\n *\n * // \"mfaCodeCallback\" will be undefined if MFA is not setup.\n * if (mfaCodeCallback) {\n * // Prompt the user to enter an MFA code\n * const code = prompt(\n * 'Please enter a one-time code from your MFA app.',\n * )\n * const mfaCodeResponse = await mfaCodeCallback(code)\n * return await handleLoginAttemptResponse(mfaCodeResponse)\n * }\n * }\n *\n * const username = 'user@email.io'\n * const password = 'P@$5w0rd'\n *\n * const loginAttemptResponse = await authService.loginUsernamePassword(\n * username,\n * password,\n * )\n *\n * await handleLoginAttemptResponse(loginAttemptResponse)\n * ```\n *\n * @param username\n * @param password\n * @returns\n */\nasync function loginUsernamePassword(username: string, password: string) {\n if (!awsCognitoClient) {\n throw new Error(\n '\"authService\" has not been initiated. You must call the init() function before attempting to login.',\n )\n }\n console.log('Attempting sign using username', username)\n return awsCognitoClient.loginUsernamePassword(\n username.toLowerCase(),\n password,\n )\n}\n\n/**\n * Redirect the user to the login screen. Passing an `identityProvider` is\n * optionally, it will allow users to skip the login page and be directed\n * straight to that providers login page\n *\n * #### Example\n *\n * ```js\n * // OPtionally pass a\n * const identityProvider = 'Google'\n * await authService.loginHostedUI(identityProvider)\n * // User will be redirected to login page or promise will resolve\n * ```\n *\n * @param identityProviderName\n * @returns\n */\nasync function loginHostedUI(identityProviderName?: string): Promise<void> {\n if (!awsCognitoClient) {\n throw new Error(\n '\"authService\" has not been initiated. You must call the init() function before attempting to login.',\n )\n }\n const continueTo = `${window.location.pathname}${window.location.search}`\n localStorage.setItem(CONTINUE_TO, continueTo)\n\n return awsCognitoClient.loginHostedUI(identityProviderName)\n}\n\n/**\n * This function should be called when the user is redirected back to your app\n * after a login attempt. It will use the query string add the redirect URL to\n * create a session for the current user. It will return a URL as a `string`\n * that should be redirected to within your app.\n *\n * #### Example\n *\n * ```js\n * try {\n * const continueTo = await authService.handleAuthentication()\n * // Redirect the user back to where they were before attempting to login\n * window.location.href = continueTo\n * } catch (error) {\n * // handle failed login attempts here.\n * }\n * ```\n *\n * @returns\n */\nasync function handleAuthentication(): Promise<string> {\n if (!awsCognitoClient) {\n throw new Error(\n '\"authService\" has not been initiated. You must call the init() function before attempting to handle authentication in URL.',\n )\n }\n\n const continueTo = localStorage.getItem(CONTINUE_TO) || '/'\n if (isLoggedIn()) {\n console.log('Already authenticated, redirecting to:', continueTo)\n } else {\n await awsCognitoClient.handleAuthentication()\n }\n\n localStorage.removeItem(CONTINUE_TO)\n\n return continueTo\n}\n\n/**\n * Allow the currently logged in user to change their password by passing their\n * existing password and a new password.\n *\n * #### Example\n *\n * ```js\n * const currentPassword = 'P@$5w0rd'\n * const newPassword = 'P@$5w0rD'\n * await authService.changePassword(currentPassword, newPassword)\n * ```\n *\n * @param existingPassword\n * @param newPassword\n * @returns\n */\nasync function changePassword(existingPassword: string, newPassword: string) {\n if (!awsCognitoClient) {\n throw new Error(\n '\"authService\" has not been initiated. You must call the init() function before attempting to change passwords.',\n )\n }\n\n return await awsCognitoClient.changePassword(existingPassword, newPassword)\n}\n\n/**\n * Allow a user to start the forgot password process. The user will be emailed a\n * temporary code that must be passed with a new password to the function\n * returned.\n *\n * #### Example\n *\n * ```js\n * const username = 'user@email.io'\n * const finishForgotPassword = await authService.forgotPassword(username)\n *\n * // Prompt the user to enter the code and a new password\n * const code = prompt(\n * 'You have been emailed a verification code, please enter it here.',\n * )\n * const newPassword = prompt('Please enter a new password to continue.')\n * await finishForgotPassword(code, newPassword)\n * ```\n *\n * @param username\n * @param formsAppId Used to give the resulting email sent to the user\n * associated forms app branding and sending address\n * @returns\n */\nasync function forgotPassword(\n username: string,\n /**\n * Used to give the resulting email sent to the user associated forms app\n * branding and sending address\n */\n formsAppId?: number,\n): Promise<(code: string, password: string) => Promise<void>> {\n if (!awsCognitoClient) {\n throw new Error(\n '\"authService\" has not been initiated. You must call the init() function before starting the forgot password process.',\n )\n }\n\n try {\n const url = `${tenants.current.apiOrigin}/authentication/reset-password`\n await postRequest(url, {\n username,\n formsAppId,\n })\n } catch (err) {\n const error = err as HTTPError\n switch (error.status) {\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n title: 'Invalid Request',\n httpStatusCode: error.status,\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 httpStatusCode: error.status,\n },\n )\n }\n }\n }\n\n return async (code, password) => {\n await awsCognitoClient?.confirmForgotPassword({\n username,\n code,\n password,\n })\n }\n}\n\n/**\n * Redirect the user to the logout screen to clear the users session on the\n * hosted login page. User will then be redirected to `/logout`. After being\n * redirected back to the application, the `logout()` function should be called\n * to clear the session data from browser storage.\n *\n * #### Example\n *\n * ```js\n * authService.logoutHostedUI()\n * ```\n */\nfunction logoutHostedUI(): void {\n if (awsCognitoClient) {\n awsCognitoClient.logoutHostedUI()\n }\n}\n\nasync function logout() {\n if (awsCognitoClient) {\n await awsCognitoClient.logout()\n }\n}\n\n/**\n * Check if the user is currently logged in\n *\n * #### Example\n *\n * ```js\n * const isLoggedIn = authService.isLoggedIn()\n * // handle user being logged in or not\n * ```\n *\n * @returns\n */\nfunction isLoggedIn(): boolean {\n return !!(awsCognitoClient && awsCognitoClient._getRefreshToken())\n}\n\nasync function getCognitoIdToken(): Promise<string | undefined> {\n if (!awsCognitoClient) {\n return\n }\n\n if (offlineService.isOffline()) {\n return awsCognitoClient._getIdToken()\n }\n\n return await awsCognitoClient.getIdToken()\n}\n\n/**\n * Get current users profile based on there Id Token payload. This will return\n * `null` if the the current user is not logged in.\n *\n * #### Example\n *\n * ```js\n * const profile = authService.getUserProfile()\n * if (profile) {\n * // Use profile here\n * }\n * ```\n *\n * @returns\n */\nfunction getUserProfile(): MiscTypes.UserProfile | null {\n if (!awsCognitoClient) {\n return null\n }\n const idToken = awsCognitoClient._getIdToken()\n if (!idToken) {\n return null\n }\n\n const jwtToken = jwtDecode(idToken)\n return userService.parseUserProfile(jwtToken) || null\n}\n\nexport function getUsername(): string | undefined {\n const profile = getUserProfile()\n if (!profile) {\n return undefined\n }\n\n return profile.username\n}\n\n/**\n * A friendly `string` that represents the current user. Uses first name, last\n * name, full name and username. This will return `null` the current user is not\n * logged in.\n *\n * #### Example\n *\n * ```js\n * const name = authService.getUserFriendlyName()\n * if (name) {\n * // Display current user's name\n * }\n * ```\n *\n * @returns\n */\nfunction getUserFriendlyName(): string | undefined {\n const profile = getUserProfile()\n if (!profile) {\n return\n }\n\n return userService.getUserFriendlyName(profile)\n}\n\n/**\n * Generate a QR code link to display to a user after they have initiated MFA\n * setup.\n *\n * #### Example\n *\n * ```js\n * const mfaSetupQrCodeUrl = authService.generateMfaQrCodeUrl()\n * if (mfaSetupQrCodeUrl) {\n * // use mfaSetupQrCodeUrl to display QR code to user\n * }\n * ```\n *\n * @returns\n */\nfunction generateMfaQrCodeUrl(\n mfaSetupConfiguration: Awaited<ReturnType<typeof setupMfa>>,\n): string | undefined {\n const profile = getUserProfile()\n if (!profile || !mfaSetupConfiguration) {\n return\n }\n\n return `otpauth://totp/${tenants.current.productShortName}:${profile.email}?secret=${mfaSetupConfiguration.secretCode}&issuer=${tenants.current.productShortName}`\n}\n\n/**\n * Check if MFA is enabled for this current user.\n *\n * #### Example\n *\n * ```js\n * const isMfaEnabled = await authService.checkIsMfaEnabled()\n * if (isMfaEnabled) {\n * // Allow disabling MFA\n * } else {\n * // Allow enabling MFA\n * }\n * ```\n *\n * @returns\n */\nasync function checkIsMfaEnabled() {\n if (!awsCognitoClient) {\n throw new Error(\n '\"authService\" has not been initiated. You must call the init() function before checking if the current user has MFA enabled.',\n )\n }\n\n return await awsCognitoClient.checkIsMfaEnabled()\n}\n\n/**\n * Disable MFA for the current user.\n *\n * #### Example\n *\n * ```js\n * await authService.disableMfa()\n * ```\n *\n * @returns\n */\nasync function disableMfa() {\n if (!awsCognitoClient) {\n throw new Error(\n '\"authService\" has not been initiated. You must call the init() function before attempting to disable MFA.',\n )\n }\n\n return await awsCognitoClient.disableMfa()\n}\n/**\n * Setup MFA for the current user. The result will include a callback that\n * should be called with the valid TOTP from an authenticator app.\n *\n * #### Example\n *\n * ```js\n * const { secretCode, mfaCodeCallback } = await authService.setupMfa()\n * // Prompt the user to enter an MFA code\n * const code = prompt(\n * `Please enter a one-time code from your MFA app after creating a new entry with secret: ${secretCode}.`,\n * )\n * await mfaCodeCallback(code)\n * ```\n *\n * @returns\n */\nasync function setupMfa() {\n if (!awsCognitoClient) {\n throw new Error(\n '\"authService\" has not been initiated. You must call the init() function before attempting to setup MFA.',\n )\n }\n\n return await awsCognitoClient.setupMfa()\n}\n\nexport {\n init,\n registerAuthListener,\n loginUsernamePassword,\n loginHostedUI,\n handleAuthentication,\n changePassword,\n forgotPassword,\n logoutHostedUI,\n logout,\n isLoggedIn,\n getCognitoIdToken,\n getUserProfile,\n getUserFriendlyName,\n LoginAttemptResponse,\n checkIsMfaEnabled,\n disableMfa,\n setupMfa,\n generateMfaQrCodeUrl,\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SubmissionTypes } from '@oneblink/types';
|
|
2
|
+
import { DraftSubmission, ProgressListener } from '../types/submissions';
|
|
3
|
+
export declare function getLocalDraftSubmission(formSubmissionDraftId: string | undefined): Promise<DraftSubmission | null>;
|
|
4
|
+
export declare function removeLocalDraftSubmission(formSubmissionDraftId: undefined | null | string): Promise<void>;
|
|
5
|
+
export declare function saveDraftSubmission({ draftSubmission, autoSaveKey, onProgress, abortSignal, skipUpload, }: {
|
|
6
|
+
draftSubmission: DraftSubmission;
|
|
7
|
+
autoSaveKey: string | undefined;
|
|
8
|
+
onProgress?: ProgressListener;
|
|
9
|
+
abortSignal?: AbortSignal;
|
|
10
|
+
skipUpload?: boolean;
|
|
11
|
+
}): Promise<SubmissionTypes.FormSubmissionDraftVersion | undefined>;
|
|
12
|
+
export declare function deleteDraftData(formSubmissionDraftId: string, abortSignal?: AbortSignal): Promise<{
|
|
13
|
+
hasDeletedRemoteDraft: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function getLatestFormSubmissionDraftVersion(versions: SubmissionTypes.FormSubmissionDraftVersion[] | undefined): SubmissionTypes.FormSubmissionDraftVersion | undefined;
|
|
16
|
+
export declare function getDraftSubmission(formSubmissionDraft: SubmissionTypes.FormSubmissionDraft, abortSignal?: AbortSignal): Promise<DraftSubmission | undefined>;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import utilsService from './utils';
|
|
2
|
+
import { uploadDraftData, downloadDraftData, deleteFormSubmissionDraft, } from './api/drafts';
|
|
3
|
+
import Sentry from '../Sentry';
|
|
4
|
+
import { deleteAutoSaveData } from '../auto-save-service';
|
|
5
|
+
function getLocalDraftSubmissionKey(formSubmissionDraftId) {
|
|
6
|
+
return `DRAFT_SUBMISSION_${formSubmissionDraftId}`;
|
|
7
|
+
}
|
|
8
|
+
export async function getLocalDraftSubmission(formSubmissionDraftId) {
|
|
9
|
+
if (!formSubmissionDraftId) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const key = getLocalDraftSubmissionKey(formSubmissionDraftId);
|
|
13
|
+
return utilsService.getLocalForageItem(key);
|
|
14
|
+
}
|
|
15
|
+
async function setLocalDraftSubmission(draftSubmission) {
|
|
16
|
+
const key = getLocalDraftSubmissionKey(draftSubmission.formSubmissionDraftId);
|
|
17
|
+
return utilsService.setLocalForageItem(key, draftSubmission);
|
|
18
|
+
}
|
|
19
|
+
export async function removeLocalDraftSubmission(formSubmissionDraftId) {
|
|
20
|
+
if (!formSubmissionDraftId) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const key = getLocalDraftSubmissionKey(formSubmissionDraftId);
|
|
24
|
+
return utilsService.removeLocalForageItem(key);
|
|
25
|
+
}
|
|
26
|
+
export async function saveDraftSubmission({ draftSubmission, autoSaveKey, onProgress, abortSignal, skipUpload, }) {
|
|
27
|
+
await setLocalDraftSubmission(draftSubmission);
|
|
28
|
+
if (draftSubmission.backgroundUpload) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
if (!skipUpload) {
|
|
33
|
+
return await uploadDraftData(draftSubmission, onProgress, abortSignal);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// Ignoring all errors here as we don't want draft submission data
|
|
38
|
+
// being saved to the cloud to prevent drafts from being saved on the device
|
|
39
|
+
console.warn('Could not upload Draft Data as JSON', error);
|
|
40
|
+
Sentry.captureException(error);
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
if (typeof autoSaveKey === 'string') {
|
|
44
|
+
try {
|
|
45
|
+
await deleteAutoSaveData(draftSubmission.definition.id, autoSaveKey);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.warn('Error removing auto save data: ', error);
|
|
49
|
+
Sentry.captureException(error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function deleteDraftData(formSubmissionDraftId, abortSignal) {
|
|
55
|
+
try {
|
|
56
|
+
await deleteFormSubmissionDraft(formSubmissionDraftId, abortSignal);
|
|
57
|
+
return {
|
|
58
|
+
hasDeletedRemoteDraft: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.warn('Could not delete remote draft, will attempt to delete again later.', error);
|
|
63
|
+
return {
|
|
64
|
+
hasDeletedRemoteDraft: false,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function getLatestFormSubmissionDraftVersion(versions) {
|
|
69
|
+
return versions === null || versions === void 0 ? void 0 : versions.reduce((memo, formSubmissionDraftVersion) => {
|
|
70
|
+
if (!memo || formSubmissionDraftVersion.createdAt > memo.createdAt) {
|
|
71
|
+
return formSubmissionDraftVersion;
|
|
72
|
+
}
|
|
73
|
+
return memo;
|
|
74
|
+
}, undefined);
|
|
75
|
+
}
|
|
76
|
+
export async function getDraftSubmission(formSubmissionDraft, abortSignal) {
|
|
77
|
+
const latestFormSubmissionDraftVersion = getLatestFormSubmissionDraftVersion(formSubmissionDraft.versions);
|
|
78
|
+
const draftSubmission = await getLocalDraftSubmission(formSubmissionDraft.id);
|
|
79
|
+
// If there is local data and no server data, return local data.
|
|
80
|
+
// Or if the latest server version of the draft is what
|
|
81
|
+
// is currently saved locally, return local data.
|
|
82
|
+
if (draftSubmission &&
|
|
83
|
+
(!latestFormSubmissionDraftVersion ||
|
|
84
|
+
latestFormSubmissionDraftVersion.createdAt <= draftSubmission.createdAt)) {
|
|
85
|
+
return draftSubmission;
|
|
86
|
+
}
|
|
87
|
+
if (!latestFormSubmissionDraftVersion) {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
//drafts will always have a formsAppId
|
|
91
|
+
const s3SubmissionData = (await downloadDraftData(latestFormSubmissionDraftVersion.id, abortSignal));
|
|
92
|
+
return await setLocalDraftSubmission({
|
|
93
|
+
definition: s3SubmissionData.definition,
|
|
94
|
+
submission: s3SubmissionData.submission,
|
|
95
|
+
lastElementUpdated: s3SubmissionData.lastElementUpdated,
|
|
96
|
+
formsAppId: s3SubmissionData.formsAppId,
|
|
97
|
+
jobId: formSubmissionDraft.jobId,
|
|
98
|
+
externalId: formSubmissionDraft.externalId,
|
|
99
|
+
previousFormSubmissionApprovalId: formSubmissionDraft.previousFormSubmissionApprovalId,
|
|
100
|
+
taskCompletion: s3SubmissionData.task &&
|
|
101
|
+
s3SubmissionData.taskAction && {
|
|
102
|
+
task: s3SubmissionData.task,
|
|
103
|
+
taskAction: s3SubmissionData.taskAction,
|
|
104
|
+
taskGroup: s3SubmissionData.taskGroup,
|
|
105
|
+
taskGroupInstance: s3SubmissionData.taskGroupInstance,
|
|
106
|
+
redirectUrl: '',
|
|
107
|
+
},
|
|
108
|
+
title: latestFormSubmissionDraftVersion.title,
|
|
109
|
+
createdAt: latestFormSubmissionDraftVersion.createdAt,
|
|
110
|
+
formSubmissionDraftId: formSubmissionDraft.id,
|
|
111
|
+
sectionState: s3SubmissionData.sectionState,
|
|
112
|
+
previousElapsedDurationSeconds: s3SubmissionData.previousElapsedDurationSeconds,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=draft-data-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-data-store.js","sourceRoot":"","sources":["../../../src/apps/services/draft-data-store.ts"],"names":[],"mappings":"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","sourcesContent":["import utilsService from './utils'\n\nimport {\n uploadDraftData,\n downloadDraftData,\n deleteFormSubmissionDraft,\n} from './api/drafts'\nimport { SubmissionTypes } from '@oneblink/types'\nimport Sentry from '../Sentry'\nimport { DraftSubmission, ProgressListener } from '../types/submissions'\nimport { deleteAutoSaveData } from '../auto-save-service'\n\nfunction getLocalDraftSubmissionKey(formSubmissionDraftId: string) {\n return `DRAFT_SUBMISSION_${formSubmissionDraftId}`\n}\n\nexport async function getLocalDraftSubmission(\n formSubmissionDraftId: string | undefined,\n): Promise<DraftSubmission | null> {\n if (!formSubmissionDraftId) {\n return null\n }\n const key = getLocalDraftSubmissionKey(formSubmissionDraftId)\n return utilsService.getLocalForageItem(key)\n}\n\nasync function setLocalDraftSubmission(\n draftSubmission: DraftSubmission,\n): Promise<DraftSubmission> {\n const key = getLocalDraftSubmissionKey(draftSubmission.formSubmissionDraftId)\n return utilsService.setLocalForageItem(key, draftSubmission)\n}\n\nexport async function removeLocalDraftSubmission(\n formSubmissionDraftId: undefined | null | string,\n): Promise<void> {\n if (!formSubmissionDraftId) {\n return\n }\n const key = getLocalDraftSubmissionKey(formSubmissionDraftId)\n return utilsService.removeLocalForageItem(key)\n}\n\nexport async function saveDraftSubmission({\n draftSubmission,\n autoSaveKey,\n onProgress,\n abortSignal,\n skipUpload,\n}: {\n draftSubmission: DraftSubmission\n autoSaveKey: string | undefined\n onProgress?: ProgressListener\n abortSignal?: AbortSignal\n skipUpload?: boolean\n}): Promise<SubmissionTypes.FormSubmissionDraftVersion | undefined> {\n await setLocalDraftSubmission(draftSubmission)\n\n if (draftSubmission.backgroundUpload) {\n return\n }\n\n try {\n if (!skipUpload) {\n return await uploadDraftData(draftSubmission, onProgress, abortSignal)\n }\n } catch (error) {\n // Ignoring all errors here as we don't want draft submission data\n // being saved to the cloud to prevent drafts from being saved on the device\n console.warn('Could not upload Draft Data as JSON', error)\n Sentry.captureException(error)\n } finally {\n if (typeof autoSaveKey === 'string') {\n try {\n await deleteAutoSaveData(draftSubmission.definition.id, autoSaveKey)\n } catch (error) {\n console.warn('Error removing auto save data: ', error)\n Sentry.captureException(error)\n }\n }\n }\n}\n\nexport async function deleteDraftData(\n formSubmissionDraftId: string,\n abortSignal?: AbortSignal,\n): Promise<{ hasDeletedRemoteDraft: boolean }> {\n try {\n await deleteFormSubmissionDraft(formSubmissionDraftId, abortSignal)\n return {\n hasDeletedRemoteDraft: true,\n }\n } catch (error) {\n console.warn(\n 'Could not delete remote draft, will attempt to delete again later.',\n error,\n )\n return {\n hasDeletedRemoteDraft: false,\n }\n }\n}\n\nexport function getLatestFormSubmissionDraftVersion(\n versions: SubmissionTypes.FormSubmissionDraftVersion[] | undefined,\n) {\n return versions?.reduce<\n SubmissionTypes.FormSubmissionDraftVersion | undefined\n >((memo, formSubmissionDraftVersion) => {\n if (!memo || formSubmissionDraftVersion.createdAt > memo.createdAt) {\n return formSubmissionDraftVersion\n }\n return memo\n }, undefined)\n}\n\nexport async function getDraftSubmission(\n formSubmissionDraft: SubmissionTypes.FormSubmissionDraft,\n abortSignal?: AbortSignal,\n): Promise<DraftSubmission | undefined> {\n const latestFormSubmissionDraftVersion = getLatestFormSubmissionDraftVersion(\n formSubmissionDraft.versions,\n )\n const draftSubmission = await getLocalDraftSubmission(formSubmissionDraft.id)\n\n // If there is local data and no server data, return local data.\n // Or if the latest server version of the draft is what\n // is currently saved locally, return local data.\n if (\n draftSubmission &&\n (!latestFormSubmissionDraftVersion ||\n latestFormSubmissionDraftVersion.createdAt <= draftSubmission.createdAt)\n ) {\n return draftSubmission\n }\n\n if (!latestFormSubmissionDraftVersion) {\n return undefined\n }\n\n //drafts will always have a formsAppId\n const s3SubmissionData = (await downloadDraftData(\n latestFormSubmissionDraftVersion.id,\n abortSignal,\n )) as Omit<SubmissionTypes.S3SubmissionData, 'formsAppId'> & {\n formsAppId: number\n }\n return await setLocalDraftSubmission({\n definition: s3SubmissionData.definition,\n submission: s3SubmissionData.submission,\n lastElementUpdated: s3SubmissionData.lastElementUpdated,\n formsAppId: s3SubmissionData.formsAppId,\n jobId: formSubmissionDraft.jobId,\n externalId: formSubmissionDraft.externalId,\n previousFormSubmissionApprovalId:\n formSubmissionDraft.previousFormSubmissionApprovalId,\n taskCompletion: s3SubmissionData.task &&\n s3SubmissionData.taskAction && {\n task: s3SubmissionData.task,\n taskAction: s3SubmissionData.taskAction,\n taskGroup: s3SubmissionData.taskGroup,\n taskGroupInstance: s3SubmissionData.taskGroupInstance,\n redirectUrl: '',\n },\n title: latestFormSubmissionDraftVersion.title,\n createdAt: latestFormSubmissionDraftVersion.createdAt,\n formSubmissionDraftId: formSubmissionDraft.id,\n sectionState: s3SubmissionData.sectionState,\n previousElapsedDurationSeconds:\n s3SubmissionData.previousElapsedDurationSeconds,\n })\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** An error class that extends `Error` */
|
|
2
|
+
export default class OneBlinkAppsError extends Error {
|
|
3
|
+
/** The title of the error */
|
|
4
|
+
title?: string;
|
|
5
|
+
/** Whether the application state is offline */
|
|
6
|
+
isOffline: boolean;
|
|
7
|
+
/** Whether the attempted action required access */
|
|
8
|
+
requiresAccessRequest: boolean;
|
|
9
|
+
/** Whether the attempted action required login */
|
|
10
|
+
requiresLogin: boolean;
|
|
11
|
+
/** The http status code associated with the error */
|
|
12
|
+
httpStatusCode?: number;
|
|
13
|
+
/** The original error that was thrown */
|
|
14
|
+
originalError?: Error;
|
|
15
|
+
/**
|
|
16
|
+
* Used to create an instance of the `OneBlinkAppsError` class.
|
|
17
|
+
*
|
|
18
|
+
* @param message The message associated with the error
|
|
19
|
+
* @param options The options associated with the error
|
|
20
|
+
*/
|
|
21
|
+
constructor(message: string, options?: {
|
|
22
|
+
/** The title of the error */
|
|
23
|
+
title?: string;
|
|
24
|
+
/** Whether the application state is offline */
|
|
25
|
+
isOffline?: boolean;
|
|
26
|
+
/** Whether the attempted action required access */
|
|
27
|
+
requiresAccessRequest?: boolean;
|
|
28
|
+
/** Whether the attempted action required login */
|
|
29
|
+
requiresLogin?: boolean;
|
|
30
|
+
/** The http status code associated with the error */
|
|
31
|
+
httpStatusCode?: number;
|
|
32
|
+
/** The original error that was thrown */
|
|
33
|
+
originalError?: Error;
|
|
34
|
+
});
|
|
35
|
+
}
|