feat: add weather widget (#286)
* feat: add nestjs replacement, remove nestjs * feat: add weather widget * fix: lock issue * fix: format issue * fix: deepsource issues * fix: change timezone to auto
This commit is contained in:
81
packages/widgets/src/weather/icon.tsx
Normal file
81
packages/widgets/src/weather/icon.tsx
Normal file
@@ -0,0 +1,81 @@
|
||||
import type { TranslationObject } from "@homarr/translation";
|
||||
import { useScopedI18n } from "@homarr/translation/client";
|
||||
import type { TablerIcon } from "@homarr/ui";
|
||||
import {
|
||||
Box,
|
||||
IconCloud,
|
||||
IconCloudFog,
|
||||
IconCloudRain,
|
||||
IconCloudSnow,
|
||||
IconCloudStorm,
|
||||
IconQuestionMark,
|
||||
IconSnowflake,
|
||||
IconSun,
|
||||
Tooltip,
|
||||
} from "@homarr/ui";
|
||||
|
||||
interface WeatherIconProps {
|
||||
code: number;
|
||||
size?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Icon which should be displayed when specific code is defined
|
||||
* @param code weather code from api
|
||||
* @returns weather tile component
|
||||
*/
|
||||
export const WeatherIcon = ({ code, size = 50 }: WeatherIconProps) => {
|
||||
const t = useScopedI18n("widget.weather");
|
||||
|
||||
const { icon: Icon, name } =
|
||||
weatherDefinitions.find((definition) => definition.codes.includes(code)) ??
|
||||
unknownWeather;
|
||||
|
||||
return (
|
||||
<Tooltip withinPortal withArrow label={t(`kind.${name}`)}>
|
||||
<Box>
|
||||
<Icon style={{ float: "left" }} size={size} />
|
||||
</Box>
|
||||
</Tooltip>
|
||||
);
|
||||
};
|
||||
|
||||
interface WeatherDefinitionType {
|
||||
icon: TablerIcon;
|
||||
name: keyof TranslationObject["widget"]["weather"]["kind"];
|
||||
codes: number[];
|
||||
}
|
||||
|
||||
// 0 Clear sky
|
||||
// 1, 2, 3 Mainly clear, partly cloudy, and overcast
|
||||
// 45, 48 Fog and depositing rime fog
|
||||
// 51, 53, 55 Drizzle: Light, moderate, and dense intensity
|
||||
// 56, 57 Freezing Drizzle: Light and dense intensity
|
||||
// 61, 63, 65 Rain: Slight, moderate and heavy intensity
|
||||
// 66, 67 Freezing Rain: Light and heavy intensity
|
||||
// 71, 73, 75 Snow fall: Slight, moderate, and heavy intensity
|
||||
// 77 Snow grains
|
||||
// 80, 81, 82 Rain showers: Slight, moderate, and violent
|
||||
// 85, 86Snow showers slight and heavy
|
||||
// 95 *Thunderstorm: Slight or moderate
|
||||
// 96, 99 *Thunderstorm with slight and heavy hail
|
||||
const weatherDefinitions: WeatherDefinitionType[] = [
|
||||
{ icon: IconSun, name: "clear", codes: [0] },
|
||||
{ icon: IconCloud, name: "mainlyClear", codes: [1, 2, 3] },
|
||||
{ icon: IconCloudFog, name: "fog", codes: [45, 48] },
|
||||
{ icon: IconCloud, name: "drizzle", codes: [51, 53, 55] },
|
||||
{ icon: IconSnowflake, name: "freezingDrizzle", codes: [56, 57] },
|
||||
{ icon: IconCloudRain, name: "rain", codes: [61, 63, 65] },
|
||||
{ icon: IconCloudRain, name: "freezingRain", codes: [66, 67] },
|
||||
{ icon: IconCloudSnow, name: "snowFall", codes: [71, 73, 75] },
|
||||
{ icon: IconCloudSnow, name: "snowGrains", codes: [77] },
|
||||
{ icon: IconCloudRain, name: "rainShowers", codes: [80, 81, 82] },
|
||||
{ icon: IconCloudSnow, name: "snowShowers", codes: [85, 86] },
|
||||
{ icon: IconCloudStorm, name: "thunderstorm", codes: [95] },
|
||||
{ icon: IconCloudStorm, name: "thunderstormWithHail", codes: [96, 99] },
|
||||
];
|
||||
|
||||
const unknownWeather: Omit<WeatherDefinitionType, "codes"> = {
|
||||
icon: IconQuestionMark,
|
||||
name: "unknown",
|
||||
};
|
||||
Reference in New Issue
Block a user