diff --git a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx index 4993246384..598028f5a5 100644 --- a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx +++ b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx @@ -1,11 +1,17 @@ import { ReactElement, useEffect, useState } from 'react'; import { useAppState } from '@/providers/app-state-provider'; import type { NextPageWithLayout } from '../..//_app'; -import { styled } from '@/styles'; +import { displayFlex, styled } from '@/styles'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/router'; import { Page as PageStore, Workspace } from '@blocksuite/store'; import { PageLoading } from '@/components/loading'; +import { Breadcrumbs } from '@/ui/breadcrumbs'; +import { IconButton } from '@/ui/button'; +import NextLink from 'next/link'; +import { PaperIcon, SearchIcon } from '@blocksuite/icons'; +import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; +import { useModal } from '@/providers/GlobalModalProvider'; const DynamicBlocksuite = dynamic(() => import('@/components/editor'), { ssr: false, @@ -16,11 +22,15 @@ const Page: NextPageWithLayout = () => { const { dataCenter } = useAppState(); const router = useRouter(); const [loaded, setLoaded] = useState(false); + const [workspaceName, setWorkspaceName] = useState(''); + const [pageTitle, setPageTitle] = useState(''); + const { triggerQuickSearchModal } = useModal(); useEffect(() => { dataCenter .loadPublicWorkspace(router.query.workspaceId as string) .then(data => { + setWorkspaceName(data.blocksuiteWorkspace?.meta.name as string); if (data && data.blocksuiteWorkspace) { setWorkspace(data.blocksuiteWorkspace); if ( @@ -32,6 +42,7 @@ const Page: NextPageWithLayout = () => { const page = data.blocksuiteWorkspace.getPage( router.query.pageId as string ); + page && setPageTitle(page.meta.title); page && setPage(page); } else { router.push('/404'); @@ -46,6 +57,30 @@ const Page: NextPageWithLayout = () => { <> {!loaded && } + + + + + {workspaceName} + + + + {pageTitle ? pageTitle : 'Untitled'} + + + { + triggerQuickSearchModal(); + }} + > + + + + {workspace && page && ( { return { - height: 'calc(100vh)', - padding: '78px 72px', + height: '100vh', overflowY: 'auto', backgroundColor: theme.colors.pageBackground, }; }); +export const NavContainer = styled.div(({ theme }) => { + return { + width: '100vw', + padding: '0 12px', + height: '60px', + ...displayFlex('start', 'center'), + backgroundColor: theme.colors.pageBackground, + }; +}); +export const StyledBreadcrumbs = styled(NextLink)(({ theme }) => { + return { + flex: 1, + ...displayFlex('center', 'center'), + paddingLeft: '12px', + span: { + padding: '0 12px', + fontSize: theme.font.base, + lineHeight: theme.font.lineHeightBase, + }, + ':hover': { color: theme.colors.primaryColor }, + transition: 'all .15s', + ':visited': { + color: theme.colors.popoverColor, + ':hover': { color: theme.colors.primaryColor }, + }, + }; +}); +export const SearchButton = styled(IconButton)(({ theme }) => { + return { + color: theme.colors.iconColor, + fontSize: '24px', + marginLeft: 'auto', + padding: '0 24px', + }; +}); diff --git a/packages/app/src/pages/public-workspace/[workspaceId]/index.tsx b/packages/app/src/pages/public-workspace/[workspaceId]/index.tsx index 113c61c2a6..3d4a8a4dc3 100644 --- a/packages/app/src/pages/public-workspace/[workspaceId]/index.tsx +++ b/packages/app/src/pages/public-workspace/[workspaceId]/index.tsx @@ -2,16 +2,28 @@ import { PageList } from '@/components/page-list'; import { ReactElement, useEffect, useState } from 'react'; import { PageMeta, useAppState } from '@/providers/app-state-provider'; import { useRouter } from 'next/router'; -import { PageContainer } from './[pageId]'; +import { + PageContainer, + NavContainer, + StyledBreadcrumbs, + SearchButton, +} from './[pageId]'; +import { Breadcrumbs } from '@/ui/breadcrumbs'; +import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; +import { SearchIcon } from '@blocksuite/icons'; +import { useModal } from '@/providers/GlobalModalProvider'; const All = () => { const { dataCenter } = useAppState(); const router = useRouter(); const [pageList, setPageList] = useState([]); + const [workspaceName, setWorkspaceName] = useState(''); + const { triggerQuickSearchModal } = useModal(); useEffect(() => { dataCenter .loadPublicWorkspace(router.query.workspaceId as string) .then(data => { setPageList(data.blocksuiteWorkspace?.meta.pageMetas as PageMeta[]); + setWorkspaceName(data.blocksuiteWorkspace?.meta.name as string); }) .catch(() => { router.push('/404'); @@ -20,6 +32,23 @@ const All = () => { return ( + + + + + {workspaceName} + + + { + triggerQuickSearchModal(); + }} + > + + + !p.trash)} showFavoriteTag={false}