import React, { useEffect, useState } from "react"; import IconButton from "../common/IconButton"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { bucketScheam } from "./DirectorySchema"; import showToast from "../../services/toastService"; import Directory from "../../pages/Directory/Directory"; import { DirectoryRepository } from "../../repositories/DirectoryRepository"; import { cacheData, getCachedData } from "../../slices/apiDataManager"; import { useBuckets } from "../../hooks/useDirectory"; import EmployeeList from "./EmployeeList"; import { useAllEmployees, useEmployees } from "../../hooks/useEmployees"; import { useSortableData } from "../../hooks/useSortableData"; import ConfirmModal from "../common/ConfirmModal"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { DIRECTORY_ADMIN, DIRECTORY_MANAGER } from "../../utils/constants"; import { useProfile } from "../../hooks/useProfile"; const ManageBucket = () => { const { profile } = useProfile(); const [bucketList, setBucketList] = useState([]); const { employeesList } = useAllEmployees(false); const [selectedEmployee, setSelectEmployee] = useState([]); const { buckets, loading, refetch } = useBuckets(); const [action_bucket, setAction_bucket] = useState(false); const [isSubmitting, setSubmitting] = useState(false); const [selected_bucket, select_bucket] = useState(null); const [deleteBucket, setDeleteBucket] = useState(null); const [searchTerm, setSearchTerm] = useState(""); const DirManager = useHasUserPermission(DIRECTORY_MANAGER); const DirAdmin = useHasUserPermission(DIRECTORY_ADMIN); const { items: sortedBuckteList, requestSort, sortConfig, } = useSortableData(bucketList, { key: (e) => `${e.name}`, direction: "asc", }); const getSortIcon = () => { if (!sortConfig) return null; return sortConfig.direction === "asc" ? ( ) : ( ); }; const { register, handleSubmit, reset, formState: { errors }, } = useForm({ resolver: zodResolver(bucketScheam), defaultValues: { name: "", description: "", }, }); const onSubmit = async (data) => { setSubmitting(true); try { const cache_buckets = getCachedData("buckets") || []; let response; const arraysAreEqual = (a, b) => { if (a.length !== b.length) return false; const setA = new Set(a); const setB = new Set(b); return [...setA].every((id) => setB.has(id)); }; if (selected_bucket) { const payload = { ...data, id: selected_bucket.id }; response = await DirectoryRepository.UpdateBuckets( selected_bucket.id, payload ); const updatedBuckets = cache_buckets.map((bucket) => bucket.id === selected_bucket.id ? response?.data : bucket ); cacheData("buckets", updatedBuckets); setBucketList(updatedBuckets); const existingEmployeeIds = selected_bucket?.employeeIds || []; const employeesToUpdate = selectedEmployee.filter((emp) => { const isExisting = existingEmployeeIds.includes(emp.employeeId); return (!isExisting && emp.isActive) || (isExisting && !emp.isActive); }); const newActiveEmployeeIds = selectedEmployee .filter((emp) => { const isExisting = existingEmployeeIds.includes(emp.employeeId); return ( (!isExisting && emp.isActive) || (isExisting && !emp.isActive) ); }) .map((emp) => emp.employeeId); if ( !arraysAreEqual(newActiveEmployeeIds, existingEmployeeIds) && employeesToUpdate.length !== 0 ) { try { response = await DirectoryRepository.AssignedBuckets( selected_bucket.id, employeesToUpdate ); } catch (assignError) { const assignMessage = assignError?.response?.data?.message || assignError?.message || "Error assigning employees."; showToast(assignMessage, "error"); } } const updatedData = cache_buckets?.map((bucket) => bucket.id === response?.data?.id ? response.data : bucket ); cacheData("buckets", updatedData); setBucketList(updatedData); showToast("Bucket Updated Successfully", "success"); } else { response = await DirectoryRepository.CreateBuckets(data); const updatedBuckets = [...cache_buckets, response?.data]; cacheData("buckets", updatedBuckets); setBucketList(updatedBuckets); showToast("Bucket Created Successfully", "success"); } handleBack(); } catch (error) { const message = error?.response?.data?.message || error?.message || "Error occurred during API call"; showToast(message, "error"); } finally { setSubmitting(false); } }; const handleDeleteContact = async () => { try { const resp = await DirectoryRepository.DeleteBucket(deleteBucket); const cache_buckets = getCachedData("buckets") || []; const updatedBuckets = cache_buckets.filter( (bucket) => bucket.id !== deleteBucket ); cacheData("buckets", updatedBuckets); setBucketList(updatedBuckets); showToast("Bucket deleted successfully", "success"); setDeleteBucket(null); } catch (error) { const message = error?.response?.data?.message || error?.message || "Error occurred during API call."; showToast(message, "error"); } }; useEffect(() => { reset({ name: selected_bucket?.name || "", description: selected_bucket?.description || "", }); }, [selected_bucket]); useEffect(() => { setBucketList(buckets); }, [buckets]); const handleBack = () => { select_bucket(null); setAction_bucket(false); setSubmitting(false); reset({ name: "", description: "" }); setSelectEmployee([]); }; const sortedBucktesList = sortedBuckteList?.filter((bucket) => { const term = searchTerm?.toLowerCase(); const name = bucket.name?.toLowerCase(); return name?.includes(term); }); return ( <> {deleteBucket && ( setDeleteBucket(null)} /> )} Manage Buckets {action_bucket ? ( ) : ( setSearchTerm(e.target.value)} /> refetch()} /> )} { setAction_bucket(true); select_bucket(null); reset({ name: "", description: "" }); setSelectEmployee([]); }} > Add Bucket {!action_bucket ? ( {loading && ( Loading... )} {!loading && buckets.length === 0 && searchTerm.trim() === "" && ( No buckets available. )} {!loading && buckets.length > 0 && sortedBucktesList.length === 0 && ( No matching buckets found. )} {!loading && sortedBucktesList.map((bucket) => ( {bucket.name} {(DirManager || DirAdmin || bucket?.createdBy?.id === profile?.employeeInfo?.id) && ( { select_bucket(bucket); setAction_bucket(true); const initialSelectedEmployees = employeesList .filter((emp) => bucket.employeeIds?.includes( emp.employeeId ) ) .map((emp) => ({ ...emp, isActive: true })); setSelectEmployee(initialSelectedEmployees); }} > setDeleteBucket(bucket?.id)} > )} Contacts:{" "} {bucket.numberOfContacts ? bucket.numberOfContacts : 0} {bucket.description || "No description available."} ))} ) : ( <> Bucket Name {errors.name && ( {errors.name.message} )} Bucket Description {errors.description && ( {errors.description.message} )} {selected_bucket && ( setSelectEmployee(data)} bucket={selected_bucket} /> )} Cancel {isSubmitting ? "Please wait..." : "Submit"} > )} > ); }; export default ManageBucket;
Manage Buckets
{bucket.description || "No description available."}