import React, { useEffect, useState } from "react"; import useMaster from "../../hooks/masterHook/useMaster"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { RolesRepository } from "../../repositories/MastersRepository"; import { useEmployeeRoles } from "../../hooks/useEmployees"; import { useDispatch } from "react-redux"; import { changeMaster } from "../../slices/localVariablesSlice"; import showToast from "../../services/toastService"; const formSchema = z.object({ selectedRole: z.record(z.boolean()), }); const ManageRole = ( {employeeId, onClosed} ) => { const disptach = useDispatch(); useEffect(()=>{ disptach(changeMaster("Application Role")); },[disptach]) const [isLoading, setIsLoading] = useState(false); const { employeeRoles, loading } = useEmployeeRoles(employeeId); const { data, loading: roleLoading } = useMaster(); const buildDefaultRoles = () => { const defaults = {}; data.forEach((role) => { const isRoleEnabled = employeeRoles?.some( (empRole) => empRole.roleId === role.id ); defaults[role.id] = isRoleEnabled; }); return defaults; }; const [initialRoles, setInitialRoles] = useState({}); useEffect(() => { if (employeeRoles && data) { if (employeeRoles.length > 0) { const updatedRoles = buildDefaultRoles(); setInitialRoles(updatedRoles); } else { setInitialRoles({}); } } else { setInitialRoles({}); } }, [employeeRoles, data]); const { register, handleSubmit, formState: { errors }, reset, } = useForm({ resolver: zodResolver(formSchema), }); useEffect(() => { if (!data) return; const updatedRoles = {}; data.forEach((role) => { const isRoleEnabled = employeeRoles?.some( (empRole) => empRole.roleId === role.id && empRole.isEnabled ); updatedRoles[role.id] = isRoleEnabled || false; }); setInitialRoles(updatedRoles); reset({ selectedRole: updatedRoles, }); }, [employeeRoles, data, reset]); // const onSubmit = (formdata) => { // setIsLoading(true); // const result = []; // const selectedRoles = formdata.selectedRole; // for (const [roleId, isChecked] of Object.entries(selectedRoles)) { // const existingRole = employeeRoles?.find((role) => role.roleId === roleId); // const wasChecked = !!existingRole?.isEnabled; // // Only push if the checked status has changed // if (isChecked !== wasChecked) { // result.push({ // id: existingRole?.id || "00000000-0000-0000-0000-000000000000", // employeeId, // roleId, // isEnabled: isChecked, // }); // } // } // if (result.length === 0) { // showToast("No changes made", "info"); // setIsLoading(false); // return; // } // console.log(result); // RolesRepository.createEmployeeRoles(result) // .then(() => { // showToast("Roles updated successfully", "success"); // setIsLoading(false); // reset(); // onClosed(); // }) // .catch((err) => { // console.error(err); // showToast(err.message, "error"); // setIsLoading(false); // }); // }; const onSubmit = (formdata) => { setIsLoading(true); const result = []; const selectedRoles = formdata.selectedRole; for (const [roleId, isChecked] of Object.entries(selectedRoles)) { const existingRole = employeeRoles?.find((role) => role.roleId === roleId); const wasChecked = !!existingRole?.isEnabled; // Only push if the checked status has changed if (isChecked !== wasChecked) { result.push({ id: existingRole?.id || "00000000-0000-0000-0000-000000000000", employeeId, roleId, isEnabled: isChecked, }); } } if (result.length === 0) { showToast("No changes made", "info"); setIsLoading(false); return; } console.log(result); RolesRepository.createEmployeeRoles(result) .then(() => { showToast("Roles updated successfully", "success"); setIsLoading(false); reset(); onClosed(); }) .catch((error) => { const message = error?.response?.data?.message || error?.message || "Error occured during api calling" showToast(message, "error"); setIsLoading(false); }); }; return ( ); }; export default ManageRole;