import React, { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import showToast from "../../../services/toastService"; import { useManageProjectInfra } from "../../../hooks/useProjects"; import { useSelector } from "react-redux"; // Schema const floorSchema = z.object({ buildingId: z .string() .refine((val) => val !== "0", { message: "Building is required" }), id: z.string().optional(), floorName: z.string().min(1, "Floor Name is required"), }); const defaultValues = { id: "0", floorName: "", buildingId: "0", }; const FloorModel = ({ project, onClose, onSubmit }) => { const selectedProject = useSelector( (store) => store.localVariables.projectId ); const [selectedBuilding, setSelectedBuilding] = useState(null); const { register, handleSubmit, setValue, reset, watch, formState: { errors }, } = useForm({ defaultValues, resolver: zodResolver(floorSchema), }); const watchId = watch("id"); const watchBuildingId = watch("buildingId"); const { mutate: ManageFloor, isPending } = useManageProjectInfra({ onSuccessCallback: (data, variables) => { showToast( watchId != "0" ? "Floor updated Successfully" : "Floor created Successfully", "success" ); reset({ id: "0", floorName: ""}); // onClose?.(); }, }); useEffect(() => { reset(defaultValues); }, []); useEffect(() => { const building = project?.find((b) => b.id === watchBuildingId); setSelectedBuilding(building || null); }, [watchBuildingId, project]); const handleBuildingChange = (e) => { const id = e.target.value; setValue("buildingId", id, { shouldValidate: true }); setValue("id", "0"); setValue("floorName", ""); }; const handleFloorChange = (e) => { const id = e.target.value; setValue("id", id); const floor = selectedBuilding?.floors?.find((f) => f.id === id); if (floor) { setValue("floorName", floor.floorName); } else { setValue("floorName", ""); } }; const onFormSubmit = (data) => { const isEdit = data.id !== "0"; const payload = { ...data, id: isEdit ? data.id : null, }; let infraObject = [ { building: null, floor: payload, workArea: null, }, ]; ManageFloor({ infraObject, projectId: selectedProject }); }; return (
Manage Floor
{errors.buildingId && (

{errors.buildingId.message}

)}
{watchBuildingId !== "0" && ( <>
{errors.floorName && (

{errors.floorName.message}

)}
)}
); }; export default FloorModel;