import React, { useState, useEffect } from "react"; import { useFieldArray, useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { MasterRespository } from "../../repositories/MastersRepository"; import { clearApiCacheKey } from "../../slices/apiCacheSlice"; import { getCachedData, cacheData } from "../../slices/apiDataManager"; import showToast from "../../services/toastService"; 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" }), serviceId: z.string().min(1, { message: "A service selection is required." }), actitvityGroupId: z .string() .min(1, { message: "A activity group selection is required." }), checkList: z .array( z.object({ description: z .string() .min(1, { message: "description list item cannot be empty" }), isMandatory: z.boolean().default(false), id: z.any().default(null), }) ) .optional(), }); const CreateActivity = ({ onClose }) => { const [isLoading, setIsLoading] = useState(false); const [services, setServices] = useState(getCachedData("Services")); const [selectedService, setSelectedService] = useState(null); const [activityGroups, setActivityGroups] = useState( getCachedData("Activity Group") ); const [activityGroupList, setActivityGroupList] = useState(null); const { register, handleSubmit, control, setValue, clearErrors, setError, getValues, reset, formState: { errors }, } = useForm({ resolver: zodResolver(schema), defaultValues: { activityName: "", unitOfMeasurement: "", checkList: [], serviceId: "", actitvityGroupId: "", }, }); const { fields: checkListItems, append, remove, } = useFieldArray({ control, name: "checkList", }); // Form submission handler const onSubmit = (data) => { setIsLoading(true); MasterRespository.createActivity(data) .then((resp) => { const cachedData = getCachedData("Activity"); const updatedData = [...cachedData, resp?.data]; cacheData("Activity", updatedData); showToast("Activity Successfully Added.", "success"); setIsLoading(false); reset({ activityName: "", unitOfMeasurement: "", checkList: [], serviceId: "", actitvityGroupId: "", }); setSelectedService(null) // handleClose(); }) .catch((error) => { showToast(error.message, "error"); setIsLoading(false); }); }; const addChecklistItem = () => { 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, }); }; const handleServicesChange = (e) => { const { value } = e.target; const service = services.find((b) => b.id === String(value)); const selectedActivityGroups = activityGroups.filter( (ag) => ag.serviceId == service.id ); setSelectedService(service.id); setActivityGroupList(selectedActivityGroups); reset((prev) => ({ ...prev, serviceId: String(value), })); }; const handleActivityGroupsChange = (e) => { const { value } = e.target; const service = services.find((b) => b.id === String(value)); reset((prev) => ({ ...prev, actitvityGroupId: String(value), })); }; const removeChecklistItem = (index) => { remove(index); }; const handleChecklistChange = (index, value) => { setValue(`checkList.${index}`, value); }; const handleClose = () => { reset(); onClose(); }; // for tooltip useEffect(() => { if (!services) { MasterRespository.getServices().then((res) => { setServices(res?.data); cacheData("Services", res?.data); }); } if (!activityGroups) { MasterRespository.getActivityGroups().then((res) => { setActivityGroups(res?.data); cacheData("Activity Group", res?.data); }); } const tooltipTriggerList = Array.from( document.querySelectorAll('[data-bs-toggle="tooltip"]') ); tooltipTriggerList.forEach((el) => new bootstrap.Tooltip(el)); }, []); return (
); }; export default CreateActivity;