import React, { useState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { useActivitiesMaster, useWorkCategoriesMaster } 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"), workCategoryId: z.string().min(1, "Work Category 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, workCategoryId: 0, plannedWork: 0, completedWork: 0, }; const { projects_Details, refetch } = useProjectDetails(selectedProject); const [ActivityUnit, setActivityUnit] = useState(""); const { activities, loading, error } = useActivitiesMaster(); const { categories, categoryLoading, categoryError } = useWorkCategoriesMaster(); const [formData, setFormData] = useState(defaultModel); const [selectedActivity, setSelectedActivity] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [activityData, setActivityData] = useState([]); const [categoryData, setCategoryData] = useState([]); const dispatch = useDispatch(); const { register, handleSubmit, formState: { errors }, reset, setValue, getValues, watch, } = useForm({ resolver: zodResolver(taskSchema), defaultValues: defaultModel, }); const handleActivityChange = (e) => { const selectedId = String(e.target.value); const selected = activityData.find((a) => a.id === selectedId); setSelectedActivity(selected || null); setValue("activityID", selectedId); }; const handleCategoryChange = (e) => { const selectedId = String(e.target.value); const category = categoryData.find((b) => b.id === selectedId); setSelectedCategory(category || null); setValue("workCategoryId", selectedId); }; const onSubmitForm = async ( data ) => { setIsSubmitting(true) 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 ) ); setIsSubmitting(false) showToast("Activity Updated Successfully","success") onClose(); } }) .catch( ( error ) => { setIsSubmitting(false) const message = error.response.data.message || error.message || "Error Occured During Api Call" showToast( message, "error" ); }); }; const resetForm = () => { setFormData(defaultModel); setSelectedActivity(null); reset(defaultModel); }; useEffect(() => { reset({ activityID: workItem?.workItem?.activityId || workItem?.activityId || 0, workCategoryId: workItem?.workItem?.workCategoryId || workItem?.workCategoryId || 0, plannedWork: workItem?.workItem?.plannedWork || workItem?.plannedWork || 0, completedWork: workItem?.workItem?.completedWork || workItem?.completedWork || 0, }); return () => reset(); }, [activities, workItem]); const ISselectedActivity = watch("activityID"); useEffect(() => { if (ISselectedActivity) { const selected = activities.find((a) => a.id === ISselectedActivity); setSelectedActivity(selected || null); setActivityUnit(selected?.unitOfMeasurement); } }, [ISselectedActivity, activities]); return (