import { useEffect, useState } from 'react'; import { BarChart, Bar, XAxis, YAxis, ResponsiveContainer, Cell, PieChart, Pie, Tooltip, LabelList } from 'recharts'; import { fetchHydrogenOverview, type HydrogenOverviewResponse } from './api'; import RotatingFooterHint from '../../components/RotatingFooterHint'; interface YAxisTickProps { x?: number; y?: number; index?: number; payload?: { value: string }; } function RankYAxisTick({ x = 0, y = 0, index = 0, payload }: YAxisTickProps) { return ( {index + 1} {payload?.value} ); } const REGION_COLORS = [ '#3b82f6', '#22d3ee', '#a855f7', '#f59e0b', '#10b981', '#ef4444', '#6366f1', '#14b8a6', '#94a3b8', ]; export default function HydrogenOverview() { const [data, setData] = useState(null); const [error, setError] = useState(null); useEffect(() => { let cancelled = false; fetchHydrogenOverview() .then(d => { if (!cancelled) setData(d); }) .catch(e => { if (!cancelled) setError(e instanceof Error ? e.message : String(e)); }); return () => { cancelled = true; }; }, []); if (error) { return
加载失败:{error}
; } if (!data) { return ; } const k = data.kpi; const top5 = data.top5; const regions = data.regions; return (
数据自 2025-01-01 起,每 1 分钟更新
{/* Top5 加氢站 */}
加氢站加注量 Top5 单位 Kg
} tickLine={false} axisLine={false} /> `${Number(v ?? 0).toLocaleString('zh-CN')} Kg`} contentStyle={{ borderRadius: 12, fontSize: 12 }} /> {top5.map((_, i) => ( ))} `${Number(v ?? 0).toLocaleString('zh-CN', { maximumFractionDigits: 0 })}`} fill="#475569" fontSize={11} fontWeight={700} />
{/* 区域占比环 */}
各区域加氢占比
{regions.map((_, i) => ( ))} `${(Number(v ?? 0) / 1000).toFixed(2)}T`} contentStyle={{ borderRadius: 12, fontSize: 12 }} />
年合计
{(k.yearKg / 1000).toFixed(2)}T
{regions.map((r, i) => (
{r.region} {(r.share * 100).toFixed(1)}%
))}
); } function HydrogenOverviewSkeleton() { return (
{/* 顶部说明条 */}
{/* Top5 占位 */}
{[100, 78, 56, 40, 28].map((w, i) => (
))}
{/* 区域占比环 占位 */}
{Array.from({ length: 5 }).map((_, i) => (
))}
正在加载氢能总览…
); }