| import { PieChart, Pie, Cell, ResponsiveContainer } from 'recharts'; | |
| import { cn } from "@/lib/utils"; | |
| interface SpendingCategory { | |
| name: string; | |
| value: number; | |
| color: string; | |
| } | |
| interface SpendingAnalyticsProps { | |
| data: SpendingCategory[]; | |
| currency?: string; | |
| } | |
| const SpendingAnalytics = ({ | |
| data, | |
| currency = "$" | |
| }: SpendingAnalyticsProps) => { | |
| const totalSpending = data.reduce((sum, item) => sum + item.value, 0); | |
| const formatCurrency = (amount: number) => { | |
| return new Intl.NumberFormat('en-US', { | |
| style: 'currency', | |
| currency: 'USD', | |
| currencyDisplay: 'symbol', | |
| }).format(amount).replace('$', ''); | |
| }; | |
| return ( | |
| <div className="animate-slide-up py-2"> | |
| <h2 className="text-lg font-medium mb-4">Spending by Category</h2> | |
| <div className="flex"> | |
| <div className="w-1/2 h-48"> | |
| <ResponsiveContainer width="100%" height="100%"> | |
| <PieChart> | |
| <Pie | |
| data={data} | |
| cx="50%" | |
| cy="50%" | |
| innerRadius={48} | |
| outerRadius={68} | |
| paddingAngle={2} | |
| dataKey="value" | |
| stroke="none" | |
| > | |
| {data.map((entry, index) => ( | |
| <Cell key={`cell-${index}`} fill={entry.color} /> | |
| ))} | |
| </Pie> | |
| </PieChart> | |
| </ResponsiveContainer> | |
| </div> | |
| <div className="w-1/2 space-y-2 my-auto"> | |
| {data.map((category, index) => ( | |
| <div key={index} className="flex items-center justify-between"> | |
| <div className="flex items-center space-x-2"> | |
| <div | |
| className="w-3 h-3 rounded-full" | |
| style={{ backgroundColor: category.color }} | |
| /> | |
| <span className="text-sm">{category.name}</span> | |
| </div> | |
| <div className="flex flex-col items-end"> | |
| <span className="text-sm font-medium"> | |
| {currency}{formatCurrency(category.value)} | |
| </span> | |
| <span className="text-xs text-muted-foreground"> | |
| {Math.round((category.value / totalSpending) * 100)}% | |
| </span> | |
| </div> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default SpendingAnalytics; | |