import { useState, ChangeEvent, useEffect, FormEvent } from 'react'; import axios from 'axios'; // Redux import { connect } from 'react-redux'; import { createNotification, updateConfig } from '../../../store/actions'; // Typescript import { ApiResponse, GlobalState, NewNotification, Weather, WeatherForm } from '../../../interfaces'; // UI import InputGroup from '../../UI/Forms/InputGroup/InputGroup'; import Button from '../../UI/Buttons/Button/Button'; // Utils import { searchConfig } from '../../../utility'; interface ComponentProps { createNotification: (notification: NewNotification) => void; updateConfig: (formData: WeatherForm) => void; loading: boolean; } const WeatherSettings = (props: ComponentProps): JSX.Element => { // Initial state const [formData, setFormData] = useState({ WEATHER_API_KEY: '', lat: 0, long: 0, isCelsius: 1 }) // Get config useEffect(() => { setFormData({ WEATHER_API_KEY: searchConfig('WEATHER_API_KEY', ''), lat: searchConfig('lat', 0), long: searchConfig('long', 0), isCelsius: searchConfig('isCelsius', 1) }) }, [props.loading]); // Form handler const formSubmitHandler = async (e: FormEvent) => { e.preventDefault(); // Check for api key input if ((formData.lat || formData.long) && !formData.WEATHER_API_KEY) { props.createNotification({ title: 'Warning', message: 'API key is missing. Weather Module will NOT work' }) } // Save settings await props.updateConfig(formData); // Update weather axios.get>('/api/weather/update') .then(() => { props.createNotification({ title: 'Success', message: 'Weather updated' }) }) .catch((err) => { props.createNotification({ title: 'Error', message: err.response.data.error }) }); } // Input handler const inputChangeHandler = (e: ChangeEvent, isNumber?: boolean) => { let value: string | number = e.target.value; if (isNumber) { value = parseFloat(value); } setFormData({ ...formData, [e.target.name]: value }) } return (
formSubmitHandler(e)}> inputChangeHandler(e)} /> Using {' '}Weather API . Key is required for weather module to work. inputChangeHandler(e, true)} /> You can use {' '}latlong.net inputChangeHandler(e, true)} />
) } const mapStateToProps = (state: GlobalState) => { return { loading: state.config.loading } } export default connect(mapStateToProps, { createNotification, updateConfig })(WeatherSettings);