import React, { Suspense } from 'react'; import { Box, Typography, Tooltip as MuiTooltip, } from '@mui/material'; import { motion } from 'framer-motion'; import { LazyBarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip as RechartsTooltip, ResponsiveContainer, Cell, ChartLoadingFallback } from '../../utils/lazyRecharts'; // Types import { ProviderBreakdown } from '../../types/billing'; // Utils import { formatCurrency, getProviderColor, getProviderIcon } from '../../services/billingService'; interface ProviderCostComparisonProps { providerBreakdown: ProviderBreakdown; terminalTheme?: boolean; terminalColors?: any; } /** * ProviderCostComparison - Horizontal bar chart comparing costs across providers * * Usage: * */ const ProviderCostComparison: React.FC = ({ providerBreakdown, terminalTheme = false, terminalColors }) => { // Transform data for chart const chartData = Object.entries(providerBreakdown) .filter(([_, data]) => data && (data.cost ?? 0) > 0) .map(([provider, data]) => ({ name: provider.charAt(0).toUpperCase() + provider.slice(1), cost: data?.cost ?? 0, calls: data?.calls ?? 0, tokens: data?.tokens ?? 0, color: getProviderColor(provider), icon: getProviderIcon(provider) })) .sort((a, b) => b.cost - a.cost) .slice(0, 5); // Top 5 providers if (chartData.length === 0) { return null; } // Custom tooltip const CustomTooltip = ({ active, payload }: any) => { if (active && payload && payload.length) { const data = payload[0].payload; return ( {data.icon} {data.name} Cost: {formatCurrency(data.cost)} Calls: {data.calls.toLocaleString()} Tokens: {data.tokens.toLocaleString()} ); } return null; }; return ( Provider Cost Comparison }> formatCurrency(value)} /> } /> {chartData.map((entry, index) => ( ))} ); }; export default ProviderCostComparison;