'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)}`;
}}
/>
} />
);
}