import { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; // Redux import { useDispatch, useSelector } from 'react-redux'; import { State } from '../../store/reducers'; import { bindActionCreators } from 'redux'; import { actionCreators } from '../../store'; // Typescript import { Category, Bookmark } from '../../interfaces'; // CSS import classes from './Bookmarks.module.css'; // UI import { Container, Headline, ActionButton, Spinner, Modal } from '../UI'; // Components import { BookmarkGrid } from './BookmarkGrid/BookmarkGrid'; import { Form } from './Form/Form'; // Utils import { bookmarkTemplate, categoryTemplate } from '../../utility'; import { Table } from './Table/Table'; interface Props { searching: boolean; } export enum ContentType { category, bookmark, } export const Bookmarks = (props: Props): JSX.Element => { // Get Redux state const { bookmarks: { loading, categories }, auth: { isAuthenticated }, } = useSelector((state: State) => state); // Get Redux action creators const dispatch = useDispatch(); const { getCategories } = bindActionCreators(actionCreators, dispatch); // Load categories if array is empty useEffect(() => { if (!categories.length) { getCategories(); } }, []); // Form const [modalIsOpen, setModalIsOpen] = useState(false); const [formContentType, setFormContentType] = useState(ContentType.category); const [isInUpdate, setIsInUpdate] = useState(false); const [categoryInUpdate, setCategoryInUpdate] = useState(categoryTemplate); const [bookmarkInUpdate, setBookmarkInUpdate] = useState(bookmarkTemplate); // Table const [showTable, setShowTable] = useState(false); const [tableContentType, setTableContentType] = useState( ContentType.category ); // Observe if user is authenticated -> set default view (grid) if not useEffect(() => { if (!isAuthenticated) { setShowTable(false); setModalIsOpen(false); } }, [isAuthenticated]); // Form actions const toggleModal = (): void => { setModalIsOpen(!modalIsOpen); }; const openFormForAdding = (contentType: ContentType) => { setFormContentType(contentType); setIsInUpdate(false); toggleModal(); }; const openFormForUpdating = (data: Category | Bookmark): void => { setIsInUpdate(true); const instanceOfCategory = (object: any): object is Category => { return 'bookmarks' in object; }; if (instanceOfCategory(data)) { setFormContentType(ContentType.category); setCategoryInUpdate(data); } else { setFormContentType(ContentType.bookmark); setBookmarkInUpdate(data); } toggleModal(); }; // Table actions const showTableForEditing = (contentType: ContentType) => { // We're in the edit mode and the same button was clicked - go back to list if (showTable && contentType === tableContentType) { setShowTable(false); } else { setShowTable(true); setTableContentType(contentType); } }; return (
Go back} /> {isAuthenticated && (
openFormForAdding(ContentType.category)} /> openFormForAdding(ContentType.bookmark)} /> showTableForEditing(ContentType.category)} /> {/* showTableForEditing(ContentType.bookmark)} /> */}
)} {loading ? ( ) : !showTable ? ( ) : ( )} ); };