// React import { useState, SyntheticEvent, Fragment, ChangeEvent, useEffect, } from 'react'; // Redux import { useDispatch, useSelector } from 'react-redux'; // Typescript import { Bookmark, Category, NewBookmark, NewCategory, } from '../../../interfaces'; import { ContentType } from '../Bookmarks'; // UI import { ModalForm, InputGroup, Button } from '../../UI'; // CSS import classes from './BookmarkForm.module.css'; import { newBookmarkTemplate, newCategoryTemplate } from '../../../utility'; import { State } from '../../../store/reducers'; import { bindActionCreators } from 'redux'; import { actionCreators } from '../../../store'; interface Props { modalHandler: () => void; contentType: ContentType; category?: Category; bookmark?: Bookmark; } export const BookmarkForm = (props: Props): JSX.Element => { const { categories } = useSelector((state: State) => state.bookmarks); const dispatch = useDispatch(); const { addCategory, addBookmark, updateCategory, updateBookmark, createNotification, } = bindActionCreators(actionCreators, dispatch); const [useCustomIcon, toggleUseCustomIcon] = useState(false); const [customIcon, setCustomIcon] = useState(null); const [categoryName, setCategoryName] = useState(newCategoryTemplate); const [formData, setFormData] = useState(newBookmarkTemplate); // Load category data if provided for editing useEffect(() => { if (props.category) { setCategoryName({ ...props.category }); } else { setCategoryName(newCategoryTemplate); } }, [props.category]); // Load bookmark data if provided for editing useEffect(() => { if (props.bookmark) { setFormData({ ...props.bookmark }); } else { setFormData(newBookmarkTemplate); } }, [props.bookmark]); 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); data.append('categoryId', `${formData.categoryId}`); return data; }; if (!props.category && !props.bookmark) { // Add new if (props.contentType === ContentType.category) { // Add category addCategory(categoryName); setCategoryName(newCategoryTemplate); } else if (props.contentType === ContentType.bookmark) { // Add bookmark if (formData.categoryId === -1) { createNotification({ title: 'Error', message: 'Please select category', }); return; } if (customIcon) { const data = createFormData(); addBookmark(data); } else { addBookmark(formData); } setFormData({ ...newBookmarkTemplate, categoryId: formData.categoryId, }); // setCustomIcon(null); } } else { // Update if (props.contentType === ContentType.category && props.category) { // Update category updateCategory(props.category.id, categoryName); setCategoryName(newCategoryTemplate); } else if (props.contentType === ContentType.bookmark && props.bookmark) { // Update bookmark if (customIcon) { const data = createFormData(); updateBookmark(props.bookmark.id, data, { prev: props.bookmark.categoryId, curr: formData.categoryId, }); } else { updateBookmark(props.bookmark.id, formData, { prev: props.bookmark.categoryId, curr: formData.categoryId, }); } setFormData(newBookmarkTemplate); setCustomIcon(null); } props.modalHandler(); } }; const inputChangeHandler = (e: ChangeEvent): void => { setFormData({ ...formData, [e.target.name]: e.target.value, }); }; const selectChangeHandler = (e: ChangeEvent): void => { setFormData({ ...formData, categoryId: parseInt(e.target.value), }); }; const fileChangeHandler = (e: ChangeEvent): void => { if (e.target.files) { setCustomIcon(e.target.files[0]); } }; let button = ; if (!props.category && !props.bookmark) { if (props.contentType === ContentType.category) { button = ; } else { button = ; } } else if (props.category) { button = ; } else if (props.bookmark) { button = ; } return ( {props.contentType === ContentType.category ? ( setCategoryName({ name: e.target.value, isPublic: !!!!!false }) } /> ) : ( inputChangeHandler(e)} /> inputChangeHandler(e)} /> {' '} Check supported URL formats {!useCustomIcon ? ( // mdi inputChangeHandler(e)} /> Use icon name from MDI. {' '} Click here for reference toggleUseCustomIcon(!useCustomIcon)} className={classes.Switch} > Switch to custom icon upload ) : ( // custom fileChangeHandler(e)} accept=".jpg,.jpeg,.png,.svg" /> { setCustomIcon(null); toggleUseCustomIcon(!useCustomIcon); }} className={classes.Switch} > Switch to MDI )} )} {button} ); };