import { useState, useEffect, ChangeEvent, SyntheticEvent } from 'react'; import { connect } from 'react-redux'; import { addApp, updateApp } from '../../../store/actions'; import { App, NewApp } from '../../../interfaces'; import classes from './AppForm.module.css'; import ModalForm from '../../UI/Forms/ModalForm/ModalForm'; import InputGroup from '../../UI/Forms/InputGroup/InputGroup'; import Button from '../../UI/Buttons/Button/Button'; interface ComponentProps { modalHandler: () => void; addApp: (formData: NewApp | FormData) => any; updateApp: (id: number, formData: NewApp | FormData) => any; app?: App; } const AppForm = (props: ComponentProps): JSX.Element => { const [useCustomIcon, toggleUseCustomIcon] = useState(false); const [customIcon, setCustomIcon] = useState(null); const [formData, setFormData] = useState({ name: '', url: '', icon: '', }); useEffect(() => { if (props.app) { setFormData({ name: props.app.name, url: props.app.url, icon: props.app.icon, }); } else { setFormData({ name: '', url: '', icon: '', }); } }, [props.app]); const inputChangeHandler = (e: ChangeEvent): void => { setFormData({ ...formData, [e.target.name]: e.target.value, }); }; const fileChangeHandler = (e: ChangeEvent): void => { if (e.target.files) { setCustomIcon(e.target.files[0]); } }; const formSubmitHandler = (e: SyntheticEvent): void => { e.preventDefault(); const createFormData = (): FormData => { const data = new FormData(); if (customIcon) { data.append('icon', customIcon); } data.append('name', formData.name); data.append('url', formData.url); return data; }; if (!props.app) { if (customIcon) { const data = createFormData(); props.addApp(data); } else { props.addApp(formData); } } else { if (customIcon) { const data = createFormData(); props.updateApp(props.app.id, data); } else { props.updateApp(props.app.id, formData); props.modalHandler(); } } setFormData({ name: '', url: '', icon: '', }); }; return ( inputChangeHandler(e)} /> inputChangeHandler(e)} /> {' '} Check supported URL formats {!useCustomIcon ? ( // use mdi icon inputChangeHandler(e)} /> Use icon name from MDI. {' '} Click here for reference toggleUseCustomIcon(!useCustomIcon)} className={classes.Switch} > Switch to custom icon upload ) : ( // upload custom icon fileChangeHandler(e)} accept=".jpg,.jpeg,.png,.svg" /> { setCustomIcon(null); toggleUseCustomIcon(!useCustomIcon); }} className={classes.Switch} > Switch to MDI )} {!props.app ? ( ) : ( )} ); }; export default connect(null, { addApp, updateApp })(AppForm);