import { Navigate, Route, Routes, useLocation } from "react-router-dom"; import { Footer, Header, Main, Nav, Page } from "./components/layout"; import { useCallback, useEffect, useState } from "react"; import { defaultPages } from "./config/pages"; import "./App.css"; let pageId = 0; function App() { const storedPages = JSON.parse(localStorage.getItem("notebook-pages")); const initialPages = storedPages || defaultPages; const [pages, setPages] = useState(initialPages); const [currentPage, setCurrentPage] = useState({}); const [deletedPages, setDeletedPages] = useState([]); const location = useLocation(); pageId = storedPages ? storedPages.at(storedPages.length - 1).id : pageId; const isCover = () => currentPage && currentPage.id === 0; const isPageExists = useCallback( (id) => { const pageIndex = pages.findIndex((page) => page.id === id); return pageIndex === -1 ? false : true; }, [pages] ); const addNewPage = useCallback(() => { pageId++; const newPage = { id: pageId, body: "", title: `Page ${pageId}`, url: `/page/${pageId}`, }; setPages((previous) => [...previous, newPage]); }, []); const removePage = useCallback(() => { const currentPageId = currentPage.id; const pagesCopy = pages.slice(0); const currentPageIndex = pages.findIndex( (page) => page.id === currentPageId ); setDeletedPages((prev) => [...prev, currentPage]); pagesCopy.splice(currentPageIndex, 1); const newPages = pagesCopy.map((page) => { if (page.id <= currentPageId) return page; const newId = page.id - 1; const newURL = `/page/${newId}`; return { ...page, id: newId, url: newURL }; }); setCurrentPage(...newPages.filter((page) => page.id === currentPageId)); setPages(newPages); pageId = pageId - 1; }, [pages, currentPage]); const restorePage = useCallback(() => { const deletedPage = deletedPages.pop(); const pagesCopy = pages.slice(0); const restoredPageIndex = pagesCopy.findIndex( (page) => page.id === deletedPage.id ); const newPages = pagesCopy.map((page) => { if (page.id < deletedPage.id) return page; const newId = page.id + 1; const newURL = `/page/${newId}`; return { ...page, id: newId, url: newURL }; }); newPages.splice(restoredPageIndex, 0, deletedPage); setCurrentPage(...newPages.filter((page) => page.id === deletedPage.id)); setPages(newPages); }, [pages, deletedPages]); useEffect(() => { !isPageExists(1) && addNewPage(); }, [isPageExists, addNewPage]); useEffect(() => { const requestedPage = pages.find((page) => page.url === location.pathname); if (requestedPage) { setCurrentPage(requestedPage); } else { setCurrentPage(() => pages.find((page) => page.url === "/404")); } }, [location.pathname, pages]); useEffect(() => { if (currentPage) document.title = `Notebook - ${currentPage.title}`; }, [currentPage]); useEffect(() => { setPages((prevPages) => { return prevPages.map((page) => { if (page.id !== currentPage.id) return page; return { ...page, body: currentPage.body }; }); }); }, [currentPage.id, currentPage.body]); useEffect(() => { setPages((prevPages) => { return prevPages.map((page) => { if (page.id !== currentPage.id) return page; return { ...page, title: currentPage.title }; }); }); }, [currentPage.id, currentPage.title]); useEffect(() => { localStorage.setItem("notebook-pages", JSON.stringify(pages)); }, [pages]); return ( <>
} /> } /> } /> } /> } path="/404" /> } />