"use client"; import { useEffect, useState } from "react"; import { Card } from "@heroui/react"; import { Thunderbolt, PlugConnection, CreditCard, ChartColumn, TagDollar } from "@gravity-ui/icons"; import { useSession } from "@/lib/auth-client"; import { api, type Stats, type UserStats } from "@/lib/api"; type CardColor = "accent" | "success" | "warning" | "default"; const colorStyles: Record = { accent: { border: "border-accent", bg: "bg-accent/10", icon: "text-accent" }, success: { border: "border-success", bg: "bg-success/10", icon: "text-success" }, warning: { border: "border-warning", bg: "bg-warning/10", icon: "text-warning" }, default: { border: "border-border", bg: "bg-default", icon: "text-muted" }, }; function StatusDot({ color }: { color: "success" | "warning" | "muted" }) { const cls = color === "success" ? "bg-success" : color === "warning" ? "bg-warning" : "bg-muted/40"; return ; } function StatCard({ title, value, footer, icon: Icon, color = "default", }: { title: string; value: string | number; footer?: React.ReactNode; icon?: React.ComponentType<{ className?: string }>; color?: CardColor; }) { const s = colorStyles[color]; return (

{title}

{Icon && (
)}

{value}

{footer && (
{footer}
)}
); } export default function DashboardPage() { const { data: sessionData, isPending } = useSession(); const isAdmin = sessionData?.user?.role === "admin"; const [adminStats, setAdminStats] = useState(null); const [userStats, setUserStats] = useState(null); useEffect(() => { if (isPending) return; api.stats .get() .then((data) => { if ("todayEnergyWh" in data) { setAdminStats(data); return; } setUserStats(data); }) .catch(() => {}); }, [isPending, isAdmin]); if (isPending) { return (

概览

加载中…

); } if (isAdmin) { const stats = adminStats; const todayKwh = stats ? (stats.todayEnergyWh / 1000).toFixed(1) : "—"; const offlineCount = (stats?.totalChargePoints ?? 0) - (stats?.onlineChargePoints ?? 0); return (

概览

实时运营状态

{stats?.onlineChargePoints ?? 0} 在线 · {offlineCount} 离线 } /> 最近 2 分钟有心跳} /> {stats?.activeTransactions ? "活跃中" : "当前空闲"} } /> 已注册卡片总量} /> 当日 00:00 起累计} />
); } // User view const stats = userStats; const totalYuan = stats ? (stats.totalBalance / 100).toFixed(2) : "—"; return (

概览

{sessionData?.user?.name ?? sessionData?.user?.email} 的账户概览

已绑定的储值卡数量} /> 所有储值卡余额合计} /> {stats?.activeTransactions ? "充电中" : "当前空闲"} } /> 历史总交易笔数} />
); }