-
Notifications
You must be signed in to change notification settings - Fork 488
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
178 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
70 changes: 70 additions & 0 deletions
70
ui/contractVerification/fields/ContractVerificationFieldZkCompiler.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
import { Box, Link } from '@chakra-ui/react'; | ||
import { useQueryClient } from '@tanstack/react-query'; | ||
import React from 'react'; | ||
import type { ControllerRenderProps } from 'react-hook-form'; | ||
import { useFormContext, Controller } from 'react-hook-form'; | ||
|
||
import type { FormFields } from '../types'; | ||
import type { SmartContractVerificationConfig } from 'types/client/contract'; | ||
|
||
import { getResourceKey } from 'lib/api/useApiQuery'; | ||
import useIsMobile from 'lib/hooks/useIsMobile'; | ||
import FancySelect from 'ui/shared/FancySelect/FancySelect'; | ||
import IconSvg from 'ui/shared/IconSvg'; | ||
|
||
import ContractVerificationFormRow from '../ContractVerificationFormRow'; | ||
|
||
const OPTIONS_LIMIT = 50; | ||
|
||
const ContractVerificationFieldZkCompiler = () => { | ||
const { formState, control } = useFormContext<FormFields>(); | ||
const isMobile = useIsMobile(); | ||
const queryClient = useQueryClient(); | ||
const config = queryClient.getQueryData<SmartContractVerificationConfig>(getResourceKey('contract_verification_config')); | ||
|
||
const options = React.useMemo(() => ( | ||
config?.zk_compiler_versions?.map((option) => ({ label: option, value: option })) || [] | ||
), [ config?.zk_compiler_versions ]); | ||
|
||
const loadOptions = React.useCallback(async(inputValue: string) => { | ||
return options | ||
.filter(({ label }) => !inputValue || label.toLowerCase().includes(inputValue.toLowerCase())) | ||
.slice(0, OPTIONS_LIMIT); | ||
}, [ options ]); | ||
|
||
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<FormFields, 'zk_compiler'>}) => { | ||
const error = 'zk_compiler' in formState.errors ? formState.errors.zk_compiler : undefined; | ||
|
||
return ( | ||
<FancySelect | ||
{ ...field } | ||
loadOptions={ loadOptions } | ||
defaultOptions | ||
size={ isMobile ? 'md' : 'lg' } | ||
placeholder="ZK compiler (enter version or use the dropdown)" | ||
placeholderIcon={ <IconSvg name="search"/> } | ||
isDisabled={ formState.isSubmitting } | ||
error={ error } | ||
isRequired | ||
isAsync | ||
/> | ||
); | ||
}, [ formState.errors, formState.isSubmitting, isMobile, loadOptions ]); | ||
|
||
return ( | ||
<ContractVerificationFormRow> | ||
<Controller | ||
name="zk_compiler" | ||
control={ control } | ||
render={ renderControl } | ||
rules={{ required: true }} | ||
/> | ||
<Box> | ||
<Link isExternal href="https://docs.zksync.io/zk-stack/components/compiler/specification#glossary">zksolc</Link> | ||
<span> compiler version.</span> | ||
</Box> | ||
</ContractVerificationFormRow> | ||
); | ||
}; | ||
|
||
export default React.memo(ContractVerificationFieldZkCompiler); |
74 changes: 74 additions & 0 deletions
74
ui/contractVerification/fields/ContractVerificationFieldZkOptimization.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import { Flex, Select } from '@chakra-ui/react'; | ||
import React from 'react'; | ||
import type { ControllerRenderProps } from 'react-hook-form'; | ||
import { Controller, useFormContext } from 'react-hook-form'; | ||
|
||
import type { FormFields } from '../types'; | ||
|
||
import CheckboxInput from 'ui/shared/CheckboxInput'; | ||
|
||
import ContractVerificationFormRow from '../ContractVerificationFormRow'; | ||
|
||
const ContractVerificationFieldZkOptimization = () => { | ||
const [ isEnabled, setIsEnabled ] = React.useState(false); | ||
const { formState, control } = useFormContext<FormFields>(); | ||
|
||
const error = 'optimization_mode' in formState.errors ? formState.errors.optimization_mode : undefined; | ||
|
||
const handleCheckboxChange = React.useCallback(() => { | ||
setIsEnabled(prev => !prev); | ||
}, []); | ||
|
||
const renderCheckboxControl = React.useCallback(({ field }: {field: ControllerRenderProps<FormFields, 'is_optimization_enabled'>}) => ( | ||
<Flex flexShrink={ 0 }> | ||
<CheckboxInput<FormFields, 'is_optimization_enabled'> | ||
text="Optimization enabled" | ||
field={ field } | ||
onChange={ handleCheckboxChange } | ||
isDisabled={ formState.isSubmitting } | ||
/> | ||
</Flex> | ||
), [ formState.isSubmitting, handleCheckboxChange ]); | ||
|
||
const renderInputControl = React.useCallback(({ field }: {field: ControllerRenderProps<FormFields, 'optimization_mode'>}) => { | ||
return ( | ||
<Select | ||
size="xs" | ||
{ ...field } | ||
w="auto" | ||
borderRadius="base" | ||
isDisabled={ formState.isSubmitting } | ||
placeholder="Optimization mode" | ||
isInvalid={ Boolean(error) } | ||
> | ||
{ [ '0', '1', '2', '3', 'z', 's' ].map((value) => ( | ||
<option key={ value } value={ value }> | ||
{ value } | ||
</option> | ||
)) } | ||
</Select> | ||
); | ||
}, [ error, formState.isSubmitting ]); | ||
|
||
return ( | ||
<ContractVerificationFormRow> | ||
<Flex columnGap={ 5 } rowGap={ 2 } h={{ base: 'auto', lg: '32px' }} flexDir={{ base: 'column', lg: 'row' }}> | ||
<Controller | ||
name="is_optimization_enabled" | ||
control={ control } | ||
render={ renderCheckboxControl } | ||
/> | ||
{ isEnabled && ( | ||
<Controller | ||
name="optimization_mode" | ||
control={ control } | ||
render={ renderInputControl } | ||
rules={{ required: true }} | ||
/> | ||
) } | ||
</Flex> | ||
</ContractVerificationFormRow> | ||
); | ||
}; | ||
|
||
export default React.memo(ContractVerificationFieldZkOptimization); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters