import { useState, SyntheticEvent, Fragment, ChangeEvent, useEffect } from 'react'; import { connect } from 'react-redux'; import ModalForm from '../../UI/Forms/ModalForm/ModalForm'; import InputGroup from '../../UI/Forms/InputGroup/InputGroup'; import { Bookmark, Category, GlobalState, NewBookmark, NewCategory, NewNotification } from '../../../interfaces'; import { ContentType } from '../Bookmarks'; import { getCategories, addCategory, addBookmark, updateCategory, updateBookmark, createNotification } from '../../../store/actions'; import Button from '../../UI/Buttons/Button/Button'; interface ComponentProps { modalHandler: () => void; contentType: ContentType; categories: Category[]; category?: Category; bookmark?: Bookmark; addCategory: (formData: NewCategory) => void; addBookmark: (formData: NewBookmark) => void; updateCategory: (id: number, formData: NewCategory) => void; updateBookmark: (id: number, formData: NewBookmark, previousCategoryId: number) => void; createNotification: (notification: NewNotification) => void; } const BookmarkForm = (props: ComponentProps): JSX.Element => { const [categoryName, setCategoryName] = useState({ name: '' }) const [formData, setFormData] = useState({ name: '', url: '', categoryId: -1, icon: '' }) // Load category data if provided for editing useEffect(() => { if (props.category) { setCategoryName({ name: props.category.name }); } else { setCategoryName({ name: '' }); } }, [props.category]) // Load bookmark data if provided for editing useEffect(() => { if (props.bookmark) { setFormData({ name: props.bookmark.name, url: props.bookmark.url, categoryId: props.bookmark.categoryId, icon: props.bookmark.icon }) } else { setFormData({ name: '', url: '', categoryId: -1, icon: '' }) } }, [props.bookmark]) const formSubmitHandler = (e: SyntheticEvent): void => { e.preventDefault(); if (!props.category && !props.bookmark) { // Add new if (props.contentType === ContentType.category) { // Add category props.addCategory(categoryName); setCategoryName({ name: '' }); } else if (props.contentType === ContentType.bookmark) { // Add bookmark if (formData.categoryId === -1) { props.createNotification({ title: 'Error', message: 'Please select category' }) return; } props.addBookmark(formData); setFormData({ name: '', url: '', categoryId: formData.categoryId, icon: '' }) } } else { // Update if (props.contentType === ContentType.category && props.category) { // Update category props.updateCategory(props.category.id, categoryName); setCategoryName({ name: '' }); } else if (props.contentType === ContentType.bookmark && props.bookmark) { // Update bookmark props.updateBookmark(props.bookmark.id, formData, props.bookmark.categoryId); setFormData({ name: '', url: '', categoryId: -1, icon: '' }) } 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) }) } 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 })} /> ) : ( inputChangeHandler(e)} /> inputChangeHandler(e)} /> Only urls without http[s]:// are supported inputChangeHandler(e)} /> Use icon name from MDI. {' '}Click here for reference ) } {button} ) } const mapStateToProps = (state: GlobalState) => { return { categories: state.bookmark.categories } } const dispatchMap = { getCategories, addCategory, addBookmark, updateCategory, updateBookmark, createNotification } export default connect(mapStateToProps, dispatchMap)(BookmarkForm);