import { useState, useEffect, ChangeEvent, SyntheticEvent } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { NewApp } from '../../../interfaces'; import classes from './AppForm.module.css'; import { ModalForm, InputGroup, Button } from '../../UI'; import { inputHandler, newAppTemplate } from '../../../utility'; import { bindActionCreators } from 'redux'; import { actionCreators } from '../../../store'; import { State } from '../../../store/reducers'; interface Props { modalHandler: () => void; } export const AppForm = ({ modalHandler }: Props): JSX.Element => { const { appInUpdate } = useSelector((state: State) => state.apps); const dispatch = useDispatch(); const { addApp, updateApp, setEditApp } = bindActionCreators( actionCreators, dispatch ); const [useCustomIcon, toggleUseCustomIcon] = useState(false); const [customIcon, setCustomIcon] = useState(null); const [formData, setFormData] = useState(newAppTemplate); useEffect(() => { if (appInUpdate) { setFormData({ ...appInUpdate, }); } else { setFormData(newAppTemplate); } }, [appInUpdate]); const inputChangeHandler = ( e: ChangeEvent, options?: { isNumber?: boolean; isBool?: boolean } ) => { inputHandler({ e, options, setStateHandler: setFormData, state: formData, }); }; 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('description', formData.description); data.append('url', formData.url); data.append('isPublic', `${formData.isPublic ? 1 : 0}`); return data; }; if (!appInUpdate) { if (customIcon) { const data = createFormData(); addApp(data); } else { addApp(formData); } } else { if (customIcon) { const data = createFormData(); updateApp(appInUpdate.id, data); } else { updateApp(appInUpdate.id, formData); modalHandler(); } } setFormData(newAppTemplate); setEditApp(null); }; return ( {/* NAME */} inputChangeHandler(e)} /> {/* URL */} inputChangeHandler(e)} /> {/* DESCRIPTION */} inputChangeHandler(e)} /> Optional - If description is not set, app URL will be displayed {/* ICON */} {!useCustomIcon ? ( // use mdi icon inputChangeHandler(e)} /> Use icon name from MDI or pass a valid URL. {' '} Click here for reference toggleUseCustomIcon(!useCustomIcon)} className={classes.Switch} > Switch to custom icon upload ) : ( // upload custom icon fileChangeHandler(e)} accept=".jpg,.jpeg,.png,.svg,.ico" /> { setCustomIcon(null); toggleUseCustomIcon(!useCustomIcon); }} className={classes.Switch} > Switch to MDI )} {/* VISIBILITY */} {!appInUpdate ? ( ) : ( )} ); };