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;