Commit bae71ae5 authored by tom's avatar tom

file removal and standard input method

parent 220e9c9f
import { Button, chakra } from '@chakra-ui/react'; import { Button, chakra } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { SubmitHandler } from 'react-hook-form'; import type { SubmitHandler } from 'react-hook-form';
import { useForm } from 'react-hook-form'; import { useForm, FormProvider } from 'react-hook-form';
import type { FormFields } from './types'; import type { FormFields } from './types';
...@@ -13,7 +13,8 @@ import ContractVerificationStandardInput from './methods/ContractVerificationSta ...@@ -13,7 +13,8 @@ import ContractVerificationStandardInput from './methods/ContractVerificationSta
import ContractVerificationVyperContract from './methods/ContractVerificationVyperContract'; import ContractVerificationVyperContract from './methods/ContractVerificationVyperContract';
const ContractVerificationForm = () => { const ContractVerificationForm = () => {
const { control, handleSubmit, watch } = useForm<FormFields>(); const formApi = useForm<FormFields>();
const { control, handleSubmit, watch } = formApi;
const onFormSubmit: SubmitHandler<FormFields> = React.useCallback((data) => { const onFormSubmit: SubmitHandler<FormFields> = React.useCallback((data) => {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
...@@ -33,24 +34,26 @@ const ContractVerificationForm = () => { ...@@ -33,24 +34,26 @@ const ContractVerificationForm = () => {
const content = methods[method] || null; const content = methods[method] || null;
return ( return (
<chakra.form <FormProvider { ...formApi }>
noValidate <chakra.form
onSubmit={ handleSubmit(onFormSubmit) } noValidate
mt={ 12 } onSubmit={ handleSubmit(onFormSubmit) }
> mt={ 12 }
<ContractVerificationFieldMethod control={ control }/> >
{ content } <ContractVerificationFieldMethod control={ control }/>
{ Boolean(method) && ( { content }
<Button { Boolean(method) && (
variant="solid" <Button
size="lg" variant="solid"
type="submit" size="lg"
mt={ 12 } type="submit"
> mt={ 12 }
Verify & publish >
</Button> Verify & publish
) } </Button>
</chakra.form> ) }
</chakra.form>
</FormProvider>
); );
}; };
......
import { GridItem, Text, Button, Box } from '@chakra-ui/react'; import { GridItem, Text, Button, Box } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { ControllerRenderProps, Control } from 'react-hook-form'; import type { ControllerRenderProps, Control } from 'react-hook-form';
import { Controller } from 'react-hook-form'; import { Controller, useFormContext } from 'react-hook-form';
import type { FormFields } from '../types'; import type { FormFields } from '../types';
...@@ -10,32 +10,56 @@ import FileSnippet from 'ui/shared/forms/FileSnippet'; ...@@ -10,32 +10,56 @@ import FileSnippet from 'ui/shared/forms/FileSnippet';
interface Props { interface Props {
control: Control<FormFields>; control: Control<FormFields>;
accept?: string;
multiple?: boolean;
title: string;
} }
const ContractVerificationFieldSources = ({ control }: Props) => { const ContractVerificationFieldSources = ({ control, accept, multiple, title }: Props) => {
const { setValue, getValues } = useFormContext();
const handleFileRemove = React.useCallback((index?: number) => {
if (index === undefined) {
return;
}
const value = getValues('sources').slice();
value.splice(index, 1);
setValue('sources', value);
}, [ getValues, setValue ]);
const renderFiles = React.useCallback((files: Array<File>) => { const renderFiles = React.useCallback((files: Array<File>) => {
return ( return (
<Box display="grid" gridTemplateColumns={{ base: '1fr', lg: '1fr 1fr' }} columnGap={ 3 } rowGap={ 3 }> <Box display="grid" gridTemplateColumns={{ base: '1fr', lg: '1fr 1fr' }} columnGap={ 3 } rowGap={ 3 }>
{ files.map((file, index) => <FileSnippet key={ file.name + index } file={ file } maxW="initial"/>) } { files.map((file, index) => (
<FileSnippet
key={ file.name + file.lastModified }
file={ file }
maxW="initial"
onRemove={ handleFileRemove }
index={ index }
/>
)) }
</Box> </Box>
); );
}, []); }, [ handleFileRemove ]);
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<FormFields, 'sources'>}) => ( const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<FormFields, 'sources'>}) => (
<> <>
<FileInput<FormFields, 'sources'> accept=".sol,.yul" multiple field={ field }> <FileInput<FormFields, 'sources'> accept={ accept } multiple={ multiple } field={ field }>
<Button variant="outline" size="sm" display={ field.value && field.value.length > 0 ? 'none' : 'block' }> <Button variant="outline" size="sm" display={ field.value && field.value.length > 0 ? 'none' : 'block' }>
Upload file Upload file{ multiple ? 's' : '' }
</Button> </Button>
</FileInput> </FileInput>
{ field.value && field.value.length > 0 && renderFiles(field.value) } { field.value && field.value.length > 0 && renderFiles(field.value) }
</> </>
), [ renderFiles ]); ), [ accept, multiple, renderFiles ]);
return ( return (
<> <>
<GridItem mt="30px"> <GridItem mt="30px">
<Text fontWeight={ 500 } mb={ 4 }>Sources *.sol or *.yul files</Text> <Text fontWeight={ 500 } mb={ 4 }>{ title }</Text>
<Controller <Controller
name="sources" name="sources"
control={ control } control={ control }
......
...@@ -20,7 +20,7 @@ const ContractVerificationMultiPartFile = ({ control }: Props) => { ...@@ -20,7 +20,7 @@ const ContractVerificationMultiPartFile = ({ control }: Props) => {
<ContractVerificationFieldCompiler control={ control }/> <ContractVerificationFieldCompiler control={ control }/>
<ContractVerificationFieldEvmVersion control={ control }/> <ContractVerificationFieldEvmVersion control={ control }/>
<ContractVerificationFieldOptimization control={ control }/> <ContractVerificationFieldOptimization control={ control }/>
<ContractVerificationFieldSources control={ control }/> <ContractVerificationFieldSources control={ control } accept=".sol,.yul" multiple title="Sources *.sol or *.yul files"/>
<ContractVerificationFieldLibraries control={ control }/> <ContractVerificationFieldLibraries control={ control }/>
</ContractVerificationMethod> </ContractVerificationMethod>
); );
......
...@@ -4,6 +4,10 @@ import type { Control } from 'react-hook-form'; ...@@ -4,6 +4,10 @@ import type { Control } from 'react-hook-form';
import type { FormFields } from '../types'; import type { FormFields } from '../types';
import ContractVerificationMethod from '../ContractVerificationMethod'; import ContractVerificationMethod from '../ContractVerificationMethod';
import ContractVerificationFieldCompiler from '../fields/ContractVerificationFieldCompiler';
import ContractVerificationFieldConstArgs from '../fields/ContractVerificationFieldConstArgs';
import ContractVerificationFieldName from '../fields/ContractVerificationFieldName';
import ContractVerificationFieldSources from '../fields/ContractVerificationFieldSources';
interface Props { interface Props {
control: Control<FormFields>; control: Control<FormFields>;
...@@ -13,7 +17,10 @@ interface Props { ...@@ -13,7 +17,10 @@ interface Props {
const ContractVerificationStandardInput = ({ control }: Props) => { const ContractVerificationStandardInput = ({ control }: Props) => {
return ( return (
<ContractVerificationMethod title="New Smart Contract Verification"> <ContractVerificationMethod title="New Smart Contract Verification">
ContractVerificationStandardInput <ContractVerificationFieldName control={ control }/>
<ContractVerificationFieldCompiler control={ control }/>
<ContractVerificationFieldSources control={ control } accept=".json" title="Standard Input JSON"/>
<ContractVerificationFieldConstArgs control={ control }/>
</ContractVerificationMethod> </ContractVerificationMethod>
); );
}; };
......
...@@ -20,6 +20,8 @@ export interface FormFieldsFlattenSourceCode { ...@@ -20,6 +20,8 @@ export interface FormFieldsFlattenSourceCode {
export interface FormFieldsStandardInput { export interface FormFieldsStandardInput {
method: 'standard_input'; method: 'standard_input';
name: string; name: string;
compiler: string;
sources: Array<File>;
} }
export interface FormFieldsSourcify { export interface FormFieldsSourcify {
......
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