import { Button } from 'components/Button' import type { DispatchExecuteArgs } from 'components/collections/actions/actions' import { dispatchExecute, isEitherType, previewExecutePayload } from 'components/collections/actions/actions' import { ActionsCombobox } from 'components/collections/actions/Combobox' import { useActionsComboboxState } from 'components/collections/actions/Combobox.hooks' import { Conditional } from 'components/Conditional' import { ContractPageHeader } from 'components/ContractPageHeader' import { FormControl } from 'components/FormControl' import { AddressInput, NumberInput } from 'components/forms/FormInput' import { useInputState, useNumberInputState } from 'components/forms/FormInput.hooks' import { InputDateTime } from 'components/InputDateTime' import { JsonPreview } from 'components/JsonPreview' import { TransactionHash } from 'components/TransactionHash' import { useContracts } from 'contexts/contracts' import { useWallet } from 'contexts/wallet' import type { NextPage } from 'next' import { NextSeo } from 'next-seo' import type { FormEvent } from 'react' import { useMemo, useState } from 'react' import { toast } from 'react-hot-toast' import { FaArrowRight } from 'react-icons/fa' import { useMutation } from 'react-query' import { withMetadata } from 'utils/layout' import { links } from 'utils/links' const CollectionActionsPage: NextPage = () => { const { minter: minterContract, sg721: sg721Contract } = useContracts() const wallet = useWallet() const [lastTx, setLastTx] = useState('') const [timestamp, setTimestamp] = useState(undefined) const comboboxState = useActionsComboboxState() const type = comboboxState.value?.id const sg721ContractState = useInputState({ id: 'sg721-contract-address', name: 'sg721-contract-address', title: 'Sg721 Address', subtitle: 'Address of the Sg721 contract', }) const minterContractState = useInputState({ id: 'minter-contract-address', name: 'minter-contract-address', title: 'Minter Address', subtitle: 'Address of the Minter contract', }) const limitState = useNumberInputState({ id: 'per-address-limi', name: 'perAddressLimit', title: 'Per Address Limit', subtitle: 'Enter the per address limit', }) const tokenIdState = useNumberInputState({ id: 'token-id', name: 'tokenId', title: 'Token ID', subtitle: 'Enter the token ID', }) const recipientState = useInputState({ id: 'recipient-address', name: 'recipient', title: 'Recipient Address', subtitle: 'Address of the recipient', }) const whitelistState = useInputState({ id: 'whitelist-address', name: 'whitelistAddress', title: 'Whitelist Address', subtitle: 'Address of the whitelist contract', }) const showWhitelistField = type === 'set_whitelist' const showDateField = type === 'update_start_time' const showLimitField = type === 'update_per_address_limit' const showTokenIdField = isEitherType(type, ['transfer', 'mint_for']) const showRecipientField = isEitherType(type, ['transfer', 'mint_to', 'mint_for']) const minterMessages = useMemo( () => minterContract?.use(minterContractState.value), [minterContract, minterContractState.value], ) const sg721Messages = useMemo( () => sg721Contract?.use(sg721ContractState.value), [sg721Contract, sg721ContractState.value], ) const payload: DispatchExecuteArgs = { whitelist: whitelistState.value, startTime: timestamp ? (timestamp.getTime() * 1_000_000).toString() : '', limit: limitState.value, minterContract: minterContractState.value, sg721Contract: sg721ContractState.value, tokenId: tokenIdState.value, minterMessages, sg721Messages, recipient: recipientState.value, txSigner: wallet.address, type, } const { isLoading, mutate } = useMutation( async (event: FormEvent) => { event.preventDefault() if (!type) { throw new Error('Please select an action!') } if (minterContractState.value === '' && sg721ContractState.value === '') { throw new Error('Please enter minter and sg721 contract addresses!') } const txHash = await toast.promise(dispatchExecute(payload), { error: `${type.charAt(0).toUpperCase() + type.slice(1)} execute failed!`, loading: 'Executing message...', success: (tx) => `Transaction ${tx} success!`, }) if (txHash) { setLastTx(txHash) } }, { onError: (error) => { toast.error(String(error)) }, }, ) return (
{showRecipientField && } {showWhitelistField && } {showLimitField && } {showTokenIdField && } setTimestamp(date)} value={timestamp} />
) } export default withMetadata(CollectionActionsPage, { center: false })