import React, { useState, useEffect } from "react"; import { set, useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import showToast from "../../../services/toastService"; // Zod schema for form validation const workAreaSchema = z.object({ id: z.string().nonempty("Floor is required"), buildingId: z.string().nonempty("Building is required"), floorId: z.string().nonempty("Floor is required"), areaName: z .string() .nonempty("Work Area Name is required") .min(3, "Name must be at least 3 characters long"), }); // Default form data const defaultModel = { id: "0", areaName: "", floorId: "0", }; const WorkAreaModel = ({ project, onSubmit, clearTrigger, onClearComplete, onClose, }) => { const [selectedBuilding, setSelectedBuilding] = useState(null); const [selectedFloor, setSelectedFloor] = useState(null); const [selectdWorkArea, setWorkArea] = useState(); const { register, handleSubmit, formState: { errors }, setValue, reset, watch, } = useForm({ resolver: zodResolver(workAreaSchema), // Use Zod resolver for validation defaultValues: defaultModel, }); const floorId = watch("floorId"); // Watch the floorId for conditional rendering useEffect(() => { if (clearTrigger) { reset(defaultModel); // Reset form to initial state setSelectedBuilding(null); setSelectedFloor(null); onClearComplete(); } }, [clearTrigger, onClearComplete, reset]); const handleWorkAreaChange = (e) => { const { value } = e.target; if (value === "0") { setValue("id", "0"); // Create New Work Area setValue("areaName", ""); setWorkArea(String(0)); } else { const workArea = selectedFloor?.workAreas.find( (b) => b.id === Number(value) ); if (workArea) { setValue("id", String(workArea.id)); // Set id as a string setValue("areaName", workArea.areaName); setWorkArea(String(workArea.id)); } } }; const handleFloorChange = (e) => { const { value } = e.target; const floor = selectedBuilding?.floors.find((b) => b.id === Number(value)); if (floor) { setSelectedFloor(floor); setValue("floorId", floor.id); // Update floorId setValue("id", "0"); // Reset Work Area ID for new area creation setValue("areaName", ""); // Reset Work Area Name when changing floor } else { setSelectedFloor(null); setValue("floorId", "0"); setValue("id", "0"); // Reset Work Area ID setValue("areaName", ""); // Reset Work Area Name } }; const handleBuildingChange = (e) => { const { value } = e.target; const building = project?.buildings.find((b) => b.id === Number(value)); setSelectedBuilding(building); setSelectedFloor(null); // Reset selected floor on building change reset(defaultModel); // Reset the form when a new building is selected }; const onSubmitForm = (data) => { let WorkArea = { id: data.id, areaName: data.areaName, floorId: data.floorId, buildingId: data.buildingId, }; onSubmit(WorkArea); reset({ id: "0", areaName: "", }); if (data.id !== "0") { showToast("WorkArea updated successfully.", "success"); } else { showToast("WorkArea created successfully.", "success"); } }; const handleCancel = () => { reset(defaultModel); setSelectedFloor(null); setSelectedBuilding(null); onClose(); }; return (
)}
); }; export default WorkAreaModel;