import React, { useState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { useActivitiesMaster } from "../../../hooks/masterHook/useMaster"; import { useProjectDetails } from "../../../hooks/useProjects"; import { useDispatch, useSelector } from "react-redux"; import ProjectRepository from "../../../repositories/ProjectRepository"; import { cacheData, clearCacheKey, getCachedData, } from "../../../slices/apiDataManager"; import { refreshData } from "../../../slices/localVariablesSlice"; import showToast from "../../../services/toastService"; const taskSchema = z .object({ activityID: z.string().min(1, "Activity is required"), plannedWork: z.number().min(1, "Planned Work must be greater than 0"), completedWork: z.number().min(0, "Completed Work must be greater than 0"), }) .refine( (data) => data.completedWork === undefined || data.completedWork <= data.plannedWork, { message: "Completed Work cannot be greater than Planned Work", path: ["completedWork"], // error will show next to this field } ); const EditActivityModal = ({ workItem, workArea, building, floor, onClose, }) => { const selectedProject = useSelector( (store) => store.localVariables.projectId ); const defaultModel = { activityID: 0, plannedWork: 0, completedWork: 0, }; const { projects_Details, refetch } = useProjectDetails(selectedProject); const { activities, loading, error } = useActivitiesMaster(); const [formData, setFormData] = useState(defaultModel); const [selectedActivity, setSelectedActivity] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [activityData, setActivityData] = useState([]); const dispatch = useDispatch(); const { register, handleSubmit, formState: { errors }, reset, setValue, getValues, watch, } = useForm({ resolver: zodResolver(taskSchema), defaultValues: defaultModel, }); const handleActivityChange = (e) => { const selectedId = Number(e.target.value); const selected = activityData.find((a) => a.id === selectedId); setSelectedActivity(selected || null); setValue("activityID", selectedId); }; const onSubmitForm = async (data) => { const updatedProject = { ...projects_Details }; const finalData = { ...data, id: workItem?.workItem?.id ?? workItem?.id, buildingID: building?.id, floorId: floor?.id, workAreaId: workArea?.id, }; ProjectRepository.manageProjectTasks([finalData]) .then((response) => { if (response?.data[0]) { const { workItemId, workItem } = response.data[0]; let finalUpdatedWorkItem = null; const newProject = { ...updatedProject, buildings: updatedProject.buildings.map((building) => building.id === finalData.buildingID ? { ...building, floors: building.floors.map((floor) => floor.id === finalData.floorId ? { ...floor, workAreas: floor.workAreas.map((workArea) => workArea.id === workItem?.workAreaId ? { ...workArea, workItems: (() => { const exists = workArea.workItems.some( (item) => String( item?.workItem?.id ?? item?.id ) === String(finalData.id) ); finalUpdatedWorkItem = workItem; return exists ? workArea.workItems.map((item) => String( item?.workItem?.id ?? item?.id ) === String(finalData.id) ? workItem : item ) : [...workArea.workItems, workItem]; })(), } : workArea ), } : floor ), } : building ), }; cacheData("projectInfo", { projectId: newProject.id, data: newProject, }); resetForm(); dispatch( refreshData( true ) ); showToast("Activity Updated Successfully","success") onClose(); } }) .catch((error) => { showToast(error.message, "error"); }); }; const resetForm = () => { setFormData(defaultModel); setSelectedActivity(null); reset(defaultModel); }; useEffect(() => { reset({ activityID: workItem?.workItem?.activityId || workItem?.activityId || 0, plannedWork: workItem?.workItem?.plannedWork || workItem?.plannedWork || 0, completedWork: workItem?.workItem?.completedWork || workItem?.completedWork || 0, }); return () => reset(); }, [activities, workItem]); const ISselectedActivity = watch("activityID"); useEffect(() => { const selected = activities.find((a) => a.id === ISselectedActivity); setSelectedActivity(selected || null); }, [ISselectedActivity]); return (