-
Notifications
You must be signed in to change notification settings - Fork 0
/
OneBlinkFormStoreProvider.tsx
61 lines (55 loc) · 1.61 KB
/
OneBlinkFormStoreProvider.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import * as React from 'react'
import LoadingWithMessage from '../LoadingWithMessage'
import ErrorMessage from '../messages/ErrorMessage'
import { formStoreService } from '@oneblink/apps'
import useLoadDataState from '../../hooks/useLoadDataState'
import { FormTypes } from '@oneblink/types'
import { FormStoreTableProvider } from './FormStoreTableProvider'
export type FormStoreElementsContextValue = FormTypes.FormElementWithName[]
export const FormStoreElementsContext =
React.createContext<FormStoreElementsContextValue>([])
/**
* @param props
* @returns
* @group Components
*/
export function OneBlinkFormStoreProvider({
form,
children,
}: {
form: FormTypes.Form
children: React.ReactNode
}) {
const fetchFormStoreDefinition = React.useCallback(
(abortSignal?: AbortSignal) => {
return formStoreService.getFormStoreDefinition(form.id, abortSignal)
},
[form.id],
)
const [formStoreDefinitionState, onTryAgain] = useLoadDataState(
fetchFormStoreDefinition,
)
if (formStoreDefinitionState.status === 'LOADING') {
return <LoadingWithMessage />
}
if (formStoreDefinitionState.status === 'ERROR') {
return (
<>
<ErrorMessage
title="Error Retrieving Form Definition"
gutterTop
onTryAgain={onTryAgain}
>
{formStoreDefinitionState.error.message}
</ErrorMessage>
</>
)
}
return (
<FormStoreElementsContext.Provider
value={formStoreDefinitionState.result.formElements}
>
<FormStoreTableProvider form={form}>{children}</FormStoreTableProvider>
</FormStoreElementsContext.Provider>
)
}