import React from 'react'; import { useRef } from 'react'; import { useOutletContext } from 'react-router-dom'; import { Button, Container, FormControl, FormControlLabel, FormLabel, Grid, Radio, RadioGroup, TextField, } from '@mui/material'; import { useForm, Controller, useFieldArray } from 'react-hook-form'; import { useUpdateGuestMutation } from '../apiSlice'; import type { Guest } from '../apiSlice'; type FormValues = { id: number; firstName: string; lastName: string; attendance: string; email: string; partySize: number; message: string; partyList: { firstName: string; lastName: string; }[]; }; function RsvpForm() { const [updateGuest] = useUpdateGuestMutation(); const guest: Guest = useOutletContext(); const previousPartySize = useRef(0); const { register, handleSubmit, control, watch, formState: { errors }, } = useForm({ defaultValues: { id: guest?.id, firstName: guest?.firstName, lastName: guest?.lastName, attendance: '', email: '', message: '', partySize: 1, partyList: [], }, }); const onSubmit = async (data: Guest) => { updateGuest({ ...data }); }; const { fields, append, remove } = useFieldArray({ control, name: 'partyList', }); const handleParty = () => { const partySize = Number(watch('partySize')) - 1; if ( partySize > previousPartySize.current && partySize > 0 && partySize < 10 ) { append( new Array(partySize - previousPartySize.current).fill({ firstName: '', lastName: '', }) ); previousPartySize.current = partySize; } else if (partySize < previousPartySize.current && partySize >= 0) { remove( [...Array(previousPartySize.current - partySize).keys()].map( (_, i) => partySize - 1 + i ) ); previousPartySize.current = partySize; } }; return (

Please RSVP for the wedding by March 10, 2025. The ceremony will commence at 3 PM on April 26 in Divine Shepherd. The reception will follow at 5 PM in A Venue on the Ridge.

Will you attend? ( } label="Yes" /> } label="No" /> )} />
{ event.currentTarget.blur(); }} error={!!errors.partySize} helperText={errors.partySize?.message} required {...register('partySize', { onChange: handleParty, required: 'This field is required', min: { value: 1, message: 'Please enter a positive integer' }, max: { value: 9, message: 'Please enter an integer less than 10', }, })} /> {fields.map((field, index) => { return ( ); })}
); } export default RsvpForm;