Commit 8b8f3c34 authored by tom's avatar tom

refactor

parent 0c8a5b7c
...@@ -58,7 +58,7 @@ const TokenInfoForm = ({ id }: Props) => { ...@@ -58,7 +58,7 @@ const TokenInfoForm = ({ id }: Props) => {
return <ContentLoader/>; return <ContentLoader/>;
} }
const fieldProps = { control, formState }; const fieldProps = { control };
return ( return (
<form noValidate onSubmit={ onSubmit }> <form noValidate onSubmit={ onSubmit }>
...@@ -104,7 +104,15 @@ const TokenInfoForm = ({ id }: Props) => { ...@@ -104,7 +104,15 @@ const TokenInfoForm = ({ id }: Props) => {
<TokenInfoFieldPriceTicker { ...fieldProps } name="ticker_defi_llama" label="DefiLlama URL "/> <TokenInfoFieldPriceTicker { ...fieldProps } name="ticker_defi_llama" label="DefiLlama URL "/>
</GridItem> </GridItem>
</Grid> </Grid>
<Button type="submit" size="lg" mt={ 8 }>Send request</Button> <Button
type="submit"
size="lg"
mt={ 8 }
isLoading={ formState.isSubmitting }
loadingText="Send request"
>
Send request
</Button>
</form> </form>
); );
}; };
......
import { FormControl, Input } from '@chakra-ui/react'; import { FormControl, Input } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields } from '../types'; import type { Fields } from '../types';
...@@ -9,27 +9,24 @@ import { validator } from 'lib/validations/url'; ...@@ -9,27 +9,24 @@ import { validator } from 'lib/validations/url';
import InputPlaceholder from 'ui/shared/InputPlaceholder'; import InputPlaceholder from 'ui/shared/InputPlaceholder';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
} }
const TokenInfoFieldDocs = ({ formState, control, isReadOnly }: Props) => { const TokenInfoFieldDocs = ({ control, isReadOnly }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, 'docs'>}) => { const renderControl: ControllerProps<Fields, 'docs'>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = 'docs' in formState.errors ? formState.errors.docs : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } size="lg"> <FormControl variant="floating" id={ field.name } size="lg">
<Input <Input
{ ...field } { ...field }
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
/> />
<InputPlaceholder text="Docs" error={ error }/> <InputPlaceholder text="Docs" error={ fieldState.error }/>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly ]); }, [ isReadOnly ]);
return ( return (
<Controller <Controller
......
import { FormControl, Input } from '@chakra-ui/react'; import { FormControl, Input } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields, TickerUrlFields } from '../types'; import type { Fields, TickerUrlFields } from '../types';
...@@ -9,29 +9,26 @@ import { validator } from 'lib/validations/url'; ...@@ -9,29 +9,26 @@ import { validator } from 'lib/validations/url';
import InputPlaceholder from 'ui/shared/InputPlaceholder'; import InputPlaceholder from 'ui/shared/InputPlaceholder';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
name: keyof TickerUrlFields; name: keyof TickerUrlFields;
label: string; label: string;
} }
const TokenInfoFieldPriceTicker = ({ formState, control, isReadOnly, name, label }: Props) => { const TokenInfoFieldPriceTicker = ({ control, isReadOnly, name, label }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, typeof name>}) => { const renderControl: ControllerProps<Fields, typeof name>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = name in formState.errors ? formState.errors[name] : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } size="lg"> <FormControl variant="floating" id={ field.name } size="lg">
<Input <Input
{ ...field } { ...field }
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
/> />
<InputPlaceholder text={ label } error={ error }/> <InputPlaceholder text={ label } error={ fieldState.error }/>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly, name, label ]); }, [ isReadOnly, label ]);
return ( return (
<Controller <Controller
......
import { FormControl, Text, Textarea } from '@chakra-ui/react'; import { FormControl, Text, Textarea } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields } from '../types'; import type { Fields } from '../types';
...@@ -8,34 +8,31 @@ import type { Fields } from '../types'; ...@@ -8,34 +8,31 @@ import type { Fields } from '../types';
import InputPlaceholder from 'ui/shared/InputPlaceholder'; import InputPlaceholder from 'ui/shared/InputPlaceholder';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
} }
const TokenInfoFieldProjectDescription = ({ formState, control, isReadOnly }: Props) => { const TokenInfoFieldProjectDescription = ({ control, isReadOnly }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, 'project_description'>}) => { const renderControl: ControllerProps<Fields, 'project_description'>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = 'project_description' in formState.errors ? formState.errors.project_description : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } size="lg" isRequired> <FormControl variant="floating" id={ field.name } size="lg" isRequired>
<Textarea <Textarea
{ ...field } { ...field }
required required
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
maxH="160px" maxH="160px"
maxLength={ 300 } maxLength={ 300 }
/> />
<InputPlaceholder text="Project description" error={ error }/> <InputPlaceholder text="Project description" error={ fieldState.error }/>
<Text variant="secondary" fontSize="sm" mt={ 1 }> <Text variant="secondary" fontSize="sm" mt={ 1 }>
Introduce or summarise the project’s operation/goals in a maximum of 300 characters. Introduce or summarize the project’s operation/goals in a maximum of 300 characters.
The description should be written in a neutral point of view and must exclude unsubstantiated claims unless proven otherwise. The description should be written in a neutral point of view and must exclude unsubstantiated claims unless proven otherwise.
</Text> </Text>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly ]); }, [ isReadOnly ]);
return ( return (
<Controller <Controller
......
import { FormControl, Input } from '@chakra-ui/react'; import { FormControl, Input } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields } from '../types'; import type { Fields } from '../types';
...@@ -9,28 +9,25 @@ import { EMAIL_REGEXP } from 'lib/validations/email'; ...@@ -9,28 +9,25 @@ import { EMAIL_REGEXP } from 'lib/validations/email';
import InputPlaceholder from 'ui/shared/InputPlaceholder'; import InputPlaceholder from 'ui/shared/InputPlaceholder';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
} }
const TokenInfoFieldProjectEmail = ({ formState, control, isReadOnly }: Props) => { const TokenInfoFieldProjectEmail = ({ control, isReadOnly }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, 'project_email'>}) => { const renderControl: ControllerProps<Fields, 'project_email'>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = 'project_email' in formState.errors ? formState.errors.project_email : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } isRequired size="lg"> <FormControl variant="floating" id={ field.name } isRequired size="lg">
<Input <Input
{ ...field } { ...field }
required required
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
/> />
<InputPlaceholder text="Official project email address" error={ error }/> <InputPlaceholder text="Official project email address" error={ fieldState.error }/>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly ]); }, [ isReadOnly ]);
return ( return (
<Controller <Controller
......
import { FormControl, Input } from '@chakra-ui/react'; import { FormControl, Input } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields } from '../types'; import type { Fields } from '../types';
...@@ -8,27 +8,25 @@ import type { Fields } from '../types'; ...@@ -8,27 +8,25 @@ import type { Fields } from '../types';
import InputPlaceholder from 'ui/shared/InputPlaceholder'; import InputPlaceholder from 'ui/shared/InputPlaceholder';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
} }
const TokenInfoFieldProjectName = ({ formState, control, isReadOnly }: Props) => { const TokenInfoFieldProjectName = ({ control, isReadOnly }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, 'project_name'>}) => { const renderControl: ControllerProps<Fields, 'project_name'>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = 'project_name' in formState.errors ? formState.errors.project_name : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } size="lg"> <FormControl variant="floating" id={ field.name } size="lg">
<Input <Input
{ ...field } { ...field }
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
/> />
<InputPlaceholder text="Project name" error={ error }/> <InputPlaceholder text="Project name" error={ fieldState.error }/>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly ]); }, [ isReadOnly ]);
return ( return (
<Controller <Controller
......
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields } from '../types'; import type { Fields } from '../types';
...@@ -8,19 +8,17 @@ import type { TokenInfoApplicationConfig } from 'types/api/account'; ...@@ -8,19 +8,17 @@ import type { TokenInfoApplicationConfig } from 'types/api/account';
import FancySelect from 'ui/shared/FancySelect/FancySelect'; import FancySelect from 'ui/shared/FancySelect/FancySelect';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
config: TokenInfoApplicationConfig['projectSectors']; config: TokenInfoApplicationConfig['projectSectors'];
} }
const TokenInfoFieldProjectSector = ({ formState, control, isReadOnly, config }: Props) => { const TokenInfoFieldProjectSector = ({ control, isReadOnly, config }: Props) => {
const options = React.useMemo(() => { const options = React.useMemo(() => {
return config.map((option) => ({ label: option, value: option })); return config.map((option) => ({ label: option, value: option }));
}, [ config ]); }, [ config ]);
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, 'project_sector'>}) => { const renderControl: ControllerProps<Fields, 'project_sector'>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = 'project_sector' in formState.errors ? formState.errors.project_sector : undefined;
return ( return (
<FancySelect <FancySelect
...@@ -29,10 +27,10 @@ const TokenInfoFieldProjectSector = ({ formState, control, isReadOnly, config }: ...@@ -29,10 +27,10 @@ const TokenInfoFieldProjectSector = ({ formState, control, isReadOnly, config }:
size="lg" size="lg"
placeholder="Project industry" placeholder="Project industry"
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
error={ error } error={ fieldState.error }
/> />
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly, options ]); }, [ isReadOnly, options ]);
return ( return (
<Controller <Controller
......
import { FormControl, Input } from '@chakra-ui/react'; import { FormControl, Input } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields } from '../types'; import type { Fields } from '../types';
...@@ -9,28 +9,25 @@ import { validator } from 'lib/validations/url'; ...@@ -9,28 +9,25 @@ import { validator } from 'lib/validations/url';
import InputPlaceholder from 'ui/shared/InputPlaceholder'; import InputPlaceholder from 'ui/shared/InputPlaceholder';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
} }
const TokenInfoFieldProjectWebsite = ({ formState, control, isReadOnly }: Props) => { const TokenInfoFieldProjectWebsite = ({ control, isReadOnly }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, 'project_website'>}) => { const renderControl: ControllerProps<Fields, 'project_website'>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = 'project_website' in formState.errors ? formState.errors.project_website : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } size="lg" isRequired> <FormControl variant="floating" id={ field.name } size="lg" isRequired>
<Input <Input
{ ...field } { ...field }
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
required required
/> />
<InputPlaceholder text="Official project website" error={ error }/> <InputPlaceholder text="Official project website" error={ fieldState.error }/>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly ]); }, [ isReadOnly ]);
return ( return (
<Controller <Controller
......
import { FormControl, Input } from '@chakra-ui/react'; import { FormControl, Input } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields } from '../types'; import type { Fields } from '../types';
...@@ -9,28 +9,25 @@ import { EMAIL_REGEXP } from 'lib/validations/email'; ...@@ -9,28 +9,25 @@ import { EMAIL_REGEXP } from 'lib/validations/email';
import InputPlaceholder from 'ui/shared/InputPlaceholder'; import InputPlaceholder from 'ui/shared/InputPlaceholder';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
} }
const TokenInfoFieldRequesterEmail = ({ formState, control, isReadOnly }: Props) => { const TokenInfoFieldRequesterEmail = ({ control, isReadOnly }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, 'requester_email'>}) => { const renderControl: ControllerProps<Fields, 'requester_email'>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = 'requester_email' in formState.errors ? formState.errors.requester_email : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } isRequired size="lg"> <FormControl variant="floating" id={ field.name } isRequired size="lg">
<Input <Input
{ ...field } { ...field }
required required
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
/> />
<InputPlaceholder text="Requester email" error={ error }/> <InputPlaceholder text="Requester email" error={ fieldState.error }/>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly ]); }, [ isReadOnly ]);
return ( return (
<Controller <Controller
......
import { FormControl, Input } from '@chakra-ui/react'; import { FormControl, Input } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields } from '../types'; import type { Fields } from '../types';
...@@ -8,28 +8,25 @@ import type { Fields } from '../types'; ...@@ -8,28 +8,25 @@ import type { Fields } from '../types';
import InputPlaceholder from 'ui/shared/InputPlaceholder'; import InputPlaceholder from 'ui/shared/InputPlaceholder';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
} }
const TokenInfoFieldRequesterName = ({ formState, control, isReadOnly }: Props) => { const TokenInfoFieldRequesterName = ({ control, isReadOnly }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, 'requester_name'>}) => { const renderControl: ControllerProps<Fields, 'requester_name'>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = 'requester_name' in formState.errors ? formState.errors.requester_name : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } isRequired size="lg"> <FormControl variant="floating" id={ field.name } isRequired size="lg">
<Input <Input
{ ...field } { ...field }
required required
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
/> />
<InputPlaceholder text="Requester name" error={ error }/> <InputPlaceholder text="Requester name" error={ fieldState.error }/>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly ]); }, [ isReadOnly ]);
return ( return (
<Controller <Controller
......
import { FormControl, Icon, Input, InputRightElement, InputGroup } from '@chakra-ui/react'; import { FormControl, Icon, Input, InputRightElement, InputGroup } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields, SocialLinkFields } from '../types'; import type { Fields, SocialLinkFields } from '../types';
...@@ -37,33 +37,30 @@ const SETTINGS: Record<keyof SocialLinkFields, Item> = { ...@@ -37,33 +37,30 @@ const SETTINGS: Record<keyof SocialLinkFields, Item> = {
}; };
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
name: keyof SocialLinkFields; name: keyof SocialLinkFields;
} }
const TokenInfoFieldSocialLink = ({ formState, control, isReadOnly, name }: Props) => { const TokenInfoFieldSocialLink = ({ control, isReadOnly, name }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, typeof name>}) => { const renderControl: ControllerProps<Fields, typeof name>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = name in formState.errors ? formState.errors[name] : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } size="lg" sx={{ '.chakra-input__group input': { pr: '60px' } }}> <FormControl variant="floating" id={ field.name } size="lg" sx={{ '.chakra-input__group input': { pr: '60px' } }}>
<InputGroup> <InputGroup>
<Input <Input
{ ...field } { ...field }
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
/> />
<InputPlaceholder text={ SETTINGS[name].label } error={ error }/> <InputPlaceholder text={ SETTINGS[name].label } error={ fieldState.error }/>
<InputRightElement h="100%"> <InputRightElement h="100%">
<Icon as={ SETTINGS[name].icon } boxSize={ 6 } color={ field.value ? SETTINGS[name].color : '#718096' }/> <Icon as={ SETTINGS[name].icon } boxSize={ 6 } color={ field.value ? SETTINGS[name].color : '#718096' }/>
</InputRightElement> </InputRightElement>
</InputGroup> </InputGroup>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly, name ]); }, [ isReadOnly, name ]);
return ( return (
<Controller <Controller
......
import { FormControl, Input } from '@chakra-ui/react'; import { FormControl, Input } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Control, ControllerRenderProps, FormState } from 'react-hook-form'; import type { Control, ControllerProps } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller } from 'react-hook-form';
import type { Fields } from '../types'; import type { Fields } from '../types';
...@@ -9,27 +9,25 @@ import { validator } from 'lib/validations/url'; ...@@ -9,27 +9,25 @@ import { validator } from 'lib/validations/url';
import InputPlaceholder from 'ui/shared/InputPlaceholder'; import InputPlaceholder from 'ui/shared/InputPlaceholder';
interface Props { interface Props {
formState: FormState<Fields>;
control: Control<Fields>; control: Control<Fields>;
isReadOnly?: boolean; isReadOnly?: boolean;
} }
const TokenInfoFieldSupport = ({ formState, control, isReadOnly }: Props) => { const TokenInfoFieldSupport = ({ control, isReadOnly }: Props) => {
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<Fields, 'support'>}) => { const renderControl: ControllerProps<Fields, 'support'>['render'] = React.useCallback(({ field, fieldState, formState }) => {
const error = 'support' in formState.errors ? formState.errors.support : undefined;
return ( return (
<FormControl variant="floating" id={ field.name } size="lg"> <FormControl variant="floating" id={ field.name } size="lg">
<Input <Input
{ ...field } { ...field }
isInvalid={ Boolean(error) } isInvalid={ Boolean(fieldState.error) }
isDisabled={ formState.isSubmitting || isReadOnly } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
/> />
<InputPlaceholder text="Support" error={ error }/> <InputPlaceholder text="Support" error={ fieldState.error }/>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting, isReadOnly ]); }, [ isReadOnly ]);
return ( return (
<Controller <Controller
......
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