import axios from 'axios'; import { Fragment, useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { ApiResponse, Weather } from '../../../interfaces'; import { State } from '../../../store/reducers'; import { weatherTemplate } from '../../../utility/templateObjects/weatherTemplate'; import { WeatherIcon } from '../../UI'; import classes from './WeatherWidget.module.css'; // Redux // Typescript // CSS // UI export const WeatherWidget = (): JSX.Element => { const { loading: configLoading, config } = useSelector( (state: State) => state.config ); const [weather, setWeather] = useState(weatherTemplate); const [isLoading, setIsLoading] = useState(true); // Initial request to get data useEffect(() => { axios .get>('/api/weather') .then((data) => { const weatherData = data.data.data[0]; if (weatherData) { setWeather(weatherData); } setIsLoading(false); }) .catch((err) => console.log(err)); }, []); // Open socket for data updates useEffect(() => { const socketProtocol = document.location.protocol === 'http:' ? 'ws:' : 'wss:'; const socketAddress = `${socketProtocol}//${window.location.host}/socket`; const webSocketClient = new WebSocket(socketAddress); webSocketClient.onmessage = (e) => { const data = JSON.parse(e.data); setWeather({ ...weather, ...data, }); }; return () => webSocketClient.close(); }, []); return (
{configLoading || (config.WEATHER_API_KEY && weather.id > 0 && (
{/* TEMPERATURE */} {config.isCelsius ? ( {weather.tempC}°C ) : ( {Math.round(weather.tempF)}°F )} {/* ADDITIONAL DATA */} {weather[config.weatherData]}%
))}
); };