Nested Object
So far we've just put the image information as properties on our
NoteEditorSchema
, but the id
, file
, and altText
fields are really all
just part of a single object: An image. So it would be better to represent this
as a nested set of field properties under the NoteEditorSchema
under image
.However, because forms don't support nested objects, we'll need to use a utility
from Conform to help us out. Here's an example that resembles what you'll be
doing:
// example inspired from the Conform docs
import {
useForm,
useFieldset,
conform,
type FieldConfig,
} from '@conform-to/react'
function Example() {
const [form, fields] = useForm<Schema>({
// ... config stuff including the schema
})
return (
<form {...form.props}>
<AddressFields config={fields.address} />
</form>
)
}
function AddressFields({ config }: { config: FieldConfig<Address> }) {
const ref = useRef<HTMLFieldSetElement>(null)
const fields = useFieldset(ref, config)
return (
<fieldset ref={ref}>
<input {...conform.input(fields.street)} />
<input {...conform.input(fields.zipcode)} />
<input {...conform.input(fields.city)} />
<input {...conform.input(fields.country)} />
</fieldset>
)
}
We'll also get our type by using Zod's inference utility:
const RocketSchema = z.object({
// ...
})
type RocketType = z.infer<typeof RocketSchema>
function RocketFields({ config }: { config: FieldConfig<RocketType> }) {
// ...
}
So, fundamentally, we want to make this change:
{
title: string
content: string
imageId: string
file: File
altText: string
image: {
id: string
file: File
altText: string
}
}
And we want that hooked up to our form. That should be enough to get you going!