import React, { useState } from "react"; import { useDeleteExpense, useExpenseList } from "../../hooks/useExpense"; import Avatar from "../common/Avatar"; import { useExpenseContext } from "../../pages/Expense/ExpensePage"; import { formatDate, formatUTCToLocalTime } from "../../utils/dateUtils"; import Pagination from "../common/Pagination"; import { ITEMS_PER_PAGE } from "../../utils/constants"; import { AppColorconfig, getColorNameFromHex } from "../../utils/appUtils"; import { ExpenseTableSkeleton } from "./ExpenseSkeleton"; import ConfirmModal from "../common/ConfirmModal"; import { useProfile } from "../../hooks/useProfile"; const ExpenseList = ({filters}) => { const [deletingId, setDeletingId] = useState(null); const [IsDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const { setViewExpense, setManageExpenseModal } = useExpenseContext(); const [currentPage, setCurrentPage] = useState(1); const pageSize = 10; const { profile } = useProfile(); const { mutate: DeleteExpense, isPending } = useDeleteExpense(); const { data, isLoading, isError, isInitialLoading, error, isFetching } = useExpenseList(10, currentPage, filters); const handleDelete = (id) => { setDeletingId(id); DeleteExpense( { id }, { onSettled: () => { setDeletingId(null); setIsDeleteModalOpen(false); }, } ); }; if (isInitialLoading) return ; if (isError) return
{error}
; const items = data?.data ?? []; const totalPages = data?.totalPages ?? 1; const hasMore = currentPage < totalPages; const paginate = (page) => { if (page >= 1 && page <= totalPages) { setCurrentPage(page); } }; const STATUS_ORDER = [ "Draft", "Review Pending", "Approval Pending", "Process Pending", "Processed", "Paid", "Rejected", ]; const groupExpensesByDateAndStatus = (expenses) => { const grouped = {}; expenses.forEach((expense) => { const dateKey = expense.transactionDate.split("T")[0]; if (!grouped[dateKey]) grouped[dateKey] = []; grouped[dateKey].push(expense); }); const sortedDates = Object.keys(grouped).sort( (a, b) => new Date(b) - new Date(a) ); return sortedDates.map((date) => ({ date, expenses: grouped[date].sort((a, b) => { return ( STATUS_ORDER.indexOf(a.status.name) - STATUS_ORDER.indexOf(b.status.name) ); }), })); }; return ( <> {IsDeleteModalOpen && (
setIsDeleteModalOpen(false)} loading={isPending} paramData={deletingId} />
)}
{/* */} {!isInitialLoading && groupExpensesByDateAndStatus(items).map( ({ date, expenses }) => ( <> {expenses.map((expense) => ( ))} ) )} {!isInitialLoading && items.length === 0 && }
Date Time
Expense Type
Payment Mode
Paid By
Amount Status Action
{formatUTCToLocalTime(date)}
{expense.expensesType?.name || "N/A"} {expense.paymentMode?.name || "N/A"}
{`${expense.paidBy?.firstName ?? ""} ${ expense.paidBy?.lastName ?? "" }`.trim() || "N/A"}
{expense?.amount} {expense.status?.displayName || "Unknown"}
setViewExpense({ expenseId: expense.id, view: true, }) } > {(expense.status.name === "Draft" || expense.status.name === "Rejected") && expense.createdBy.id === profile?.employeeInfo.id ? ( setManageExpenseModal({ IsOpen: true, expenseId: expense.id, }) } > ) : ( )} {expense.status.name === "Draft" ? ( { setIsDeleteModalOpen(true); setDeletingId(expense.id); }} > ) : ( )}
No Expnese Found
{!isInitialLoading && items.length > 0 && ( )}
); }; export default ExpenseList;