Files
Luke SandbergandGitHub eaad5b4c14 Enable prettier for turbopack (#78559)
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.
2025-04-29 11:38:46 -07:00

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