import { useEffect, useMemo, useState, useRef } from 'react' import { VChart } from '@visactor/react-vchart' import { PieChart as PieChartIcon } from 'lucide-react' import { useTranslation } from 'react-i18next' import type { TimeGranularity } from '@/lib/time' import { VCHART_OPTION } from '@/lib/vchart' import { useTheme } from '@/context/theme-provider' import { DEFAULT_TIME_GRANULARITY } from '@/features/dashboard/constants' import { processChartData } from '@/features/dashboard/lib' import type { QuotaDataItem } from '@/features/dashboard/types' let themeManagerPromise: Promise< (typeof import('@visactor/vchart'))['ThemeManager'] > | null = null type ChartTab = 'trend' | 'proportion' | 'top' type ChartSpecKey = 'spec_model_line' | 'spec_pie' | 'spec_rank_bar' const CHART_TABS: { value: ChartTab labelKey: string specKey: ChartSpecKey }[] = [ { value: 'trend', labelKey: 'Call Trend', specKey: 'spec_model_line' }, { value: 'proportion', labelKey: 'Call Count Distribution', specKey: 'spec_pie', }, { value: 'top', labelKey: 'Call Count Ranking', specKey: 'spec_rank_bar' }, ] interface ModelChartsProps { data: QuotaDataItem[] loading?: boolean timeGranularity?: TimeGranularity } export function ModelCharts(props: ModelChartsProps) { const { t } = useTranslation() const { resolvedTheme } = useTheme() const [activeTab, setActiveTab] = useState('trend') const [themeReady, setThemeReady] = useState(false) const themeManagerRef = useRef< (typeof import('@visactor/vchart'))['ThemeManager'] | null >(null) const timeGranularity = props.timeGranularity ?? DEFAULT_TIME_GRANULARITY useEffect(() => { const updateTheme = async () => { setThemeReady(false) if (!themeManagerPromise) { themeManagerPromise = import('@visactor/vchart').then( (m) => m.ThemeManager ) } const ThemeManager = await themeManagerPromise themeManagerRef.current = ThemeManager ThemeManager.setCurrentTheme(resolvedTheme === 'dark' ? 'dark' : 'light') setThemeReady(true) } updateTheme() }, [resolvedTheme]) const chartData = useMemo( () => processChartData(props.loading ? [] : props.data, timeGranularity, t), [props.data, props.loading, timeGranularity, t] ) const activeSpec = CHART_TABS.find((tab) => tab.value === activeTab) const spec = activeSpec ? chartData[activeSpec.specKey] : null return (
{t('Model Call Analytics')}
{t('Total:')} {chartData.totalCountDisplay}
{CHART_TABS.map((tab) => ( ))}
{themeReady && spec && ( )}
) }