import sendUploadBreweryImagesRequest from '@/requests/images/brewery-image/sendUploadBreweryImageRequest'; import CreateBreweryPostSchema from '@/services/posts/brewery-post/schema/CreateBreweryPostSchema'; import UploadImageValidationSchema from '@/services/schema/ImageSchema/UploadImageValidationSchema'; import createErrorToast from '@/util/createErrorToast'; import { Tab } from '@headlessui/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { AddressAutofillRetrieveResponse } from '@mapbox/search-js-core'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/router'; import { FC, Fragment } from 'react'; import { useForm, SubmitHandler, FieldError, UseFormRegister, FieldErrors, UseFormSetValue, } from 'react-hook-form'; import toast from 'react-hot-toast'; import { z } from 'zod'; 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 FormTextArea from '../ui/forms/FormTextArea'; import FormTextInput from '../ui/forms/FormTextInput'; import Button from '../ui/forms/Button'; import { sendCreateBreweryPostRequest } from '@/requests/posts/brewery-post'; const AddressAutofill = dynamic( // @ts-expect-error () => import('@mapbox/search-js-react').then((mod) => mod.AddressAutofill), { ssr: false }, ); const CreateBreweryPostWithImagesSchema = CreateBreweryPostSchema.merge( UploadImageValidationSchema, ); const InfoSection: FC<{ register: UseFormRegister>; errors: FieldErrors>; isSubmitting: boolean; }> = ({ register, errors, isSubmitting }) => { return ( <> Name {errors.name?.message} Description {errors.description?.message} Date Established {errors.dateEstablished?.message} Images {(errors.images as FieldError | undefined)?.message} ); }; const LocationSection: FC<{ register: UseFormRegister>; errors: FieldErrors>; isSubmitting: boolean; setValue: UseFormSetValue>; mapboxAccessToken: string; }> = ({ register, errors, isSubmitting, setValue, mapboxAccessToken }) => { const onAutoCompleteChange = (address: string) => { setValue('address', address); }; const onAutoCompleteRetrieve = (address: AddressAutofillRetrieveResponse) => { const { country, region, place } = address.features[0].properties as unknown as { country?: string; region?: string; place?: string; }; setValue('country', country); setValue('region', region); setValue('city', place!); }; return ( <> Address {errors.address?.message}
City {errors.city?.message}
Region {errors.region?.message}
Country {errors.country?.message} ); }; const CreateBreweryPostForm: FC<{ mapboxAccessToken: string; }> = ({ mapboxAccessToken }) => { const { register, handleSubmit, reset, setValue, formState: { errors, isSubmitting }, } = useForm>({ resolver: zodResolver(CreateBreweryPostWithImagesSchema), }); const router = useRouter(); const onSubmit: SubmitHandler< z.infer > = async (data) => { const loadingToast = toast.loading('Creating brewery...'); try { if (!(data.images instanceof FileList)) { return; } const breweryPost = await sendCreateBreweryPostRequest({ body: data }); await sendUploadBreweryImagesRequest({ breweryPost, images: data.images }); await router.push(`/breweries/${breweryPost.id}`); toast.remove(loadingToast); toast.success('Created brewery.'); } catch (error) { toast.remove(loadingToast); createErrorToast(error); reset(); } }; return (
{ const fieldErrors = Object.keys(error).length; toast.error(`Form submission failed.`); toast.error(`You have ${fieldErrors} errors in your form.`); })} className="form-control" autoComplete="off" > Information Location
); }; export default CreateBreweryPostForm;