import { Dispatch, SetStateAction, useEffect } from 'react'; import toast from 'react-hot-toast'; import styled from 'styled-components'; // Hooks import { useForm } from 'react-hook-form'; // Styled import Button from '@commonStyle/Button.ts'; import Input from '@commonStyle/Input.ts'; // Types import { Nullable } from '@type/common.ts'; import { IRoom } from '@type/rooms.ts'; // Constants import { ADD_SUCCESS, EDIT_SUCCESS } from '@constant/messages.ts'; import { INVALID_DISCOUNT, INVALID_FIELD, REQUIRED_FIELD_ERROR, } from '@constant/formValidateMessage.ts'; import { INIT_VALUE_ROOM_FORM, REGEX } from '../../constants/commons.ts'; // Helpers import { isValidDiscount, isValidRegex, isValidString, } from '@helper/validators.ts'; // Components import FormRow from '@component/LabelControl/index.tsx'; import Form from '@component/Form/index.tsx'; // Services import { addRoom, updateRoom } from '@service/roomServices.ts'; const FormBtn = styled(Button)` width: 100%; &:disabled, &[disabled] { background-color: var(--disabled-btn-color); cursor: no-drop; } `; interface IRoomFormProp { onCloseModal?: () => void; reload?: boolean; setReload?: Dispatch>; roomEdit?: Nullable; } const RoomForm = ({ onCloseModal, reload, setReload, roomEdit, }: IRoomFormProp) => { const formMethods = useForm(); const { register, handleSubmit, reset, formState: { errors, isDirty, isValid, isSubmitting }, trigger, } = formMethods; useEffect(() => { if (roomEdit) { reset(roomEdit); } else { reset(INIT_VALUE_ROOM_FORM); } }, [roomEdit, reset]); // Submit form const onSubmit = async (room: IRoom) => { // Calculate final price room.finalPrice = room.price - (room.price * room.discount) / 100; if (!roomEdit) { // Add request const response = await addRoom(room); if (response) { toast.success(ADD_SUCCESS); } } else { // Edit request const response = await updateRoom(room); if (response) { toast.success(EDIT_SUCCESS); } } // Reload table data setReload!(!reload); reset(); onCloseModal!(); }; return (
isValidString(value) || INVALID_FIELD, }, onChange: () => trigger('name'), })} /> isValidRegex(REGEX.NUMBER, v.toString()) || INVALID_FIELD, }, onChange: () => trigger('price'), })} /> isValidDiscount(v) || INVALID_DISCOUNT, }, onChange: () => trigger('discount'), })} /> { !roomEdit ? 'Add' : 'Save' } Close
); }; export default RoomForm;