import { useObjectState } from "@hyper-hyper-space/react"; import { Page } from "@hyper-hyper-space/wiki-collab"; import { Divider, Icon, IconButton, InputAdornment, List, ListItem, ListItemButton, Paper, Stack, TextField, Tooltip, Typography, } from "@mui/material"; import { useEffect, useState } from "react"; import { DragDropContext, Draggable, Droppable, DropResult, } from "react-beautiful-dnd"; import { useLocation, useOutletContext, useParams } from "react-router"; import { WikiContext } from "./WikiSpaceView"; import { Delete, DragIndicator, Remove } from "@mui/icons-material"; import "./WikiSpaceNavigation.css"; import { PageArray } from "@hyper-hyper-space/wiki-collab"; function WikiSpaceNavigation(props: { width: string; redirect?: boolean }) { const { nav, wiki, spaceContext } = useOutletContext(); const { home } = spaceContext; const { pageName } = useParams(); const { pathname } = useLocation(); const onSettingsPage = pathname.includes("/settings/"); const onAddPage = pathname.includes("/add-page"); const wikiState = useObjectState(wiki); const pageArrayState = useObjectState(wiki?.pages, { debounceFreq: 250 }); const [canEditPageArray, setCanEditPageArray] = useState(false); const onDragEnd = async (result: DropResult) => { const from = result.source.index; let to = result.destination?.index; if (to === undefined) { return; } wiki.movePage(from, to, home?.getAuthor()!); }; useEffect(() => { let cancel = false; pageArrayState ?.getValue() ?.canInsert(undefined, 0, spaceContext?.home?.getAuthor()) .then((canInsert: boolean) => { if (cancel) return; setCanEditPageArray(canInsert); }); return () => { cancel = true; } }, [pageArrayState, spaceContext?.home]); const [filterText, setFilterText] = useState(""); const onFilterTextChange = (e: React.ChangeEvent) => { const newValue = e.currentTarget.value; setFilterText(newValue); }; const filterPage = (p: Page, filterText: string) => filterText.trim() === "" || (p.name ?.toLowerCase() ?.indexOf(filterText.trim().toLocaleLowerCase()) as number) >= 0; useEffect(() => { if (props.redirect) { if (pageArrayState?.getValue()?.size() || 0 > 0) { nav.goToPage(pageArrayState?.getValue()?.values().next().value.name); } } }, [pageArrayState]); const pageTabElements = Array.from( wikiState?.getValue()?.getAllowedPages() || [] ) .filter((page: Page) => filterPage(page, filterText)) .map((page: Page, index: any) => ( {(provided) => ( <> nav.goToPage(page.name as string)} key={"navigation-for-" + page.getLastHash()} className={ canEditPageArray ? "editable-tab page-tab" : "page-tab" } {...provided.draggableProps} {...provided.dragHandleProps} ref={provided.innerRef} > {canEditPageArray && ( )} {page.name} {canEditPageArray && ( )} )} )); const currentPageStyle = { fontWeight: "bold" }; return ( {wikiState?.getValue()?.title?.getValue() || "Fetching title..."} ), }} > {/* saved pages */} {(provided) => (
{pageTabElements} {provided.placeholder}
)}
{/* unsaved pages */} {pageName && !Array.from(wikiState?.getValue()?.getAllowedPages()!) .map((p) => p.name) .includes(pageName) && ( {canEditPageArray && ( )} {pageName} )} {/* add page */} {canEditPageArray && ( + add page )} {canEditPageArray && ( Settings )}
); } export default WikiSpaceNavigation;