import { type FC, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { Add, Edit, Lock1 } from "iconsax-react"; import Table from "@/components/Table"; import Filters from "@/components/Filters"; import Button from "@/components/Button"; import type { RowDataType } from "@/components/types/TableTypes"; import { useGetCashShifts, useGetCurrentCashShift, useGetCurrentCashShiftSummary, } from "./hooks/useCashShiftData"; import { useCashShiftFilters } from "./hooks/useCashShiftFilters"; import { getCashShiftTableColumns } from "./components/CashShiftTableColumns"; import { useCashShiftFiltersFields } from "./components/CashShiftFiltersFields"; import CashShiftSummaryCard from "./components/CashShiftSummaryCard"; import OpenCashShiftModal from "./components/OpenCashShiftModal"; import CloseCashShiftModal from "./components/CloseCashShiftModal"; import EditCashShiftModal from "./components/EditCashShiftModal"; import CashShiftDetailModal from "./components/CashShiftDetailModal"; import type { CashShift } from "./types/Types"; import { CashShiftStatus } from "./enum/Enum"; import { formatOptionalDate } from "@/helpers/func"; import Status from "@/components/Status"; import MoonLoader from "react-spinners/MoonLoader"; const CashShiftsList: FC = () => { const { t } = useTranslation("global"); const [isOpenModalVisible, setIsOpenModalVisible] = useState(false); const [isCloseModalVisible, setIsCloseModalVisible] = useState(false); const [isEditModalVisible, setIsEditModalVisible] = useState(false); const [isDetailModalVisible, setIsDetailModalVisible] = useState(false); const [selectedShift, setSelectedShift] = useState(null); const { filters, currentPage, apiParams, handleFiltersChange, handlePageChange, } = useCashShiftFilters(); const { data: shiftsData, isLoading } = useGetCashShifts(apiParams); const { data: currentShiftData, isLoading: isCurrentShiftLoading } = useGetCurrentCashShift(); const currentShift = currentShiftData?.data ?? null; const hasOpenShift = currentShift?.status === CashShiftStatus.OPEN; const { data: currentSummaryData, isLoading: isCurrentSummaryLoading } = useGetCurrentCashShiftSummary(hasOpenShift); const shifts = shiftsData?.data || []; const totalPages = shiftsData?.meta?.totalPages || 1; const columns = useMemo( () => getCashShiftTableColumns({ t, onView: (shift) => { setSelectedShift(shift); setIsDetailModalVisible(true); }, onEdit: (shift) => { setSelectedShift(shift); setIsEditModalVisible(true); }, onClose: (shift) => { setSelectedShift(shift); setIsCloseModalVisible(true); }, }), [t] ); const filterFields = useCashShiftFiltersFields(); const getAdminName = (shift: CashShift) => { const name = [shift.admin?.firstName, shift.admin?.lastName] .filter(Boolean) .join(" "); return name || shift.admin?.phone || "-"; }; return (

{t("cash_shift.list_title")}

{!hasOpenShift && ( )}
{isCurrentShiftLoading ? (
) : ( hasOpenShift && currentShift && (
{t("cash_shift.current_shift")}
{t("cash_shift.operator")}: {getAdminName(currentShift)}
{t("cash_shift.opened_at")}:{" "} {formatOptionalDate(currentShift.openedAt, { year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", })}
) )}
columns={columns} data={shifts as (CashShift & RowDataType)[]} isloading={isLoading} pagination={{ currentPage, totalPages, onPageChange: handlePageChange, }} /> setIsOpenModalVisible(false)} /> { setIsCloseModalVisible(false); setSelectedShift(null); }} shift={selectedShift} /> { setIsEditModalVisible(false); setSelectedShift(null); }} shift={selectedShift} /> { setIsDetailModalVisible(false); setSelectedShift(null); }} shift={selectedShift} />
); }; export default CashShiftsList;