import { useMemo, useState } from 'react' import { useQuery } from '@tanstack/react-query' import { ChevronLeft, ChevronRight } from 'lucide-react' import { useTranslation } from 'react-i18next' import { Button } from '@/components/ui/button' import { getPerfMetricsSummary } from '@/features/performance-metrics/api' import { DEFAULT_PRICING_PAGE_SIZE, DEFAULT_TOKEN_UNIT } from '../constants' import type { PricingModel, TokenUnit } from '../types' import { ModelCard } from './model-card' import type { ModelPerfBadgeData } from './model-perf-badge' export interface ModelCardGridProps { models: PricingModel[] onModelClick: (modelName: string) => void priceRate?: number usdExchangeRate?: number tokenUnit?: TokenUnit showRechargePrice?: boolean } export function ModelCardGrid(props: ModelCardGridProps) { const { t } = useTranslation() const [page, setPage] = useState(1) const pageSize = DEFAULT_PRICING_PAGE_SIZE const tokenUnit = props.tokenUnit ?? DEFAULT_TOKEN_UNIT const totalPages = Math.max(1, Math.ceil(props.models.length / pageSize)) const currentPage = Math.min(page, totalPages) const perfQuery = useQuery({ queryKey: ['perf-metrics-summary', 24], queryFn: () => getPerfMetricsSummary(24), staleTime: 60 * 1000, retry: false, }) const pagedModels = useMemo(() => { const start = (currentPage - 1) * pageSize return props.models.slice(start, start + pageSize) }, [currentPage, pageSize, props.models]) const perfMap = useMemo(() => { const map = new Map() for (const model of perfQuery.data?.data?.models ?? []) { if (model.request_count > 0) { map.set(model.model_name, model) } } return map }, [perfQuery.data]) if (props.models.length === 0) { return null } return (
{pagedModels.map((model) => ( props.onModelClick(model.model_name || '')} /> ))}
{totalPages > 1 && (

{t('Page {{current}} of {{total}}', { current: currentPage, total: totalPages, })}

)}
) }