mirror of
https://github.com/hanzoai/next.js.git
synced 2026-10-30 14:46:38 +00:00
Enable prettier for turbopack While the majority of the javascript in turbopack is for tests, this code is generally hand authored so prettier will help us. There are also core parts of turbopack implemented in JavaScript/TypeScript so a formatter will help. This was done by simply fixing prettier ignore and chasing lint errors. There were a few fun issues * We had a test file called `won't-run-tla.js` and this triggered a bug in our eslint precommit hook. The simplest thing was to simply drop the `'` character so that is what i did. I spent a small amount of time trying to narrow this down't in the `lint-staged` dependency but failed, so i think the problem is probably in `eslint`, but it isn't really clear. * We had another test exercising `import.meta` but in a file called `.cjs`, which prettier rejects due its default `babel` parser. So i excluded this from prettier.
203 lines
4.9 KiB
JavaScript
203 lines
4.9 KiB
JavaScript
import { useState } from 'react'
|
|
import { useRouter } from 'next/router'
|
|
import { mutate } from 'swr'
|
|
|
|
const Form = ({ formId, petForm, forNewPet = true }) => {
|
|
const router = useRouter()
|
|
const contentType = 'application/json'
|
|
const [errors, setErrors] = useState({})
|
|
const [message, setMessage] = useState('')
|
|
|
|
const [form, setForm] = useState({
|
|
name: petForm.name,
|
|
owner_name: petForm.owner_name,
|
|
species: petForm.species,
|
|
age: petForm.age,
|
|
poddy_trained: petForm.poddy_trained,
|
|
diet: petForm.diet,
|
|
image_url: petForm.image_url,
|
|
likes: petForm.likes,
|
|
dislikes: petForm.dislikes,
|
|
})
|
|
|
|
/* The PUT method edits an existing entry in the mongodb database. */
|
|
const putData = async (form) => {
|
|
const { id } = router.query
|
|
|
|
try {
|
|
const res = await fetch(`/api/pets/${id}`, {
|
|
method: 'PUT',
|
|
headers: {
|
|
Accept: contentType,
|
|
'Content-Type': contentType,
|
|
},
|
|
body: JSON.stringify(form),
|
|
})
|
|
|
|
// Throw error with status code in case Fetch API req failed
|
|
if (!res.ok) {
|
|
throw new Error(res.status)
|
|
}
|
|
|
|
const { data } = await res.json()
|
|
|
|
mutate(`/api/pets/${id}`, data, false) // Update the local data without a revalidation
|
|
router.push('/')
|
|
} catch (error) {
|
|
setMessage('Failed to update pet')
|
|
}
|
|
}
|
|
|
|
/* The POST method adds a new entry in the mongodb database. */
|
|
const postData = async (form) => {
|
|
try {
|
|
const res = await fetch('/api/pets', {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: contentType,
|
|
'Content-Type': contentType,
|
|
},
|
|
body: JSON.stringify(form),
|
|
})
|
|
|
|
// Throw error with status code in case Fetch API req failed
|
|
if (!res.ok) {
|
|
throw new Error(res.status)
|
|
}
|
|
|
|
router.push('/')
|
|
} catch (error) {
|
|
setMessage('Failed to add pet')
|
|
}
|
|
}
|
|
|
|
const handleChange = (e) => {
|
|
const target = e.target
|
|
const value =
|
|
target.name === 'poddy_trained' ? target.checked : target.value
|
|
const name = target.name
|
|
|
|
setForm({
|
|
...form,
|
|
[name]: value,
|
|
})
|
|
}
|
|
|
|
const handleSubmit = (e) => {
|
|
e.preventDefault()
|
|
const errs = formValidate()
|
|
if (Object.keys(errs).length === 0) {
|
|
forNewPet ? postData(form) : putData(form)
|
|
} else {
|
|
setErrors({ errs })
|
|
}
|
|
}
|
|
|
|
/* Makes sure pet info is filled for pet name, owner name, species, and image url*/
|
|
const formValidate = () => {
|
|
let err = {}
|
|
if (!form.name) err.name = 'Name is required'
|
|
if (!form.owner_name) err.owner_name = 'Owner is required'
|
|
if (!form.species) err.species = 'Species is required'
|
|
if (!form.image_url) err.image_url = 'Image URL is required'
|
|
return err
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<form id={formId} onSubmit={handleSubmit}>
|
|
<label htmlFor="name">Name</label>
|
|
<input
|
|
type="text"
|
|
maxLength="20"
|
|
name="name"
|
|
value={form.name}
|
|
onChange={handleChange}
|
|
required
|
|
/>
|
|
|
|
<label htmlFor="owner_name">Owner</label>
|
|
<input
|
|
type="text"
|
|
maxLength="20"
|
|
name="owner_name"
|
|
value={form.owner_name}
|
|
onChange={handleChange}
|
|
required
|
|
/>
|
|
|
|
<label htmlFor="species">Species</label>
|
|
<input
|
|
type="text"
|
|
maxLength="30"
|
|
name="species"
|
|
value={form.species}
|
|
onChange={handleChange}
|
|
required
|
|
/>
|
|
|
|
<label htmlFor="age">Age</label>
|
|
<input
|
|
type="number"
|
|
name="age"
|
|
value={form.age}
|
|
onChange={handleChange}
|
|
/>
|
|
|
|
<label htmlFor="poddy_trained">Potty Trained</label>
|
|
<input
|
|
type="checkbox"
|
|
name="poddy_trained"
|
|
checked={form.poddy_trained}
|
|
onChange={handleChange}
|
|
/>
|
|
|
|
<label htmlFor="diet">Diet</label>
|
|
<textarea
|
|
name="diet"
|
|
maxLength="60"
|
|
value={form.diet}
|
|
onChange={handleChange}
|
|
/>
|
|
|
|
<label htmlFor="image_url">Image URL</label>
|
|
<input
|
|
type="url"
|
|
name="image_url"
|
|
value={form.image_url}
|
|
onChange={handleChange}
|
|
required
|
|
/>
|
|
|
|
<label htmlFor="likes">Likes</label>
|
|
<textarea
|
|
name="likes"
|
|
maxLength="60"
|
|
value={form.likes}
|
|
onChange={handleChange}
|
|
/>
|
|
|
|
<label htmlFor="dislikes">Dislikes</label>
|
|
<textarea
|
|
name="dislikes"
|
|
maxLength="60"
|
|
value={form.dislikes}
|
|
onChange={handleChange}
|
|
/>
|
|
|
|
<button type="submit" className="btn">
|
|
Submit
|
|
</button>
|
|
</form>
|
|
<p>{message}</p>
|
|
<div>
|
|
{Object.keys(errors).map((err, index) => (
|
|
<li key={index}>{err}</li>
|
|
))}
|
|
</div>
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default Form
|