feat: add verifier input on mint form (#213)

* fix: ethereum tx provider hook typing

* feat: add base code for verifier dropdown select

* feat: fetch verifiers from subgraph

* refactor: use combobox for selecting verifier
This commit is contained in:
Felipe Mendes 2023-04-20 10:31:26 -03:00 committed by GitHub
parent 3fbbb08cf9
commit 795164b4aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 107 additions and 5 deletions

View File

@ -45,6 +45,12 @@ query getNFA($id: ID!) {
}
}
query getVerifiers {
verifiers {
id
}
}
# query to get the ens name of an address
query getENSNames($address: ID!) {
account(id: $address) {

View File

@ -49,14 +49,14 @@ const createWriteContractContext = <
providerName,
});
const Provider: React.FC = ({
const Provider = ({
children,
config: {
prepare: prepareConfig = {},
transaction: transactionConfig = {},
write: writeConfig = {},
} = {},
}: EthereumHooks.WriteContext.ProviderProps<TFunctionName>) => {
}: EthereumHooks.WriteContext.ProviderProps<TFunctionName>): JSX.Element => {
const [args, setArgs] = useState<TFunctionArguments>();
const prepare = usePrepareContractWrite({

View File

@ -30,7 +30,7 @@ export const resolveAddress = createAsyncThunk<void, string>(
} catch (error) {
AppLog.error('Failed to resolve ENS name by address', error);
dispatch(
ENSActions.setAddress({ key: address, value: { state: 'loading' } })
ENSActions.setAddress({ key: address, value: { state: 'failed' } })
);
}
}

View File

@ -13,6 +13,7 @@ export type MintFormContext = {
logoColor: FormField;
ens: FormField;
domainURL: FormField;
verifier: FormField;
isValid: ReactState<boolean>;
};
};
@ -51,6 +52,7 @@ export const useMintFormContextInit = (): MintFormContext => ({
StringValidators.isUrl,
]),
ens: useFormField('ens', [], ''),
verifier: useFormField('verifier', [StringValidators.required]),
isValid: useState(false),
},
});

View File

@ -1,11 +1,99 @@
import { Button, Card, Flex, Stepper, Switch, Text } from '@/components';
import { useQuery } from '@apollo/client';
import { useEffect, useMemo } from 'react';
import { getVerifiersDocument } from '@/../.graphclient';
import {
Button,
Card,
Flex,
Form,
ResolvedAddress,
Stepper,
Switch,
Text,
} from '@/components';
import { useENSStore } from '@/store';
import { Mint } from '../../mint.context';
import { MintCardHeader } from '../../mint-card';
import { useMintFormContext } from '../form-step';
// TODO: remove mocked items after graphql api is fixed
const mockedItems = [
'0xdBb04e00D5ec8C9e3aeF811D315Ee7C147c5DBFD',
'0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049',
];
const SelectVerifier: React.FC = () => {
const {
form: { verifier },
} = useMintFormContext();
const {
value: [selectedVerifier, setSelectedVerifier],
} = verifier;
const { addressMap } = useENSStore();
const { data } = useQuery(getVerifiersDocument);
const items = useMemo(() => {
if (!data) return [];
const verifiers = data.verifiers
.map<string>((verifier) => verifier.id.toString())
.concat(mockedItems);
return verifiers.map((verifier) => ({
address: verifier,
ens: addressMap[verifier]?.value,
}));
}, [data, addressMap]);
useEffect(() => {
if (!selectedVerifier && items.length > 0) {
setSelectedVerifier(items[0].address);
}
}, [selectedVerifier, setSelectedVerifier, items]);
return (
<Form.Field context={verifier}>
<Form.Combobox
items={items}
handleValue={(item) => item.address}
queryKey={['address', 'ens']}
>
{({ Field, Options }) => (
<>
<Field>
{(selected) =>
selected ? (
<ResolvedAddress>{selected.address}</ResolvedAddress>
) : (
'Select a Verifier'
)
}
</Field>
<Options>
{(item) => <ResolvedAddress>{item.address}</ResolvedAddress>}
</Options>
</>
)}
</Form.Combobox>
</Form.Field>
);
};
export const VerifyNFAStep: React.FC = () => {
const { prevStep } = Stepper.useContext();
const { verifyNFA, setVerifyNFA, setNfaStep } = Mint.useContext();
const {
form: {
verifier: {
value: [verifier],
},
},
} = useMintFormContext();
const handleNextStep = (): void => {
setNfaStep(2);
@ -36,7 +124,13 @@ export const VerifyNFAStep: React.FC = () => {
<Text css={{ color: '$slate12' }}>Verify NFA</Text>
<Switch checked={verifyNFA} onChange={setVerifyNFA} />
</Card.Text>
<Button colorScheme="blue" variant="solid" onClick={handleNextStep}>
<SelectVerifier />
<Button
colorScheme="blue"
variant="solid"
onClick={handleNextStep}
disabled={!verifier}
>
Continue
</Button>
</Flex>