How to Send Data From a Form in Next.js
const sanityClient = require('@sanity/client')const client = sanityClient({ projectId: 'xxxxx',
dataset: 'production',
apiVersion: '2021-03-25',
useCdn: false,
token:
process.env.SANITY_API_WRITE_TOKEN ||
'xxxxx',
})
export default async function addDebt(_req_, _res_) {const { lender,
amountFunded,
balance,
dateFunded,
frequency,
numberOfPayments,
payback,
status,
} = JSON.parse(_req_.body)
try { await client.create({ _type: 'debt',
lender,
amountFunded,
balance,
dateFunded,
frequency,
numberOfPayments,
payback,
status,
})
} catch (err) { console.error(err)`return
res.status(500).json({ message:
Couldn't submit debt, err })`
}`return
res.status(200).json({ message:
Debt ${_res_._id} has been created })`}
import { useState } from 'react'import { useForm } from ‘react-hook-form’export default function DebtAddForm() {
const [formData, setFormData] = useState()
const [isSubmitting, setIsSubmitting] = useState(false)
const [hasSubmitted, setHasSubmitted] = useState(false)
const {
register,
handleSubmit,
formState: { errors },
} = useForm()
const onSubmit = async (
_data_) => { setIsSubmitting(true)let response
setFormData(
_data_)try {
response = await fetch(‘/api/addDebt’, {
method: ‘POST’,
body: JSON.stringify(
_data_),type: ‘application/json’,
})
setIsSubmitting(false)
setHasSubmitted(true)
} catch (err) {
setFormData(err)
}
}
if (isSubmitting) {
return <h3>Submitting debt...</h3>
}
if (hasSubmitted) {
return (
<>
<h3>Debt submitted</h3>
<ul>
<li>
Lender: {formData.lender} <br />
Amount Funded: {formData.amountFunded} <br />
Balance: {formData.balance} <br />
dateFunded: {formData.dateFunded} <br />
frequency: {formData.frequency} <br />
numberOfPayments: {formData.numberOfPayments} <br />
payback: {formData.payback} <br />
status: {formData.status} <br />
</li>
</ul>
</>
)
}
return (
<form onSubmit={handleSubmit(onSubmit)}>
<div>
<div>
<label className=‘text-xl block’>Lender</label>
<input
className={
mb-3 px-3 py-2 w-full border-2 border-gray-300 rounded shadow-sm ${
errors.lender ? ‘ring-2 ring-red-500’ : null
}name=‘lender’
{...register(‘lender’, { required: true })}
/>
<span className=‘text-red-400 text-sm py-2’>
{errors?.lender?.message}
</span>
</div>
<div>
<label className=‘text-xl block’>Amount Funded</label>
<input
className={
mb-3 px-3 py-2 w-full border-2 border-gray-300 rounded shadow-sm ${
errors.amountFunded ? ‘ring-2 ring-red-500’ : null
}name=‘amountFunded’
{...register(‘amountFunded’, { required: true })}
/>
<span className=‘text-red-400 text-sm py-2’>
{errors?.amountFunded?.message}
</span>
</div>
<div>
<label className=‘text-xl block’>Funded Date</label>
<input
className={
mb-3 px-3 py-2 w-full border-2 border-gray-300 rounded shadow-sm ${
errors.dateFunded ? ‘ring-2 ring-red-500’ : null
}name=‘dateFunded’
{...register(‘dateFunded’, { required: true })}
/>
<span className=‘text-red-400 text-sm py-2’>
{errors?.amountFunded?.message}
</span>
</div>
<div>
<label className=‘text-xl block’>Current Balance</label>
<input
className={
mb-3 px-3 py-2 w-full border-2 border-gray-300 rounded shadow-sm ${
errors.balance ? ‘ring-2 ring-red-500’ : null
}name=‘balance’
{...register(‘balance’, { required: true })}
/>
<span className=‘text-red-400 text-sm py-2’>
{errors?.balance?.message}
</span>
</div>
<div>
<label className=‘text-xl block’>Payback</label>
<input
className={
mb-3 px-3 py-2 w-full border-2 border-gray-300 rounded shadow-sm ${
errors.payback ? ‘ring-2 ring-red-500’ : null
}name=‘payback’
{...register(‘payback’, { required: true })}
/>
<span className=‘text-red-400 text-sm py-2’>
{errors?.payback?.message}
</span>
</div>
<div>
<label className=‘text-xl block’>Payment</label>
<input
className={
mb-3 px-3 py-2 w-full border-2 border-gray-300 rounded shadow-sm ${
errors.payment ? ‘ring-2 ring-red-500’ : null
}name=‘payment’
{...register(‘payment’, { required: true })}
/>
<span className=‘text-red-400 text-sm py-2’>
{errors?.payment?.message}
</span>
</div>
<div>
<label className=‘text-xl block’>Frequency</label>
<select
className={
mb-3 px-3 py-2 w-full border-2 border-gray-300 bg-white rounded shadow-sm ${
errors.frequency ? ‘ring-2 ring-red-500’ : null
}{...register(‘frequency’, { required: true })}
>
<option value=‘Daily’>Daily</option>
<option value=‘Weekly’>Weekly</option>
<option value=‘Bi-Weekly’>Bi-Weekly</option>
<option value=‘Monthly’>Monthly</option>
</select>
<span className=‘text-red-400 text-sm py-2’>
{errors?.frequency?.message}
</span>
</div>
<div>
<label className=‘text-xl block’>numberOfPayments</label>
<input
className={
mb-3 px-3 py-2 w-full border-2 border-gray-300 rounded shadow-sm ${
errors.numberOfPayments ? ‘ring-2 ring-red-500’ : null
}name=‘numberOfPayments’
{...register(‘numberOfPayments’, { required: true })}
/>
<span className=‘text-red-400 text-sm py-2’>
{errors?.numberOfPayments?.message}
</span>
</div>
<div>
<label className=‘text-xl block’>Status</label>
<select
className={
mb-3 px-3 py-2 w-full border-2 border-gray-300 bg-white rounded shadow-sm ${
errors.status ? ‘ring-2 ring-red-500’ : null
}{...register(‘status’, { required: true })}
>
<option value=‘Current’>Current</option>
<option value=‘Default’>Default</option>
<option value=‘Restructured’>Restructured</option>
</select>
<span className=‘text-red-400 text-sm py-2’>
{errors?.status?.message}
</span>
</div>
</div>
<div>
<input type=‘submit’ className=‘mt-3 btn1’ />
</div>
</form>
)
}
//client.js
import {createClient} from 'next-sanity'
export const sanityClient = createClient({
projectId: 'your-project-id-from-sanity.json',
dataset: 'your-dataset-name',
apiVersion: '2021-03-25',
token: '<http://sanity-auth-token-from-manage.sanity.io|sanity-auth-token-from-manage.sanity.io>',
useCdn: true, // `false` if you want to ensure fresh data
})onSubmitfunction, you need to create an object that contains the fields in your form and their values, then use
client.create. It's surprisingly straightforward if you already have the JS Client configured. Here's a pseudo code version of the script you'll need to run:
import { sanityClient } from './client'
const onSubmit = async () => {
const doc = {
_id = uuid4(), //or whatever package you use for generating a random ID
...formData //if the fields/values in data match the fields in your Sanity Schema you can use the spread operator to add them to your doc
}
client.create(doc).then(res => console.log(`Document was created, document ID is ${res._id}`)
}Was this answer helpful?
Sanity – Build the way you think, not the way your CMS thinks
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.