import React, { useEffect, useState } from "react"; import { useActiveInActiveDocument, useDocumentListByEntityId, } from "../../hooks/useDocument"; import { DELETE_DOCUMENT, ITEMS_PER_PAGE, MODIFY_DOCUMENT, } from "../../utils/constants"; import Avatar from "../common/Avatar"; import { formatUTCToLocalTime } from "../../utils/dateUtils"; import { useDebounce } from "../../utils/appUtils"; import { DocumentTableSkeleton } from "./DocumentSkeleton"; import { getDocuementsStatus, useDocumentContext } from "./Documents"; import Pagination from "../common/Pagination"; import ConfirmModal from "../common/ConfirmModal"; import { isPending } from "@reduxjs/toolkit"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { useProfile } from "../../hooks/useProfile"; import { useParams } from "react-router-dom"; import showToast from "../../services/toastService"; const DocumentsList = ({ Document_Entity, Entity, filters, searchText, setIsRefetching, setRefetchFn, isActive, }) => { const { employeeId } = useParams(); const [isSelf, setIsSelf] = useState(false); const { profile } = useProfile(); const canDeleteDocument = useHasUserPermission(DELETE_DOCUMENT); const canModifyDocument = useHasUserPermission(MODIFY_DOCUMENT); useEffect(() => { if (profile?.employeeInfo?.id && employeeId) { setIsSelf(String(profile.employeeInfo.id) === String(employeeId)); } }, [profile?.employeeInfo?.id, employeeId]); const [IsDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [deletingId, setDeletingId] = useState(null); const [restoringIds, setRestoringIds] = useState([]); const debouncedSearch = useDebounce(searchText, 500); const [currentPage, setCurrentPage] = useState(1); const { data, isError, isLoading, error, refetch, isFetching } = useDocumentListByEntityId( Document_Entity, Entity, ITEMS_PER_PAGE, currentPage, filters, debouncedSearch, isActive ); useEffect(() => { setRefetchFn(() => refetch); }, [setRefetchFn, refetch]); useEffect(() => { setIsRefetching(isFetching); }, [isFetching, setIsRefetching]); const { setManageDoc, setViewDoc } = useDocumentContext(); const { mutate: ActiveInActive, isPending } = useActiveInActiveDocument(); const paginate = (page) => { if (page >= 1 && page <= (data?.totalPages ?? 1)) { setCurrentPage(page); } }; const noData = !isLoading && !isError && data?.data.length === 0; const isSearchEmpty = noData && !!debouncedSearch; const isFilterEmpty = noData && !!filters && Object.keys(filters).length > 0; const isInitialEmpty = noData && !debouncedSearch && !isFilterEmpty; if (isLoading || isFetching) return ; if (isError) return
Error: {error?.message || "Something went wrong"}
; if (isInitialEmpty) return
No documents found yet.
; if (isSearchEmpty) return
No results found for "{debouncedSearch}"
; if (isFilterEmpty) return
No documents match your filter.
; const handleDelete = () => { ActiveInActive( { documentId: deletingId, isActive: !isActive }, { onSettled: () => { setDeletingId(null); setIsDeleteModalOpen(false); }, } ); }; const handleRestore = (docId) => { setRestoringIds((prev) => [...prev, docId]); ActiveInActive( { documentId: docId, isActive: true }, { onSettled: () => { setRestoringIds((prev) => prev.filter((id) => id !== docId)); refetch(); }, } ); }; const DocumentColumns = [ { key: "name", label: "Name", getValue: (e) => e.name || "N/A", align: "text-start", }, { key: "documentType", label: "Document Type", getValue: (e) => e.documentType?.name || "N/A", align: "text-start", }, { key: "uploadedBy", label: "Uploaded By", align: "text-start", customRender: (e) => (
{`${e.uploadedBy?.firstName ?? ""} ${e.uploadedBy?.lastName ?? "" }`.trim() || "N/A"}
), getValue: (e) => `${e.uploadedBy?.firstName ?? ""} ${e.uploadedBy?.lastName ?? "" }`.trim() || "N/A", }, { key: "uploadedAt", label: "Uploaded on", getValue: (e) => formatUTCToLocalTime(e.uploadedAt), align: "text-center", isAlwaysVisible: true, }, { key: "Status", label: "Status", getValue: (e) => getDocuementsStatus(e.isVerified), align: "text-center", isAlwaysVisible: true, }, ]; return ( <> {IsDeleteModalOpen && ( setIsDeleteModalOpen(false)} loading={!!isPending} paramData={deletingId} /> )}
{DocumentColumns.map((col) => ( ))} {data?.data?.map((doc) => { const isRestoring = restoringIds.includes(doc.id); return ( {DocumentColumns.map((col) => ( ))} ); })}
{col.label} Action
{col.customRender ? col.customRender(doc) : col.getValue(doc)} {doc.isActive ? (
setViewDoc({ document: doc.id, isOpen: true }) } > {(isSelf || canModifyDocument) && ( setManageDoc({ document: doc.id, isOpen: true }) } > )} {(isSelf || canDeleteDocument) && ( { setIsDeleteModalOpen(true); setDeletingId(doc.id); }} > )}
) : isRestoring ? (
Loading...
) : ( handleRestore(doc.id)} > )}
); }; export default DocumentsList;