Commit 758f8465 authored by tom's avatar tom

form submit state

parent ff2ffc33
...@@ -15,7 +15,7 @@ import ContractMethodField from './ContractMethodField'; ...@@ -15,7 +15,7 @@ import ContractMethodField from './ContractMethodField';
interface Props<T extends SmartContractMethod> { interface Props<T extends SmartContractMethod> {
data: T; data: T;
onSubmit: (data: T, args: Array<string | Array<string>>) => Promise<ContractMethodCallResult<T>>; onSubmit: (data: T, args: Array<string | Array<string>>) => Promise<ContractMethodCallResult<T>>;
renderResult: (data: T, result: ContractMethodCallResult<T>) => React.ReactNode; renderResult: (data: T, result: ContractMethodCallResult<T>, onSettle: () => void) => React.ReactNode;
isWrite?: boolean; isWrite?: boolean;
} }
...@@ -66,6 +66,14 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit, ...@@ -66,6 +66,14 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit,
defaultValues: _fromPairs(inputs.map(({ name }, index) => [ getFieldName(name, index), '' ])), defaultValues: _fromPairs(inputs.map(({ name }, index) => [ getFieldName(name, index), '' ])),
}); });
const handleTxSettle = React.useCallback(() => {
setLoading(false);
}, []);
const handleFormChange = React.useCallback(() => {
result && setResult(undefined);
}, [ result ]);
const onFormSubmit: SubmitHandler<MethodFormFields> = React.useCallback(async(formData) => { const onFormSubmit: SubmitHandler<MethodFormFields> = React.useCallback(async(formData) => {
const args = Object.entries(formData) const args = Object.entries(formData)
.sort(sortFields(inputs)) .sort(sortFields(inputs))
...@@ -78,7 +86,6 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit, ...@@ -78,7 +86,6 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit,
onSubmit(data, args) onSubmit(data, args)
.then((result) => { .then((result) => {
setResult(result); setResult(result);
setLoading(false);
}) })
.catch((error) => { .catch((error) => {
setResult(error?.error || error?.data || (error?.reason && { message: error.reason }) || error); setResult(error?.error || error?.data || (error?.reason && { message: error.reason }) || error);
...@@ -97,6 +104,7 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit, ...@@ -97,6 +104,7 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit,
alignItems={{ base: 'flex-start', lg: 'center' }} alignItems={{ base: 'flex-start', lg: 'center' }}
onSubmit={ handleSubmit(onFormSubmit) } onSubmit={ handleSubmit(onFormSubmit) }
flexWrap="wrap" flexWrap="wrap"
onChange={ handleFormChange }
> >
{ inputs.map(({ type, name }, index) => { { inputs.map(({ type, name }, index) => {
const fieldName = getFieldName(name, index); const fieldName = getFieldName(name, index);
...@@ -108,6 +116,7 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit, ...@@ -108,6 +116,7 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit,
control={ control } control={ control }
setValue={ setValue } setValue={ setValue }
isDisabled={ isLoading } isDisabled={ isLoading }
onClear={ handleFormChange }
/> />
); );
}) } }) }
...@@ -128,7 +137,7 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit, ...@@ -128,7 +137,7 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit,
<Text>{ data.outputs.map(({ type }) => type).join(', ') }</Text> <Text>{ data.outputs.map(({ type }) => type).join(', ') }</Text>
</Flex> </Flex>
) } ) }
{ result && renderResult(data, result) } { result && renderResult(data, result, handleTxSettle) }
</Box> </Box>
); );
}; };
......
...@@ -13,19 +13,21 @@ interface Props { ...@@ -13,19 +13,21 @@ interface Props {
placeholder: string; placeholder: string;
name: string; name: string;
isDisabled: boolean; isDisabled: boolean;
onClear: () => void;
} }
const ContractMethodField = ({ control, name, placeholder, setValue, isDisabled }: Props) => { const ContractMethodField = ({ control, name, placeholder, setValue, isDisabled, onClear }: Props) => {
const ref = React.useRef<HTMLInputElement>(null); const ref = React.useRef<HTMLInputElement>(null);
const handleClear = React.useCallback(() => { const handleClear = React.useCallback(() => {
setValue(name, ''); setValue(name, '');
onClear();
ref.current?.focus(); ref.current?.focus();
}, [ name, setValue ]); }, [ name, onClear, setValue ]);
const renderInput = React.useCallback(({ field }: { field: ControllerRenderProps<MethodFormFields> }) => { const renderInput = React.useCallback(({ field }: { field: ControllerRenderProps<MethodFormFields> }) => {
return ( return (
<FormControl id={ name } maxW={{ base: '100%', lg: 'calc((100% - 24px) / 3)' }} isDisabled={ isDisabled }> <FormControl id={ name } minW={{ base: '100%', lg: 'calc((100% - 24px) / 3 - 65px)' }} w="auto" flexGrow={ 1 } isDisabled={ isDisabled }>
<InputGroup size="xs"> <InputGroup size="xs">
<Input <Input
{ ...field } { ...field }
......
...@@ -51,7 +51,9 @@ const ContractRead = ({ isProxy }: Props) => { ...@@ -51,7 +51,9 @@ const ContractRead = ({ isProxy }: Props) => {
const resultBgColor = useColorModeValue('blackAlpha.50', 'whiteAlpha.50'); const resultBgColor = useColorModeValue('blackAlpha.50', 'whiteAlpha.50');
const renderResult = React.useCallback((item: SmartContractReadMethod, result: ContractMethodReadResult) => { const renderResult = React.useCallback((item: SmartContractReadMethod, result: ContractMethodReadResult, onSettle: () => void) => {
onSettle();
if ('status' in result) { if ('status' in result) {
return <Alert status="error" mt={ 3 } p={ 4 } borderRadius="md" fontSize="sm">{ result.statusText }</Alert>; return <Alert status="error" mt={ 3 } p={ 4 } borderRadius="md" fontSize="sm">{ result.statusText }</Alert>;
} }
......
...@@ -89,8 +89,8 @@ const ContractWrite = ({ isProxy }: Props) => { ...@@ -89,8 +89,8 @@ const ContractWrite = ({ isProxy }: Props) => {
} }
}, [ _contract, addressHash, isConnected, signer ]); }, [ _contract, addressHash, isConnected, signer ]);
const renderResult = React.useCallback((item: SmartContractWriteMethod, result: ContractMethodWriteResult) => { const renderResult = React.useCallback((item: SmartContractWriteMethod, result: ContractMethodWriteResult, onSettle: () => void) => {
return <ContractWriteResult result={ result }/>; return <ContractWriteResult result={ result } onSettle={ onSettle }/>;
}, []); }, []);
const renderContent = React.useCallback((item: SmartContractWriteMethod, index: number, id: number) => { const renderContent = React.useCallback((item: SmartContractWriteMethod, index: number, id: number) => {
......
...@@ -8,14 +8,21 @@ import link from 'lib/link/link'; ...@@ -8,14 +8,21 @@ import link from 'lib/link/link';
interface Props { interface Props {
result: ContractMethodWriteResult; result: ContractMethodWriteResult;
onSettle: () => void;
} }
const ContractWriteResult = ({ result }: Props) => { const ContractWriteResult = ({ result, onSettle }: Props) => {
const txHash = result && 'hash' in result ? result.hash as `0x${ string }` : undefined; const txHash = result && 'hash' in result ? result.hash as `0x${ string }` : undefined;
const txInfo = useWaitForTransaction({ const txInfo = useWaitForTransaction({
hash: txHash, hash: txHash,
}); });
React.useEffect(() => {
if (txInfo.status !== 'loading') {
onSettle();
}
}, [ onSettle, txInfo.status ]);
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log('__>__ txInfo', txInfo); console.log('__>__ txInfo', txInfo);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment