Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import { Controller, SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react'; import { ErrorMessage } from '@hookform/error-message'; import { ErrorResponse } from '../../models/errorResponse'; import { OkResponse } from '../../models/okResponse'; import { Pending } from '../../models/pending'; import { rentalSchema, RentalSchemaType } from '../../validations/rental'; import { DesktopDatePicker, LocalizationProvider } from '@mui/x-date-pickers'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import dayjs from 'dayjs'; import { useFetchRentRental } from '../../hooks/useFetchRentRental'; type Props = { id: string; setResult: Dispatch<SetStateAction<OkResponse | ErrorResponse | Pending | null>>; }; const RentRentalForm: FC<Props> = (props) => { const [cleared, setCleared] = useState<boolean>(false); useEffect(() => { if (cleared) { const timeout = setTimeout(() => { setCleared(false); }, 10); return () => clearTimeout(timeout); } return () => {}; }, [cleared]); const { register, handleSubmit, formState: { errors }, control, } = useForm<RentalSchemaType>({ resolver: zodResolver(rentalSchema), }); const onSubmit: SubmitHandler<RentalSchemaType> = async (formData) => { console.table(formData); props.setResult('pending'); const result: ErrorResponse | OkResponse = await useFetchRentRental(parseInt(props.id), formData); props.setResult(result); }; return ( <form onSubmit={handleSubmit(onSubmit)}> <label htmlFor="recipient">recipient: </label> <input id="recipient" type="text" {...register('recipient')} /> <br /> <ErrorMessage errors={errors} name="recipient" message={errors.recipient?.message} /> <br /> <label htmlFor="rental_description">rental_description: </label> <input id="rental_description" type="text" {...register('rental_description')} /> <br /> <ErrorMessage errors={errors} name="rental_description" message={errors.rental_description?.message} /> <br /> <label htmlFor="scheduled_replace_at">scheduled_replace_at: </label> <Controller name="scheduled_replace_at" control={control} render={({ field }) => ( <LocalizationProvider {...field} dateAdapter={AdapterDayjs}> <DesktopDatePicker label="scheduled_replace_at" onChange={(value) => field.onChange(value === null ? '' : dayjs(value).format('YYYY-MM-DD[T]HH:mm:ss[Z]')) } format="YYYY/MM/DD" slotProps={{ calendarHeader: { format: 'YYYY年MM月' }, field: { clearable: true, onClear: () => setCleared(true) }, }} /> </LocalizationProvider> )} /> <br /> <ErrorMessage errors={errors} name="scheduled_replace_at" message={errors.scheduled_replace_at?.message} /> <br /> <input type="submit" value="貸し出し" /> </form> ); }; export default RentRentalForm; |