import { useState, useCallback } from 'react' import { useNavigate } from '@tanstack/react-router' import { flexRender, getCoreRowModel, getPaginationRowModel, useReactTable, type PaginationState, } from '@tanstack/react-table' import { useTranslation } from 'react-i18next' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { TableSkeleton, TableEmpty } from '@/components/data-table' import { DataTablePagination } from '@/components/data-table/pagination' import { DEFAULT_PRICING_PAGE_SIZE, DEFAULT_TOKEN_UNIT } from '../constants' import type { PricingModel, TokenUnit } from '../types' import { usePricingColumns } from './pricing-columns' export interface PricingTableProps { models: PricingModel[] isLoading?: boolean priceRate?: number usdExchangeRate?: number tokenUnit?: TokenUnit showRechargePrice?: boolean } export function PricingTable(props: PricingTableProps) { const { t } = useTranslation() const navigate = useNavigate({ from: '/pricing/' }) const { models, isLoading = false, priceRate = 1, usdExchangeRate = 1, tokenUnit = DEFAULT_TOKEN_UNIT, showRechargePrice = false, } = props const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: DEFAULT_PRICING_PAGE_SIZE, }) const columns = usePricingColumns({ tokenUnit, priceRate, usdExchangeRate, showRechargePrice, }) const table = useReactTable({ data: models, columns, pageCount: Math.ceil(models.length / pagination.pageSize), state: { pagination }, onPaginationChange: setPagination, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), manualPagination: false, }) const handleRowClick = useCallback( (model: PricingModel) => { navigate({ to: '/pricing/$modelId', params: { modelId: model.model_name }, search: (prev) => prev, }) }, [navigate] ) return (
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )} ))} ))} {isLoading ? ( ) : table.getRowModel().rows.length === 0 ? ( ) : ( table.getRowModel().rows.map((row) => ( handleRowClick(row.original)} className='hover:bg-muted/30 cursor-pointer transition-colors' > {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext() )} ))} )) )}
{!isLoading && models.length > 0 && }
) }