Function OneBlinkForm

  • Component for rendering a OneBlink Form. This component will render the submit, cancel and save draft buttons but it is up to the developer to implement what happens when those buttons are clicked.

    It is also recommended to import the css from this library as well.

    import { OneBlinkForm } from '@oneblink/apps-react'
    import '@oneblink/apps-react/dist/styles.css'

    Example

    import React from 'react'
    import ReactDOM from 'react-dom'
    import { FormTypes } from '@oneblink/types'
    import {
    OneBlinkAppsError,
    draftService,
    submissionService,
    } from '@oneblink/apps'
    import {
    IsOfflineContextProvider,
    OneBlinkForm,
    useIsMounted,
    } from '@oneblink/apps-react'
    import '@oneblink/apps-react/dist/styles.css'

    const captchaSiteKey = 'ENTER_YOUR_SITE_KEY_HERE'
    const googleMapsApiKey = 'ENTER_YOUR_MAPS_API_KEY_HERE'
    const formsAppId = 1
    const form: FormTypes.Form = {
    id: 1,
    name: 'Name of Form',
    description: '',
    organisationId: 'abc123',
    formsAppEnvironmentId: 1,
    formsAppIds: [],
    elements: [],
    isAuthenticated: false,
    isMultiPage: false,
    isInfoPage: false,
    publishStartDate: null,
    publishEndDate: null,
    postSubmissionAction: 'FORMS_LIBRARY',
    submissionEvents: [],
    tags: [],
    }

    function FormContainer() {
    const isMounted = useIsMounted()

    const [{ isSavingDraft, saveDraftError }, setSaveDraftState] =
    React.useState({
    isSavingDraft: false,
    saveDraftError: null,
    })

    const [
    { isSubmitting, submitError, formSubmissionResult },
    setSubmitState,
    ] = React.useState({
    formSubmissionResult: null,
    isSubmitting: false,
    submitError: null,
    })

    const handleSubmit = React.useCallback(
    async (newFormSubmission: FormTypes.NewFormSubmission) => {
    const formSubmission: FormSubmission = Object.assign(
    {},
    newFormSubmission,
    {
    formsAppId,
    jobId: null,
    externalId: null,
    draftId: null,
    preFillFormDataId: null,
    },
    )

    setSubmitState({
    formSubmissionResult: null,
    submitError: null,
    isSubmitting: true,
    })

    try {
    const newFormSubmissionResult = await submissionService.submit({
    formSubmission,
    })
    if (
    newFormSubmissionResult.isOffline &&
    !newFormSubmissionResult.isInPendingQueue
    ) {
    throw new OneBlinkAppsError(
    'You cannot submit this form while offline, please try again when connectivity is restored.',
    {
    isOffline: true,
    },
    )
    }

    if (isMounted.current) {
    setSubmitState({
    formSubmissionResult: newFormSubmissionResult,
    isSubmitting: false,
    submitError: null,
    })
    }
    } catch (error) {
    if (isMounted.current) {
    setSubmitState({
    formSubmissionResult: null,
    isSubmitting: false,
    submitError: error,
    })
    }
    }
    },
    [isMounted],
    )

    const handleSaveDraft = React.useCallback(
    async (newDraftSubmission: FormTypes.NewDraftSubmission) => {
    const draftSubmission: FormTypes.DraftSubmission = {
    ...newDraftSubmission,
    formsAppId,
    }
    setSaveDraftState({
    saveDraftError: null,
    isSavingDraft: true,
    })

    try {
    await draftService.addDraft(
    {
    title: form.name,
    formId: form.id,
    externalId: null,
    jobId: null,
    },
    draftSubmission,
    )

    if (isMounted.current) {
    setSaveDraftState({
    saveDraftError: null,
    isSavingDraft: false,
    })
    }
    } catch (error) {
    if (isMounted.current) {
    setSaveDraftState({
    saveDraftError: error,
    isSavingDraft: false,
    })
    }
    }
    },
    [isMounted],
    )

    const handleCancel = React.useCallback(() => {
    // handle cancel here...
    }, [isMounted])

    if (isSubmitting) {
    // Render submitting animation/loading
    }

    if (submitError) {
    // Render error while submitting
    }

    if (isSavingDraft) {
    // Render saving draft animation/loading
    }

    if (saveDraftError) {
    // Render error while saving draft
    }

    if (formSubmissionResult) {
    // Render submission success
    }

    return (
    <OneBlinkForm
    captchaSiteKey={captchaSiteKey}
    googleMapsApiKey={googleMapsApiKey}
    formsAppId={formsAppId}
    form={form}
    onCancel={handleCancel}
    onSubmit={handleSubmit}
    onSaveDraft={handleSaveDraft}
    attachmentRetentionInDays={1}
    />
    )
    }

    function App() {
    return (
    <IsOfflineContextProvider>
    <FormContainer />
    </IsOfflineContextProvider>
    )
    }

    const root = document.getElementById('root')
    if (root) {
    ReactDOM.render(<App />, root)
    }

    Parameters

    • props: OneBlinkReadOnlyFormProps & {
          abnLookupAuthenticationGuid?: string;
          attachmentRetentionInDays?: number;
          buttons?: {
              cancel?: ButtonConfiguration;
              cancelPromptNo?: ButtonConfiguration;
              cancelPromptYes?: ButtonConfiguration;
              saveDraft?: ButtonConfiguration;
              submit?: ButtonConfiguration;
          };
          captchaSiteKey?: string;
          disabled?: boolean;
          handleNavigateAway?: (() => unknown);
          isInfoPage?: "YES" | "NO" | "CALCULATED";
          isPendingQueueEnabled: boolean;
          isPreview?: boolean;
          onCancel: (() => unknown);
          onSaveDraft?: ((newDraftSubmission) => unknown);
          onSubmit: ((newFormSubmission) => unknown);
          onUploadAttachment?: ((__namedParameters, abortSignal?) => Promise<FormSubmissionAttachment>);
      } & OneBlinkFormUncontrolledProps & {
          resumeAtElement?: FormElement;
      }

    Returns null | ReactElement<any, string | JSXElementConstructor<any>>