import React, { useState, useEffect } from "react"; import { set, useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; // 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 ) => { console.log(data) let WorkArea = { id: data.id, areaName: data.areaName, floorId: data.floorId, buildingId:data.buildingId } onSubmit(WorkArea); // Send the final data to the parent }; const handleCancel = () => { reset(defaultModel); // Reset the form to initial state setSelectedFloor(null); setSelectedBuilding(null); }; return (
)}
); }; export default WorkAreaModel;