/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { useState, useCallback } from 'react' 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 onModelClick?: (modelName: string) => void } export function PricingTable(props: PricingTableProps) { const { t } = useTranslation() const { models, isLoading = false, priceRate = 1, usdExchangeRate = 1, tokenUnit = DEFAULT_TOKEN_UNIT, showRechargePrice = false, onModelClick, } = 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) => { onModelClick?.(model.model_name) }, [onModelClick] ) 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 && }
) }