import React, { useEffect } from "react"; import { useProjectLevelEmployeePermission, useProjectLevelModules, useUpdateProjectLevelEmployeePermission, } from "../../hooks/useProjects"; import { useSelectedProject } from "../../slices/apiDataManager"; import { useEmployeesByProject } from "../../hooks/useEmployees"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import showToast from "../../services/toastService"; export const ProjectPermissionSchema = z.object({ employeeId: z.string().min(1, "Employee is required"), selectedPermissions: z.array(z.string()).optional(), }); const ProjectPermission = () => { const selectedProject = useSelectedProject(); const { data: ProjectModules = [] } = useProjectLevelModules(); const { employees = [], loading } = useEmployeesByProject(selectedProject); const { register, watch, handleSubmit, reset, formState: { errors }, } = useForm({ resolver: zodResolver(ProjectPermissionSchema), defaultValues: { employeeId: "", selectedPermissions: [], }, }); const selectedEmployee = watch("employeeId"); const { data: selectedEmpPermissions } = useProjectLevelEmployeePermission( selectedEmployee || "", selectedProject ); useEffect(() => { if (!selectedEmployee) return; const enabledPerms = selectedEmpPermissions?.permissions ?.filter((perm) => perm.isEnabled) ?.map((perm) => perm.id) || []; reset((prev) => ({ ...prev, selectedPermissions: enabledPerms, })); }, [selectedEmpPermissions, reset, selectedEmployee]); const { mutate: updatePermission, isPending } = useUpdateProjectLevelEmployeePermission(); const onSubmit = (formData) => { if (!formData.employeeId) { showToast("Please select an employee", "warn"); return; } const existingPermissions = selectedEmpPermissions?.permissions || []; const existingEnabledIds = existingPermissions .filter((p) => p.isEnabled) .map((p) => p.id); const newSelectedIds = formData.selectedPermissions || []; const removed = existingEnabledIds .filter((id) => !newSelectedIds.includes(id)) .map((id) => ({ id, isEnabled: false })); const added = newSelectedIds .filter((id) => !existingEnabledIds.includes(id)) .map((id) => ({ id, isEnabled: true })); const payloadPermissions = [...removed, ...added]; if (payloadPermissions.length === 0) { showToast("No changes detected", "info"); return; } const payload = { employeeId: formData.employeeId, projectId: selectedProject, permission: payloadPermissions, }; updatePermission(payload); }; return (
{/* Employee Dropdown */}
{errors.employeeId && (
{errors.employeeId.message}
)}
{/* Permissions */} {ProjectModules.map((feature) => (
{feature.name}
{feature.featurePermissions?.map((perm) => (
))}

))}
); }; export default ProjectPermission;