import { useState, useEffect, Fragment } from 'react'; import { useNavigate } from 'react-router'; import { Link } from 'react-router-dom'; import { AppBar, Button, IconButton, List, ListItem, ListItemIcon, ListItemText, Stack, SwipeableDrawer, Toolbar, Typography } from '@mui/material'; import { Box } from '@mui/system'; import { Hash, HashedObject, MutableReference, Space, SpaceEntryPoint } from '@hyper-hyper-space/core'; import { useObjectState } from '@hyper-hyper-space/react'; import { FolderItem, Home, SpaceLink } from '@hyper-hyper-space/home'; import CreateHomeDialog from './CreateHomeDialog'; import SaveSpaceDialog from './SaveSpaceDialog'; import { supportedSpaces } from '../../model/SupportedSpaces'; import { HyperBrowserConfig } from '../../model/HyperBrowserConfig'; function SpaceFrameToolbar(props: {home?: Home|Hash, spaceEntryPointHash: Hash, spaceEntryPoint?: HashedObject & SpaceEntryPoint, foundLocalCopy?: boolean}) { const navigate = useNavigate(); const spaceState = useObjectState(props.spaceEntryPoint); const [title, setTitle] = useState(); useEffect(() => { const val = spaceState?.getValue()?.getName(); if (val instanceof MutableReference) { const t = val.getValue(); if (typeof(t) === 'string') { setTitle(t); } } else if (typeof(val) === 'string') { setTitle(val); } }, [spaceState]) const homeHash = props.home instanceof HashedObject? props.home.getLastHash() : props.home; const [home, setHome] = useState(); const homeState = useObjectState(home); const links = homeState?.value?.desktop?.currentLinksForSpace(props.spaceEntryPointHash) || [] as Array; const isSaved = homeState?.value === undefined? (props.foundLocalCopy !== undefined && props.foundLocalCopy) : links.length > 0; const [showCreateHomeDialog, setShowCreateHomeDialog] = useState(false); const openCreateHomeDialog = () => { setShowCreateHomeDialog(true); } const closeCreateHomeDialog = () => { setShowCreateHomeDialog(false); } const [showSaveSpaceDialog, setShowSaveSpaceDialog] = useState(false); const openSaveSpaceDialog = () => { setShowSaveSpaceDialog(true); } const closeSaveSpaceDialog = () => { setShowSaveSpaceDialog(false); } const save = () => { if (homeHash === undefined) { openCreateHomeDialog(); } else { openSaveSpaceDialog(); } } const viewAuthorProfile = () => { navigate('./view-author'); } // drawer const [showDrawer, setShowDrawer] = useState(false); const onCloseDrawer = (ev: React.SyntheticEvent) => { setShowDrawer(false); }; const onOpenDrawer = (ev: React.SyntheticEvent) => { setShowDrawer(true); }; const openDrawer = () => { setShowDrawer(true); }; const spaceDisplayInfo = props.spaceEntryPoint === undefined? undefined : supportedSpaces.get(props.spaceEntryPoint.getClassName()); const openContainingFolder = (path: Array) => { const url = '../#/home/' + encodeURIComponent((props.home as Home).getLastHash()) + '/folder/' + encodeURIComponent(path.slice(0, -1).map((value: FolderItem) => value.getLastHash()).join('_')) window.open(url, '_blank'); } const [saveSpacePending, setSaveSpacePending] = useState(false); useEffect(() => { if (saveSpacePending && homeState?.value !== undefined) { setSaveSpacePending(false); openSaveSpaceDialog(); } }, [homeState, saveSpacePending]); const [loadingHome, setLoadingHome] = useState(false); useEffect(() => { const init = async () => { console.log('LOADING HOME...') const homeResources = await HyperBrowserConfig.initHomeResources(homeHash as string, (e) => { console.log('Error while initializing home in SpaceFrameToolbar'); console.log(e);}, 'worker'); const loaded = await homeResources.store.loadAndWatchForChanges(homeHash as string) as Home; setHome(loaded); }; if ((showDrawer || showSaveSpaceDialog) && homeHash !== undefined && home === undefined && !loadingHome) { setLoadingHome(true); init(); } }, [showDrawer, showSaveSpaceDialog, homeHash, home]); return ( {/* title === undefined ? untitled : {title} */} {isSaved && {title !== undefined && {title}} ({Space.getWordCodingForHash(props.spaceEntryPointHash).join('-')}) } {!isSaved && {title !== undefined && {title}} ({Space.getWordCodingForHash(props.spaceEntryPointHash).join('-')}, unsaved) {/* {Space.getWordCodingForHash(props.spaceEntryPointHash).join('-')}(unsaved) */} }
hash: {props.spaceEntryPointHash} code: {Space.getWordCodingForHash(props.spaceEntryPointHash).join(' ')} {spaceDisplayInfo !== undefined && type: {spaceDisplayInfo.name}} {props.spaceEntryPoint?.getAuthor()?.info?.name !== undefined && }
{props.spaceEntryPoint?.getAuthor()?.info?.name === undefined && This space has no owner } {props.spaceEntryPoint?.getAuthor()?.info?.name !== undefined && hash: {props.spaceEntryPoint?.getAuthor()?.getLastHash()} code: {Space.getWordCodingForHash(props.spaceEntryPoint?.getAuthor()?.getLastHash() as Hash).join(' ')} name: {props.spaceEntryPoint?.getAuthor()?.info?.name} }
{!isSaved &&
Using a temporary copy
} {isSaved &&
{homeState?.value !== undefined && In {homeState?.value?.getAuthor()?.info?.name}'s Home Space: {links.map((link: SpaceLink) => ( Array.from(homeState?.value?.desktop?.getPathsForItemHash(link.getLastHash())?.values() || []).map((path: Array) => ( item.getLastHash()).join('-')}> name: {(path.at(-1) as FolderItem).name?.getValue()} location: {path.slice(0, -1).map((value: FolderItem) => value.name?.getValue() || 'unnamed').join('/')} openContainingFolder(path)}> ))) )} } {homeState?.value === undefined && Loading... }
}
{/* */}
{showCreateHomeDialog && } {showSaveSpaceDialog && }
); } export default SpaceFrameToolbar;