import BreweryPostQueryResult from '@/services/BreweryPost/types/BreweryPostQueryResult'; import { BeerType } from '@prisma/client'; import { FunctionComponent } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import BeerPostValidationSchema from '@/validation/BeerPostValidationSchema'; import Router from 'next/router'; import sendCreateBeerPostRequest from '@/requests/sendCreateBeerPostRequest'; import Button from './ui/forms/Button'; import FormError from './ui/forms/FormError'; import FormInfo from './ui/forms/FormInfo'; import FormLabel from './ui/forms/FormLabel'; import FormSegment from './ui/forms/FormSegment'; import FormSelect from './ui/forms/FormSelect'; import FormTextArea from './ui/forms/FormTextArea'; import FormTextInput from './ui/forms/FormTextInput'; type BeerPostT = z.infer; interface BeerFormProps { formType: 'edit' | 'create'; // eslint-disable-next-line react/require-default-props defaultValues?: BeerPostT; breweries?: BreweryPostQueryResult[]; types?: BeerType[]; } const BeerForm: FunctionComponent = ({ formType, defaultValues, breweries = [], types = [], }) => { const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(BeerPostValidationSchema), defaultValues: { name: defaultValues?.name, description: defaultValues?.description, abv: defaultValues?.abv, ibu: defaultValues?.ibu, }, }); const onSubmit: SubmitHandler = async (data) => { switch (formType) { case 'create': { try { const response = await sendCreateBeerPostRequest(data); Router.push(`/beers/${response.id}`); break; } catch (e) { // eslint-disable-next-line no-console console.error(e); break; } } case 'edit': break; default: break; } }; return (
Name {errors.name?.message} {formType === 'create' && breweries.length && ( <> Brewery {errors.breweryId?.message} ({ value: brewery.id, text: brewery.name, }))} placeholder="Brewery" message="Pick a brewery" /> )}
ABV {errors.abv?.message}
IBU {errors.ibu?.message}
Description {errors.description?.message} Type {errors.typeId?.message} ({ value: beerType.id, text: beerType.name, }))} placeholder="Beer type" message="Pick a beer type" />
); }; export default BeerForm;