Dynamic WeatherIcon with weatherStatusCode mapping

This commit is contained in:
unknown 2021-05-15 18:05:53 +02:00
parent e293325da7
commit 873faa6c97
4 changed files with 381 additions and 11 deletions

View file

@ -48,10 +48,10 @@ const Home = (props: ComponentProps): JSX.Element => {
const now = new Date().getHours(); const now = new Date().getHours();
let msg: string; let msg: string;
if (now > 18) msg = 'Good evening!'; if (now >= 18) msg = 'Good evening!';
else if (now > 12) msg = 'Good afternoon!'; else if (now >= 12) msg = 'Good afternoon!';
else if (now > 6) msg = 'Good morning!'; else if (now >= 6) msg = 'Good morning!';
else if (now > 0) msg = 'Good night!'; else if (now >= 0) msg = 'Good night!';
else msg = 'Hello!'; else msg = 'Hello!';
return msg; return msg;

View file

@ -31,11 +31,10 @@ const Settings = (props: ComponentProps): JSX.Element => {
activeClassName={classes.SettingsNavLinkActive} activeClassName={classes.SettingsNavLinkActive}
exact exact
to='/settings/nothig'> to='/settings/nothig'>
Nothing Weather
</NavLink> </NavLink>
</nav> </nav>
<section className={classes.SettingsContent}> <section className={classes.SettingsContent}>
{/* <Themer /> */}
<Switch> <Switch>
<Route exact path='/settings' component={Themer} /> <Route exact path='/settings' component={Themer} />
</Switch> </Switch>

View file

@ -0,0 +1,369 @@
import { IconKey } from 'skycons-ts';
export interface WeatherCondition {
code: number;
icon: {
day: IconKey;
night: IconKey;
}
}
export enum TimeOfDay {
day,
night
}
export class IconMapping {
private conditions: WeatherCondition[] = [
{
code: 1000,
icon: {
day: 'clear-day',
night: 'clear-night'
}
},
{
code: 1003,
icon: {
day: 'partly-cloudy-day',
night: 'partly-cloudy-night'
}
},
{
code: 1006,
icon: {
day: 'cloudy',
night: 'cloudy'
}
},
{
code: 1009,
icon: {
day: 'cloudy',
night: 'cloudy'
}
},
{
code: 1030,
icon: {
day: 'fog',
night: 'fog'
}
},
{
code: 1063,
icon: {
day: 'rain-day',
night: 'rain-night'
}
},
{
code: 1066,
icon: {
day: 'snow-day',
night: 'snow-night'
}
},
{
code: 1069,
icon: {
day: 'rain-snow-day',
night: 'rain-snow-night'
}
},
{
code: 1072,
icon: {
day: 'sleet',
night: 'sleet'
}
},
{
code: 1087,
icon: {
day: 'thunder-day',
night: 'thunder-night'
}
},
{
code: 1114,
icon: {
day: 'snow',
night: 'snow'
}
},
{
code: 1117,
icon: {
day: 'snow',
night: 'snow'
}
},
{
code: 1135,
icon: {
day: 'fog',
night: 'fog'
}
},
{
code: 1147,
icon: {
day: 'fog',
night: 'fog'
}
},
{
code: 1150,
icon: {
day: 'rain',
night: 'rain'
}
},
{
code: 1153,
icon: {
day: 'rain',
night: 'rain'
}
},
{
code: 1168,
icon: {
day: 'sleet',
night: 'sleet'
}
},
{
code: 1171,
icon: {
day: 'sleet',
night: 'sleet'
}
},
{
code: 1180,
icon: {
day: 'rain-day',
night: 'rain-night'
}
},
{
code: 1183,
icon: {
day: 'rain',
night: 'rain'
}
},
{
code: 1186,
icon: {
day: 'rain-day',
night: 'rain-night'
}
},
{
code: 1189,
icon: {
day: 'rain',
night: 'rain'
}
},
{
code: 1192,
icon: {
day: 'rain-day',
night: 'rain-night'
}
},
{
code: 1195,
icon: {
day: 'rain',
night: 'rain'
}
},
{
code: 1198,
icon: {
day: 'sleet',
night: 'sleet'
}
},
{
code: 1201,
icon: {
day: 'sleet',
night: 'sleet'
}
},
{
code: 1204,
icon: {
day: 'rain-snow',
night: 'rain-snow'
}
},
{
code: 1207,
icon: {
day: 'rain-snow',
night: 'rain-snow'
}
},
{
code: 1210,
icon: {
day: 'snow-day',
night: 'snow-night'
}
},
{
code: 1213,
icon: {
day: 'snow',
night: 'snow'
}
},
{
code: 1216,
icon: {
day: 'snow-day',
night: 'snow-night'
}
},
{
code: 1219,
icon: {
day: 'snow',
night: 'snow'
}
},
{
code: 1222,
icon: {
day: 'snow-day',
night: 'snow-night'
}
},
{
code: 1225,
icon: {
day: 'snow',
night: 'snow'
}
},
{
code: 1237,
icon: {
day: 'hail',
night: 'hail'
}
},
{
code: 1240,
icon: {
day: 'rain-day',
night: 'rain-night'
}
},
{
code: 1243,
icon: {
day: 'rain-day',
night: 'rain-night'
}
},
{
code: 1246,
icon: {
day: 'rain-day',
night: 'rain-night'
}
},
{
code: 1249,
icon: {
day: 'rain-snow-day',
night: 'rain-snow-night'
}
},
{
code: 1252,
icon: {
day: 'rain-snow-day',
night: 'rain-snow-night'
}
},
{
code: 1255,
icon: {
day: 'snow-day',
night: 'snow-night'
}
},
{
code: 1258,
icon: {
day: 'snow-day',
night: 'snow-night'
}
},
{
code: 1261,
icon: {
day: 'hail',
night: 'hail'
}
},
{
code: 1264,
icon: {
day: 'hail',
night: 'hail'
}
},
{
code: 1273,
icon: {
day: 'thunder-rain-day',
night: 'thunder-rain-night'
}
},
{
code: 1276,
icon: {
day: 'thunder-rain',
night: 'thunder-rain'
}
},
{
code: 1279,
icon: {
day: 'thunder-day',
night: 'thunder-night'
}
},
{
code: 1282,
icon: {
day: 'thunder',
night: 'thunder'
}
}
];
mapIcon(weatherStatusCode: number, timeOfDay: TimeOfDay): IconKey {
const mapping = this.conditions.find((condition: WeatherCondition) => condition.code === weatherStatusCode);
if (mapping) {
if (timeOfDay === TimeOfDay.day) {
return mapping.icon.day;
} else if (timeOfDay === TimeOfDay.night) {
return mapping.icon.night;
}
}
return 'clear-day';
}
}

View file

@ -1,19 +1,21 @@
import { useEffect } from 'react'; import { useEffect } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { IconKey, Skycons } from 'skycons-ts'; import { Skycons } from 'skycons-ts';
import { GlobalState, Theme } from '../../../../interfaces'; import { GlobalState, Theme } from '../../../../interfaces';
import { IconMapping, TimeOfDay } from './IconMapping';
interface ComponentProps { interface ComponentProps {
theme: Theme; theme: Theme;
icon: IconKey weatherStatusCode: number;
} }
const WeatherIcon = (props: ComponentProps): JSX.Element => { const WeatherIcon = (props: ComponentProps): JSX.Element => {
const randomId = `icon-${Math.floor(Math.random() * 1000)}`; const icon = (new IconMapping).mapIcon(props.weatherStatusCode, TimeOfDay.day);
useEffect(() => { useEffect(() => {
const delay = setTimeout(() => { const delay = setTimeout(() => {
const skycons = new Skycons({'color': props.theme.colors.accent}); const skycons = new Skycons({'color': props.theme.colors.accent});
skycons.add(`weather-icon-${randomId}`, props.icon); skycons.add(`weather-icon`, icon);
skycons.play(); skycons.play();
}, 1); }, 1);
@ -22,7 +24,7 @@ const WeatherIcon = (props: ComponentProps): JSX.Element => {
} }
}, []); }, []);
return <canvas id={`weather-icon-${randomId}`} width='50' height='50'></canvas> return <canvas id={`weather-icon`} width='50' height='50'></canvas>
} }
const mapStateToProps = (state: GlobalState) => { const mapStateToProps = (state: GlobalState) => {