Skip to content

Commit 4c1f1c5

Browse files
authored
Merge pull request #57 from peetzweg/pz/zod-form
feat: use zod for form validation
2 parents ee442ba + b753f5f commit 4c1f1c5

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

.changeset/early-deers-dream.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@inkathon/frontend": minor
3+
---
4+
5+
uses zod for form validation

frontend/src/components/web3/greeter-contract-interactions.tsx

+13-11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import { FC, useEffect, useState } from 'react'
44

55
import { ContractIds } from '@/deployments/deployments'
6+
import { zodResolver } from '@hookform/resolvers/zod'
67
import GreeterContract from '@inkathon/contracts/typed-contracts/contracts/greeter'
78
import {
89
contractQuery,
@@ -11,25 +12,29 @@ import {
1112
useRegisteredContract,
1213
useRegisteredTypedContract,
1314
} from '@scio-labs/use-inkathon'
14-
import { useForm } from 'react-hook-form'
15+
import { SubmitHandler, useForm } from 'react-hook-form'
1516
import toast from 'react-hot-toast'
17+
import * as z from 'zod'
1618

1719
import { Button } from '@/components/ui/button'
1820
import { Card, CardContent } from '@/components/ui/card'
1921
import { Form, FormControl, FormItem, FormLabel } from '@/components/ui/form'
2022
import { Input } from '@/components/ui/input'
2123
import { contractTxWithToast } from '@/utils/contract-tx-with-toast'
2224

23-
type UpdateGreetingValues = { newMessage: string }
25+
const formSchema = z.object({
26+
newMessage: z.string().min(1).max(90),
27+
})
2428

2529
export const GreeterContractInteractions: FC = () => {
2630
const { api, activeAccount, activeSigner } = useInkathon()
2731
const { contract, address: contractAddress } = useRegisteredContract(ContractIds.Greeter)
2832
const { typedContract } = useRegisteredTypedContract(ContractIds.Greeter, GreeterContract)
2933
const [greeterMessage, setGreeterMessage] = useState<string>()
3034
const [fetchIsLoading, setFetchIsLoading] = useState<boolean>()
31-
const [updateIsLoading, setUpdateIsLoading] = useState<boolean>()
32-
const form = useForm<UpdateGreetingValues>()
35+
const form = useForm<z.infer<typeof formSchema>>({
36+
resolver: zodResolver(formSchema),
37+
})
3338

3439
const { register, reset, handleSubmit } = form
3540

@@ -60,14 +65,12 @@ export const GreeterContractInteractions: FC = () => {
6065
}, [typedContract])
6166

6267
// Update Greeting
63-
const updateGreeting = async ({ newMessage }: UpdateGreetingValues) => {
68+
const updateGreeting: SubmitHandler<z.infer<typeof formSchema>> = async ({ newMessage }) => {
6469
if (!activeAccount || !contract || !activeSigner || !api) {
6570
toast.error('Wallet not connected. Try again…')
6671
return
6772
}
6873

69-
// Send transaction
70-
setUpdateIsLoading(true)
7174
try {
7275
await contractTxWithToast(api, activeAccount.address, contract, 'setMessage', {}, [
7376
newMessage,
@@ -76,7 +79,6 @@ export const GreeterContractInteractions: FC = () => {
7679
} catch (e) {
7780
console.error(e)
7881
} finally {
79-
setUpdateIsLoading(false)
8082
fetchGreeting()
8183
}
8284
}
@@ -115,12 +117,12 @@ export const GreeterContractInteractions: FC = () => {
115117
<FormLabel className="text-base">Update Greeting</FormLabel>
116118
<FormControl>
117119
<div className="flex gap-2">
118-
<Input disabled={updateIsLoading} {...register('newMessage')} />
120+
<Input disabled={form.formState.isSubmitting} {...register('newMessage')} />
119121
<Button
120122
type="submit"
121123
className="bg-primary font-bold"
122-
disabled={fetchIsLoading || updateIsLoading}
123-
isLoading={updateIsLoading}
124+
disabled={fetchIsLoading || form.formState.isSubmitting}
125+
isLoading={form.formState.isSubmitting}
124126
>
125127
Submit
126128
</Button>

0 commit comments

Comments
 (0)