"use client"; import { Bar, CartesianGrid, ComposedChart, Line, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts"; import { Card } from "@/components/ui/card"; import { ChartTooltip } from "@/components/charts/chart-tooltip"; import { CHART_COLORS } from "@/lib/chart-theme"; import { useI18n } from "@/lib/i18n"; import { formatForecastTemperature } from "@/lib/forecast-utils"; import { useWeatherStore } from "@/lib/store"; import { convertPrecipitation, convertTemperature, formatTemperatureValue, getPrecipitationUnitLabel, getTemperatureUnitLabel, } from "@/lib/weather-utils"; import type { HourlyForecast } from "@/types/forecast"; const INITIAL_CHART_DIMENSION = { width: 1, height: 1 }; interface ChartLegendItem { color: string; label: string; marker: "bar" | "line" | "dashed-line"; } function formatHour(value: string) { return value.slice(11, 16); } function formatChartPrecipitation(value: number | null, language: "pl" | "en", unit: string) { if (value === null) return "—"; const formattedValue = new Intl.NumberFormat(language === "pl" ? "pl-PL" : "en-GB", { minimumFractionDigits: unit === "in" ? 2 : 0, maximumFractionDigits: unit === "mm" ? (value < 1 ? 2 : 1) : 2, }).format(value); return `${formattedValue} ${unit}`; } function ChartLegend({ items }: { items: ChartLegendItem[] }) { return (
{items.map((item) => ( {item.marker === "bar" ? (
); } export function DayForecastCharts({ hours }: { hours: HourlyForecast[] }) { const { language, t } = useI18n(); const temperatureUnit = useWeatherStore((state) => state.temperatureUnit); const precipitationUnit = useWeatherStore((state) => state.precipitationUnit); const rows = hours.map((hour) => ({ time: formatHour(hour.time), temperature: hour.temperature === null ? null : convertTemperature(hour.temperature, temperatureUnit), feelsLike: hour.feelsLike === null ? null : convertTemperature(hour.feelsLike, temperatureUnit), precipitation: hour.precipitation === null ? null : convertPrecipitation(hour.precipitation, precipitationUnit), precipitationProbability: hour.precipitationProbability, })); const temperatureUnitLabel = getTemperatureUnitLabel(temperatureUnit); const precipitationUnitLabel = getPrecipitationUnitLabel(precipitationUnit); const temperatureLegendItems: ChartLegendItem[] = [ { color: CHART_COLORS.temperature, label: t("forecast.temperature"), marker: "line" }, { color: CHART_COLORS.feelsLike, label: t("forecast.apparentTemperature"), marker: "dashed-line" }, ]; const rainfallLegendItems: ChartLegendItem[] = [ { color: CHART_COLORS.rainfall, label: t("forecast.precipitation"), marker: "bar" }, { color: CHART_COLORS.probability, label: t("forecast.precipitationProbability"), marker: "line" }, ]; return (

{t("forecast.temperatureChart")}

{t("forecast.temperatureChartDescription")}

typeof entry.value === "number" ? formatTemperatureValue(entry.value, language, temperatureUnit) : formatForecastTemperature(null, language, temperatureUnit) } /> } />

{t("forecast.rainfallChart")}

{t("forecast.rainfallChartDescription")}

entry.dataKey === "precipitation" ? formatChartPrecipitation( typeof entry.value === "number" ? entry.value : null, language, precipitationUnitLabel, ) : `${typeof entry.value === "number" ? entry.value : "—"}%` } /> } />
); }