-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmint-form-provider.tsx
More file actions
93 lines (82 loc) · 2.35 KB
/
mint-form-provider.tsx
File metadata and controls
93 lines (82 loc) · 2.35 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import {
FC,
ReactNode,
useMemo,
useCallback,
createContext,
useContext,
} from 'react';
import { useForm } from 'react-hook-form';
import invariant from 'tiny-invariant';
import type { UseQueryResult } from '@tanstack/react-query';
import { useDappStatus } from 'modules/web3';
import { type MaxMintableResult } from 'modules/vaults';
import { useDisableForm } from 'shared/hook-form';
import { FormControllerStyled } from 'shared/components/form';
import { mintFormResolver } from './validation';
import { useMintData } from './use-mint-data';
import { useMint } from './use-mint';
import type {
MintFormFieldValues,
MintFormValidatedValues,
MintFormValidationContextAwaitable,
} from '../types';
type MintFormDataContextValue = {
mintableQuery: UseQueryResult<MaxMintableResult>;
};
const MintFormDataContext = createContext<MintFormDataContextValue | null>(
null,
);
MintFormDataContext.displayName = 'MintFormDataContext';
export const useMintFormData = () => {
const value = useContext(MintFormDataContext);
invariant(
value,
'useMintFormData was used outside the MintDataContext provider',
);
return value;
};
export const MintFormProvider: FC<{ children: ReactNode }> = ({ children }) => {
const { isDappActive } = useDappStatus();
const { validationContext, mintableQuery, invalidateMintData } =
useMintData();
const disabled = useDisableForm();
const { mint, retryEvent } = useMint();
const formObject = useForm<
MintFormFieldValues,
MintFormValidationContextAwaitable,
MintFormValidatedValues
>({
defaultValues: {
amount: null,
token: 'stETH',
recipient: '',
},
disabled: !isDappActive || disabled,
mode: 'onTouched',
resolver: mintFormResolver,
context: validationContext,
});
const onSubmit = useCallback(
async (values: MintFormValidatedValues) => {
const success = await mint(values);
await invalidateMintData();
return success;
},
[invalidateMintData, mint],
);
return (
<MintFormDataContext.Provider
value={useMemo(() => ({ mintableQuery }), [mintableQuery])}
>
<FormControllerStyled
formObject={formObject}
onSubmit={onSubmit}
retryEvent={retryEvent}
data-testid="mintForm"
>
{children}
</FormControllerStyled>
</MintFormDataContext.Provider>
);
};