gc-wing/apps/web/src/widgets/topbar/Topbar.tsx
2026-02-15 11:22:38 +09:00

53 lines
1.8 KiB
TypeScript

type Props = {
total: number;
fishing: number;
transit: number;
pairLinks: number;
alarms: number;
pollingStatus: "idle" | "loading" | "ready" | "error";
lastFetchMinutes: number | null;
clock: string;
adminMode?: boolean;
onLogoClick?: () => void;
};
export function Topbar({ total, fishing, transit, pairLinks, alarms, pollingStatus, lastFetchMinutes, clock, adminMode, onLogoClick }: Props) {
const statusColor =
pollingStatus === "ready" ? "#22C55E" : pollingStatus === "loading" ? "#F59E0B" : pollingStatus === "error" ? "#EF4444" : "var(--muted)";
return (
<div className="topbar">
<div className="logo" onClick={onLogoClick} style={{ cursor: onLogoClick ? "pointer" : undefined }} title={adminMode ? "ADMIN" : undefined}>
🛰 <span>WING</span> · {adminMode ? <span style={{ fontSize: 10, color: "#F59E0B" }}>(ADMIN)</span> : null}
</div>
<div className="stats">
<div className="stat">
DATA <b style={{ color: "#22C55E" }}>API</b>
</div>
<div className="stat">
POLL{" "}
<b style={{ color: statusColor }}>
{pollingStatus.toUpperCase()}
{lastFetchMinutes ? `(${lastFetchMinutes}m)` : ""}
</b>
</div>
<div className="stat">
<b>{total}</b>
</div>
<div className="stat">
<b style={{ color: "#22C55E" }}>{fishing}</b>
</div>
<div className="stat">
<b style={{ color: "#3B82F6" }}>{transit}</b>
</div>
<div className="stat">
<b style={{ color: "#F59E0B" }}>{pairLinks}</b>
</div>
<div className="stat">
<b style={{ color: "#EF4444" }}>{alarms}</b>
</div>
</div>
<div className="time">{clock}</div>
</div>
);
}