'use client'; import { AreaChart, Area, XAxis, YAxis, Tooltip, ResponsiveContainer } from 'recharts'; interface Snapshot { date: string; totalValueCny: string; totalCostCny: string; } interface NetWorthChartProps { snapshots: Snapshot[]; } function CustomTooltip({ active, payload, label }: { active?: boolean; payload?: Array<{ name: string; value: string; payload: Snapshot }>; label?: string }) { if (active && payload && payload.length) { const data = payload[0].payload; const totalValue = parseFloat(data.totalValueCny); const totalCost = parseFloat(data.totalCostCny); const pnl = totalValue - totalCost; const pnlPercent = totalCost > 0 ? (pnl / totalCost) * 100 : 0; const isPositive = pnl >= 0; const formattedDate = (label || '').replace(/-/g, '/'); return (
{formattedDate}
总市值 ¥{totalValue.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
投入本金 ¥{totalCost.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
净盈亏 {isPositive ? '+' : ''}¥{pnl.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} {' '}({isPositive ? '+' : ''}{pnlPercent.toFixed(2)}%)
); } return null; } export default function NetWorthChart({ snapshots }: NetWorthChartProps) { if (!snapshots || snapshots.length === 0) { return (
暂无历史数据
); } const chartData = snapshots.map(s => ({ date: s.date.replace(/-/g, '/'), totalValueCny: parseFloat(s.totalValueCny), totalCostCny: parseFloat(s.totalCostCny), })); return (
{ if (value >= 1000000) return `¥${(value / 1000000).toFixed(1)}M`; if (value >= 1000) return `¥${(value / 1000).toFixed(0)}K`; return `¥${value.toFixed(0)}`; }} /> } />
); }