import React, { useState, useEffect, useCallback } from "react"; import { useFieldArray, useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { useCreateActivity, useUpdateActivity, } from "../../../hooks/masterHook/useMaster"; import Label from "../../common/Label"; const schema = z.object({ activityName: z.string().min(1, { message: "Activity Name is required" }), unitOfMeasurement: z .string() .min(1, { message: "Unit of Measurement is required" }), checkList: z .array( z.object({ description: z .string() .min(1, { message: "descriptionlist item cannot be empty" }), isMandatory: z.boolean().default(false), id: z.any().default(null), }) ) .optional(), }); const ManageActivity = ({ activity = null, whichGroup = null, close }) => { const maxDescriptionLength = 255; const { mutate: createActivity, isPending: isLoading } = useCreateActivity( () => close?.() ); const { mutate: UpdateActivity, isPending: isUpdating } = useUpdateActivity( () => close?.() ); const { register, handleSubmit, control, setValue, clearErrors, setError, getValues, reset, formState: { errors }, } = useForm({ resolver: zodResolver(schema), defaultValues: { activityName: "", unitOfMeasurement: "", checkList: [], }, }); const { fields: checkListItems, append, remove, } = useFieldArray({ control, name: "checkList", }); const addChecklistItem = useCallback(() => { const values = getValues("checkList"); const lastIndex = checkListItems.length - 1; if ( checkListItems.length > 0 && (!values?.[lastIndex] || values[lastIndex].description.trim() === "") ) { setError(`checkList.${lastIndex}.description`, { type: "manual", message: "Please fill this checklist item before adding another.", }); return; } clearErrors(`checkList.${lastIndex}.description`); append({ id: null, description: "", isMandatory: false }); }, [checkListItems, getValues, append, setError, clearErrors]); const removeChecklistItem = useCallback( (index) => { remove(index); }, [remove] ); const handleChecklistChange = useCallback( (index, value) => { setValue(`checkList.${index}`, value); }, [setValue] ); const onSubmit = (formData) => { let payload = { ...formData, activityGroupId: whichGroup, }; if (activity) { UpdateActivity({ id: activity.id, payload: payload }); } else { createActivity(payload); } }; useEffect(() => { if (activity) { reset({ activityName: activity.activityName || "", unitOfMeasurement: activity.unitOfMeasurement || "", checkList: activity.checkLists?.map((check) => ({ id: check.id || null, // Use the ID provided in the checklist description: check.description || "", isMandatory: check.isMandatory || false, })) || [{ description: "", isMandatory: false }], // Default to an empty checklist item }); } }, [activity, reset]); const handleClose = useCallback(() => { reset(); close(); }, [reset, close]); useEffect(() => { const tooltipTriggerList = Array.from( document.querySelectorAll('[data-bs-toggle="tooltip"]') ); tooltipTriggerList.forEach((el) => new bootstrap.Tooltip(el)); }, []); let isPending = isLoading || isUpdating; return (
{/*
Create Activity
*/}
{errors.activityName && (

{errors.activityName.message}

)}
{errors.unitOfMeasurement && (

{errors.unitOfMeasurement.message}

)}
{checkListItems.length > 0 ? ( {checkListItems.map((item, index) => ( ))}
Name Is Mandatory Action
handleChecklistChange(index, e.target.value) } /> {errors.checkList?.[index]?.description && ( {errors.checkList[index]?.description?.message} )}
):(

Not Yet Added

)}
); }; export default ManageActivity;