All files / src/components/rent_rental RentRentalForm.tsx

0% Statements 0/67
0% Branches 0/1
0% Functions 0/1
0% Lines 0/67

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;