"use client"; import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { AdminListPaginationFooter } from "@/components/admin/admin-list-pagination-footer"; import { AdminTableNoResourceRow } from "@/components/admin/admin-no-resource-state"; import { AdminStatusBadge } from "@/components/admin/admin-status-badge"; import { AdminLoadingState, AdminTableLoadingRow } from "@/components/admin/admin-loading-state"; import { Button } from "@/components/ui/button"; import { Table, TableBody, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter"; import { ReconcileItemRow } from "@/modules/reconcile/reconcile-item-row"; import { getJobSummaryValue, isOpenReconcileItem, jobStatusLabel, renderPeriodRange, } from "@/modules/reconcile/reconcile-labels"; import type { AdminReconcileItemsData, AdminReconcileJobRow, } from "@/types/api/admin-reconcile"; export type ReconcileItemsFilter = "open" | "all"; type ReconcileJobDetailPanelProps = { job: AdminReconcileJobRow; items: AdminReconcileItemsData | null; itemsLoading: boolean; itemsFilter: ReconcileItemsFilter; onItemsFilterChange: (filter: ReconcileItemsFilter) => void; canWriteWallet: boolean; actionBusy: boolean; onCompleteCredit: (transferNo: string) => void; onReverse: (transferNo: string) => void; onManualProcess: (transferNo: string) => void; onItemsPageChange: (page: number) => void; onItemsPerPageChange: (perPage: number) => void; }; export function ReconcileJobDetailPanel({ job, items, itemsLoading, itemsFilter, onItemsFilterChange, canWriteWallet, actionBusy, onCompleteCredit, onReverse, onManualProcess, onItemsPageChange, onItemsPerPageChange, }: ReconcileJobDetailPanelProps): React.ReactElement { const { t } = useTranslation("reconcile"); const formatTs = useAdminDateTimeFormatter(); const mismatchCount = getJobSummaryValue(job.summary_json, "mismatch_count"); const itemCount = getJobSummaryValue(job.summary_json, "item_count"); const displayedItems = useMemo(() => { if (!items) { return []; } if (itemsFilter === "all") { return items.items; } return items.items.filter(isOpenReconcileItem); }, [items, itemsFilter]); return (
{job.job_no}
{t("filterCount", { shown: displayedItems.length, total: items.meta.total, })}
) : null}