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"
/>
} />
>
);
}
export default App;