72 lines
2.9 KiB
TypeScript
72 lines
2.9 KiB
TypeScript
"use client";
|
|
|
|
import { Bar, BarChart, Cell, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts";
|
|
import type { SynopStation } from "@/types/imgw";
|
|
import { Card } from "@/components/ui/card";
|
|
import { useI18n } from "@/lib/i18n";
|
|
import { useWeatherStore } from "@/lib/store";
|
|
import { convertWindSpeed, getWindSpeedUnitLabel } from "@/lib/weather-utils";
|
|
|
|
const INITIAL_CHART_DIMENSION = { width: 1, height: 1 };
|
|
const SNAPSHOT_COLORS = ["hsl(var(--chart-temperature))", "hsl(var(--chart-feels-like))", "hsl(var(--chart-rainfall))"];
|
|
|
|
export function SnapshotChart({ station }: { station: SynopStation }) {
|
|
const { t } = useI18n();
|
|
const windSpeedUnit = useWeatherStore((state) => state.windSpeedUnit);
|
|
const windDigits = windSpeedUnit === "ms" ? 1 : 0;
|
|
const windSpeed =
|
|
station.windSpeed === null ? null : Number(convertWindSpeed(station.windSpeed, windSpeedUnit).toFixed(windDigits));
|
|
const windMax = windSpeedUnit === "ms" ? 20 : windSpeedUnit === "kmh" ? 72 : 45;
|
|
const rows = [
|
|
{ name: t("weather.humidity"), value: station.humidity, unit: "%", max: 100, color: SNAPSHOT_COLORS[0] },
|
|
{
|
|
name: t("weather.wind"),
|
|
value: windSpeed,
|
|
unit: getWindSpeedUnitLabel(windSpeedUnit),
|
|
max: windMax,
|
|
color: SNAPSHOT_COLORS[1],
|
|
},
|
|
{ name: t("weather.rainfall"), value: station.rainfall, unit: "mm", max: 30, color: SNAPSHOT_COLORS[2] },
|
|
]
|
|
.filter((row) => row.value !== null)
|
|
.map((row) => ({ ...row, normalized: Math.min(100, ((row.value ?? 0) / row.max) * 100) }));
|
|
|
|
return (
|
|
<Card className="p-5">
|
|
<p className="section-kicker">{t("snapshot.label")}</p>
|
|
<h2 className="mt-2 text-xl font-semibold tracking-tight">{t("snapshot.title")}</h2>
|
|
<p className="mt-1 text-sm leading-6 text-muted">{t("snapshot.description")}</p>
|
|
<div className="mt-5 h-52 min-w-0">
|
|
<ResponsiveContainer
|
|
width="100%"
|
|
height="100%"
|
|
minWidth={0}
|
|
minHeight={0}
|
|
initialDimension={INITIAL_CHART_DIMENSION}
|
|
>
|
|
<BarChart data={rows} layout="vertical" margin={{ left: 0, right: 16 }}>
|
|
<XAxis type="number" hide domain={[0, 100]} />
|
|
<YAxis
|
|
type="category"
|
|
dataKey="name"
|
|
width={86}
|
|
axisLine={false}
|
|
tickLine={false}
|
|
tick={{ fill: "currentColor", fontSize: 12 }}
|
|
/>
|
|
<Tooltip
|
|
cursor={{ fill: "hsl(var(--border) / 0.22)" }}
|
|
formatter={(_, __, item) => [`${item.payload.value} ${item.payload.unit}`, item.payload.name]}
|
|
/>
|
|
<Bar dataKey="normalized" radius={[0, 8, 8, 0]} barSize={14}>
|
|
{rows.map((row) => (
|
|
<Cell fill={row.color} key={row.name} />
|
|
))}
|
|
</Bar>
|
|
</BarChart>
|
|
</ResponsiveContainer>
|
|
</div>
|
|
</Card>
|
|
);
|
|
}
|