import { useState } from 'react'; import { ColumnFiltersState, RowData, SortingState, VisibilityState, flexRender, getCoreRowModel, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table'; import { motion, AnimatePresence } from 'framer-motion'; import { useTranslation } from 'react-i18next'; import { useAnimatedList } from '@/hooks/useAnimatedList'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { TableSkeleton } from '@/components/ui/table-skeleton'; import { ServerSidePagination } from '@/components/server-side-pagination'; import type { DateTimeRangeValue } from '@/utils/date-range'; import { Thread, ThreadConnection } from '../data/schema'; import { ThreadsTableToolbar } from './data-table-toolbar'; import { useThreadsColumns } from './threads-columns'; const MotionTableRow = motion(TableRow); declare module '@tanstack/react-table' { // eslint-disable-next-line @typescript-eslint/no-unused-vars interface ColumnMeta { className: string; } } interface ThreadsTableProps { data: Thread[]; loading?: boolean; pageInfo?: ThreadConnection['pageInfo']; pageSize: number; totalCount?: number; dateRange?: DateTimeRangeValue; threadIdFilter: string; onNextPage: () => void; onPreviousPage: () => void; onPageSizeChange: (pageSize: number) => void; onDateRangeChange: (range: DateTimeRangeValue | undefined) => void; onThreadIdFilterChange: (threadId: string) => void; onRefresh: () => void; showRefresh: boolean; autoRefresh?: boolean; onAutoRefreshChange?: (enabled: boolean) => void; } export function ThreadsTable({ data, loading, pageInfo, totalCount, pageSize, dateRange, threadIdFilter, onNextPage, onPreviousPage, onPageSizeChange, onDateRangeChange, onThreadIdFilterChange, onRefresh, showRefresh, autoRefresh = false, onAutoRefreshChange, }: ThreadsTableProps) { const { t } = useTranslation(); const threadsColumns = useThreadsColumns(); const [sorting, setSorting] = useState([]); const [columnFilters, setColumnFilters] = useState([]); const [columnVisibility, setColumnVisibility] = useState({}); const [rowSelection, setRowSelection] = useState({}); const displayedData = useAnimatedList(data, autoRefresh); const table = useReactTable({ data: displayedData, getRowId: (row) => row.id, columns: threadsColumns, state: { sorting, columnFilters, columnVisibility, rowSelection, }, enableRowSelection: true, onRowSelectionChange: setRowSelection, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, onColumnVisibilityChange: setColumnVisibility, getCoreRowModel: getCoreRowModel(), getFilteredRowModel: getFilteredRowModel(), getSortedRowModel: getSortedRowModel(), getFacetedRowModel: getFacetedRowModel(), getFacetedUniqueValues: getFacetedUniqueValues(), manualPagination: true, manualFiltering: true, }); return (
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} ))} ))} {loading ? ( ) : table.getRowModel().rows?.length ? ( {table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} ))} ) : ( {t('common.noData')} )}
); }