import type { ReactNode } from "react"; import { Group, Paper, SimpleGrid, Stack, Text, ThemeIcon } from "@mantine/core"; import { IconDroplets, IconGauge, IconSunHigh, IconSunrise, IconSunset, IconTemperature, IconWind, } from "@tabler/icons-react"; import { useCurrentIntlLocale, useScopedI18n } from "@homarr/translation/client"; import type { WidgetProps } from "../definition"; import { AnimatedWeatherIcon } from "./animated-icon"; import classes from "./component.module.css"; import type { DailyWeatherData } from "./format"; import { getPreferredDaylightDuration, getPreferredTime, getPreferredUnit, getPreferredWindSpeed } from "./format"; import { formatWeatherDate, getWeatherKind } from "./icon"; interface DailyWeatherDetailsProps { animateIcons: boolean; day: DailyWeatherData; disableTemperatureDecimals: boolean; isFahrenheit: boolean; dateFormat: WidgetProps<"weather">["options"]["dateFormat"]; showHumidity: boolean; timeZone: string; useImperialSpeed: boolean; } interface DetailMetricProps { icon: ReactNode; label: string; value: ReactNode; } const DetailMetric = ({ icon, label, value }: DetailMetricProps) => ( {icon} {label} {value} ); const SolarMetric = ({ icon, label, value }: DetailMetricProps) => ( {icon} {label} {value} ); export const DailyWeatherDetails = ({ animateIcons, day, dateFormat, disableTemperatureDecimals, isFahrenheit, showHumidity, timeZone, useImperialSpeed, }: DailyWeatherDetailsProps) => { const locale = useCurrentIntlLocale(); const t = useScopedI18n("widget.weather"); const tCommon = useScopedI18n("common"); const speedUnit = useImperialSpeed ? tCommon("unit.speed.milesPerHour") : tCommon("unit.speed.kilometersPerHour"); return ( {formatWeatherDate(day.date, locale, dateFormat)} {t(`kind.${getWeatherKind(day.weatherCode)}`)} {t("advanced.highLow", { maximum: getPreferredUnit(day.maxTemperature, isFahrenheit, disableTemperatureDecimals), minimum: getPreferredUnit(day.minTemperature, isFahrenheit, disableTemperatureDecimals), })} } label={t("advanced.detailLabel.feelsLike")} value={`${getPreferredUnit(day.maxApparentTemperature, isFahrenheit, disableTemperatureDecimals)} / ${getPreferredUnit(day.minApparentTemperature, isFahrenheit, disableTemperatureDecimals)}`} /> } label={t("advanced.detailLabel.precipitation")} value={`${day.precipitationProbability ?? "?"}% ยท ${day.precipitation?.toFixed(1) ?? "?"} mm`} /> {showHumidity && ( } label={t("advanced.detailLabel.humidity")} value={`${day.averageHumidity ?? "?"}%`} /> )} } label={t("advanced.detailLabel.wind")} value={`${getPreferredWindSpeed(day.maxWindSpeed, useImperialSpeed)} / ${getPreferredWindSpeed(day.maxWindGusts, useImperialSpeed)} ${speedUnit}`} /> } label={t("advanced.detailLabel.uv")} value={day.uvIndex?.toFixed(1) ?? "?"} /> } label={t("dailyForecast.sunrise")} value={getPreferredTime(day.sunriseAt, locale, timeZone)} /> } label={t("dailyForecast.sunset")} value={getPreferredTime(day.sunsetAt, locale, timeZone)} /> } label={t("advanced.detailLabel.daylight")} value={getPreferredDaylightDuration(day.daylightDuration)} /> ); };