fix: page crash in public workspace (#1324)
This commit is contained in:
@@ -3,7 +3,7 @@ import { useTranslation } from '@affine/i18n';
|
|||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
|
|
||||||
import { useIsWorkspaceOwner } from '../../../../../hooks/affine/use-is-workspace-owner';
|
import { useIsWorkspaceOwner } from '../../../../../hooks/affine/use-is-workspace-owner';
|
||||||
import { useBlockSuiteWorkspaceBlobUrl } from '../../../../../hooks/use-blocksuite-workspace-blob-url';
|
import { useBlockSuiteWorkspaceAvatarUrl } from '../../../../../hooks/use-blocksuite-workspace-avatar-url';
|
||||||
import { useBlockSuiteWorkspaceName } from '../../../../../hooks/use-blocksuite-workspace-name';
|
import { useBlockSuiteWorkspaceName } from '../../../../../hooks/use-blocksuite-workspace-name';
|
||||||
import { RemWorkspaceFlavour } from '../../../../../shared';
|
import { RemWorkspaceFlavour } from '../../../../../shared';
|
||||||
import { Upload } from '../../../../pure/file-upload';
|
import { Upload } from '../../../../pure/file-upload';
|
||||||
@@ -43,7 +43,7 @@ export const GeneralPanel: React.FC<PanelProps> = ({
|
|||||||
setName(name);
|
setName(name);
|
||||||
};
|
};
|
||||||
|
|
||||||
const [, update] = useBlockSuiteWorkspaceBlobUrl(
|
const [, update] = useBlockSuiteWorkspaceAvatarUrl(
|
||||||
workspace.blockSuiteWorkspace
|
workspace.blockSuiteWorkspace
|
||||||
);
|
);
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ export const BlockSuitePublicPageList: React.FC<BlockSuitePageListProps> = ({
|
|||||||
isPublic={true}
|
isPublic={true}
|
||||||
blockSuiteWorkspace={blockSuiteWorkspace}
|
blockSuiteWorkspace={blockSuiteWorkspace}
|
||||||
onClickPage={onOpenPage}
|
onClickPage={onOpenPage}
|
||||||
listType="all"
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ export const PageList: React.FC<PageListProps> = ({
|
|||||||
{pageMeta.title || t('Untitled')}
|
{pageMeta.title || t('Untitled')}
|
||||||
</Content>
|
</Content>
|
||||||
</StyledTitleLink>
|
</StyledTitleLink>
|
||||||
{!isTrash && (
|
{listType && !isTrash && (
|
||||||
<FavoriteTag
|
<FavoriteTag
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
helper.setPageMeta(pageMeta.id, {
|
helper.setPageMeta(pageMeta.id, {
|
||||||
|
|||||||
@@ -20,12 +20,14 @@ import {
|
|||||||
export type BlockSuiteEditorHeaderProps = React.PropsWithChildren<{
|
export type BlockSuiteEditorHeaderProps = React.PropsWithChildren<{
|
||||||
blockSuiteWorkspace: BlockSuiteWorkspace;
|
blockSuiteWorkspace: BlockSuiteWorkspace;
|
||||||
pageId: string;
|
pageId: string;
|
||||||
|
isPublic?: boolean;
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
export const BlockSuiteEditorHeader: React.FC<BlockSuiteEditorHeaderProps> = ({
|
export const BlockSuiteEditorHeader: React.FC<BlockSuiteEditorHeaderProps> = ({
|
||||||
blockSuiteWorkspace,
|
blockSuiteWorkspace,
|
||||||
pageId,
|
pageId,
|
||||||
children,
|
children,
|
||||||
|
isPublic,
|
||||||
}) => {
|
}) => {
|
||||||
const page = blockSuiteWorkspace.getPage(pageId);
|
const page = blockSuiteWorkspace.getPage(pageId);
|
||||||
// fixme(himself65): remove this atom and move it to props
|
// fixme(himself65): remove this atom and move it to props
|
||||||
@@ -43,7 +45,10 @@ export const BlockSuiteEditorHeader: React.FC<BlockSuiteEditorHeaderProps> = ({
|
|||||||
return (
|
return (
|
||||||
<Header
|
<Header
|
||||||
rightItems={
|
rightItems={
|
||||||
isTrash
|
// fixme(himself65): other right items not supported in public mode
|
||||||
|
isPublic
|
||||||
|
? ['themeModeSwitch']
|
||||||
|
: isTrash
|
||||||
? ['trashButtonGroup']
|
? ['trashButtonGroup']
|
||||||
: ['syncUser', 'themeModeSwitch', 'editorOptionMenu']
|
: ['syncUser', 'themeModeSwitch', 'editorOptionMenu']
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { PageNotFoundError } from './affine/affine-error-eoundary';
|
|||||||
import { BlockSuiteEditorHeader } from './blocksuite/header';
|
import { BlockSuiteEditorHeader } from './blocksuite/header';
|
||||||
|
|
||||||
export type PageDetailEditorProps = {
|
export type PageDetailEditorProps = {
|
||||||
|
isPublic?: boolean;
|
||||||
blockSuiteWorkspace: BlockSuiteWorkspace;
|
blockSuiteWorkspace: BlockSuiteWorkspace;
|
||||||
pageId: string;
|
pageId: string;
|
||||||
onInit?: (page: Page, editor: Readonly<EditorContainer>) => void;
|
onInit?: (page: Page, editor: Readonly<EditorContainer>) => void;
|
||||||
@@ -32,6 +33,7 @@ export const PageDetailEditor: React.FC<PageDetailEditorProps> = ({
|
|||||||
onInit,
|
onInit,
|
||||||
onLoad,
|
onLoad,
|
||||||
header,
|
header,
|
||||||
|
isPublic,
|
||||||
}) => {
|
}) => {
|
||||||
const page = blockSuiteWorkspace.getPage(pageId);
|
const page = blockSuiteWorkspace.getPage(pageId);
|
||||||
if (!page) {
|
if (!page) {
|
||||||
@@ -48,6 +50,7 @@ export const PageDetailEditor: React.FC<PageDetailEditorProps> = ({
|
|||||||
<title>{title}</title>
|
<title>{title}</title>
|
||||||
</Helmet>
|
</Helmet>
|
||||||
<BlockSuiteEditorHeader
|
<BlockSuiteEditorHeader
|
||||||
|
isPublic={isPublic}
|
||||||
blockSuiteWorkspace={blockSuiteWorkspace}
|
blockSuiteWorkspace={blockSuiteWorkspace}
|
||||||
pageId={pageId}
|
pageId={pageId}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { UNTITLED_WORKSPACE_NAME } from '@affine/env';
|
import { UNTITLED_WORKSPACE_NAME } from '@affine/env';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import { useBlockSuiteWorkspaceBlobUrl } from '../../../hooks/use-blocksuite-workspace-blob-url';
|
import { useBlockSuiteWorkspaceAvatarUrl } from '../../../hooks/use-blocksuite-workspace-avatar-url';
|
||||||
import { BlockSuiteWorkspace, RemWorkspace } from '../../../shared';
|
import { BlockSuiteWorkspace, RemWorkspace } from '../../../shared';
|
||||||
import { stringToColour } from '../../../utils';
|
import { stringToColour } from '../../../utils';
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ export const BlockSuiteWorkspaceAvatar: React.FC<BlockSuiteWorkspaceAvatar> = ({
|
|||||||
style,
|
style,
|
||||||
...props
|
...props
|
||||||
}) => {
|
}) => {
|
||||||
const [avatar] = useBlockSuiteWorkspaceBlobUrl(workspace);
|
const [avatar] = useBlockSuiteWorkspaceAvatarUrl(workspace);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Avatar
|
<Avatar
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import useSWR from 'swr';
|
|||||||
import { QueryKey } from '../plugins/affine/fetcher';
|
import { QueryKey } from '../plugins/affine/fetcher';
|
||||||
import { BlockSuiteWorkspace } from '../shared';
|
import { BlockSuiteWorkspace } from '../shared';
|
||||||
|
|
||||||
export function useBlockSuiteWorkspaceBlobUrl(
|
export function useBlockSuiteWorkspaceAvatarUrl(
|
||||||
// todo: remove `null` from type
|
// todo: remove `null` from type
|
||||||
blockSuiteWorkspace: BlockSuiteWorkspace | null
|
blockSuiteWorkspace: BlockSuiteWorkspace | null
|
||||||
) {
|
) {
|
||||||
@@ -1,19 +1,25 @@
|
|||||||
import { ListSkeleton } from '@affine/component';
|
import { Breadcrumbs, IconButton, ListSkeleton } from '@affine/component';
|
||||||
|
import { SearchIcon } from '@blocksuite/icons';
|
||||||
|
import { Box } from '@mui/material';
|
||||||
import { useAtomValue, useSetAtom } from 'jotai';
|
import { useAtomValue, useSetAtom } from 'jotai';
|
||||||
import dynamic from 'next/dynamic';
|
import dynamic from 'next/dynamic';
|
||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
import React, { Suspense, useCallback, useEffect } from 'react';
|
import React, { Suspense, useCallback, useEffect } from 'react';
|
||||||
|
|
||||||
import { currentWorkspaceIdAtom } from '../../atoms';
|
import { currentWorkspaceIdAtom, openQuickSearchModalAtom } from '../../atoms';
|
||||||
import {
|
import {
|
||||||
publicBlockSuiteAtom,
|
publicBlockSuiteAtom,
|
||||||
publicWorkspaceIdAtom,
|
publicWorkspaceIdAtom,
|
||||||
} from '../../atoms/public-workspace';
|
} from '../../atoms/public-workspace';
|
||||||
import { QueryParamError } from '../../components/affine/affine-error-eoundary';
|
import { QueryParamError } from '../../components/affine/affine-error-eoundary';
|
||||||
import { StyledTableContainer } from '../../components/blocksuite/block-suite-page-list/page-list/styles';
|
import { StyledTableContainer } from '../../components/blocksuite/block-suite-page-list/page-list/styles';
|
||||||
|
import { WorkspaceAvatar } from '../../components/pure/footer';
|
||||||
import { PageLoading } from '../../components/pure/loading';
|
import { PageLoading } from '../../components/pure/loading';
|
||||||
|
import { useBlockSuiteWorkspaceAvatarUrl } from '../../hooks/use-blocksuite-workspace-avatar-url';
|
||||||
|
import { useBlockSuiteWorkspaceName } from '../../hooks/use-blocksuite-workspace-name';
|
||||||
import { WorkspaceLayout } from '../../layouts';
|
import { WorkspaceLayout } from '../../layouts';
|
||||||
import { NextPageWithLayout } from '../../shared';
|
import { NextPageWithLayout } from '../../shared';
|
||||||
|
import { NavContainer, StyledBreadcrumbs } from './[workspaceId]/[pageId]';
|
||||||
|
|
||||||
const BlockSuitePublicPageList = dynamic(
|
const BlockSuitePublicPageList = dynamic(
|
||||||
async () =>
|
async () =>
|
||||||
@@ -38,14 +44,43 @@ const ListPageInner: React.FC<{
|
|||||||
},
|
},
|
||||||
[router, workspaceId]
|
[router, workspaceId]
|
||||||
);
|
);
|
||||||
|
useEffect(() => {
|
||||||
|
blockSuiteWorkspace.awarenessStore.setFlag('enable_block_hub', false);
|
||||||
|
}, [blockSuiteWorkspace]);
|
||||||
|
const [name] = useBlockSuiteWorkspaceName(blockSuiteWorkspace);
|
||||||
|
const [avatar] = useBlockSuiteWorkspaceAvatarUrl(blockSuiteWorkspace);
|
||||||
|
const setSearchModalOpen = useSetAtom(openQuickSearchModalAtom);
|
||||||
|
const handleOpen = useCallback(() => {
|
||||||
|
setSearchModalOpen(true);
|
||||||
|
}, [setSearchModalOpen]);
|
||||||
if (!blockSuiteWorkspace) {
|
if (!blockSuiteWorkspace) {
|
||||||
return <PageLoading />;
|
return <PageLoading />;
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<BlockSuitePublicPageList
|
<>
|
||||||
onOpenPage={handleClickPage}
|
<NavContainer>
|
||||||
blockSuiteWorkspace={blockSuiteWorkspace}
|
<Breadcrumbs>
|
||||||
/>
|
<StyledBreadcrumbs
|
||||||
|
href={`/public-workspace/${blockSuiteWorkspace.room}`}
|
||||||
|
>
|
||||||
|
<WorkspaceAvatar size={24} name={name} avatar={avatar} />
|
||||||
|
<span>{name}</span>
|
||||||
|
</StyledBreadcrumbs>
|
||||||
|
</Breadcrumbs>
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
flex: 1,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<IconButton onClick={handleOpen}>
|
||||||
|
<SearchIcon />
|
||||||
|
</IconButton>
|
||||||
|
</NavContainer>
|
||||||
|
<BlockSuitePublicPageList
|
||||||
|
onOpenPage={handleClickPage}
|
||||||
|
blockSuiteWorkspace={blockSuiteWorkspace}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ import { QueryParamError } from '../../../components/affine/affine-error-eoundar
|
|||||||
import { PageDetailEditor } from '../../../components/page-detail-editor';
|
import { PageDetailEditor } from '../../../components/page-detail-editor';
|
||||||
import { WorkspaceAvatar } from '../../../components/pure/footer';
|
import { WorkspaceAvatar } from '../../../components/pure/footer';
|
||||||
import { PageLoading } from '../../../components/pure/loading';
|
import { PageLoading } from '../../../components/pure/loading';
|
||||||
|
import { useBlockSuiteWorkspaceAvatarUrl } from '../../../hooks/use-blocksuite-workspace-avatar-url';
|
||||||
|
import { useBlockSuiteWorkspaceName } from '../../../hooks/use-blocksuite-workspace-name';
|
||||||
import { WorkspaceLayout } from '../../../layouts';
|
import { WorkspaceLayout } from '../../../layouts';
|
||||||
import { NextPageWithLayout } from '../../../shared';
|
import { NextPageWithLayout } from '../../../shared';
|
||||||
|
|
||||||
@@ -67,12 +69,17 @@ const PublicWorkspaceDetailPageInner: React.FC<{
|
|||||||
if (!blockSuiteWorkspace) {
|
if (!blockSuiteWorkspace) {
|
||||||
throw new Error('cannot find workspace');
|
throw new Error('cannot find workspace');
|
||||||
}
|
}
|
||||||
|
useEffect(() => {
|
||||||
|
blockSuiteWorkspace.awarenessStore.setFlag('enable_block_hub', false);
|
||||||
|
}, [blockSuiteWorkspace]);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const name = blockSuiteWorkspace.meta.name;
|
const [name] = useBlockSuiteWorkspaceName(blockSuiteWorkspace);
|
||||||
|
const [avatar] = useBlockSuiteWorkspaceAvatarUrl(blockSuiteWorkspace);
|
||||||
const pageTitle = blockSuiteWorkspace.meta.getPageMeta(pageId)?.title;
|
const pageTitle = blockSuiteWorkspace.meta.getPageMeta(pageId)?.title;
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageDetailEditor
|
<PageDetailEditor
|
||||||
|
isPublic={true}
|
||||||
pageId={pageId}
|
pageId={pageId}
|
||||||
blockSuiteWorkspace={blockSuiteWorkspace}
|
blockSuiteWorkspace={blockSuiteWorkspace}
|
||||||
onLoad={(_, editor) => {
|
onLoad={(_, editor) => {
|
||||||
@@ -90,11 +97,7 @@ const PublicWorkspaceDetailPageInner: React.FC<{
|
|||||||
<StyledBreadcrumbs
|
<StyledBreadcrumbs
|
||||||
href={`/public-workspace/${blockSuiteWorkspace.room}`}
|
href={`/public-workspace/${blockSuiteWorkspace.room}`}
|
||||||
>
|
>
|
||||||
<WorkspaceAvatar
|
<WorkspaceAvatar size={24} name={name} avatar={avatar} />
|
||||||
size={24}
|
|
||||||
name={name}
|
|
||||||
avatar={blockSuiteWorkspace.meta.avatar}
|
|
||||||
/>
|
|
||||||
<span>{name}</span>
|
<span>{name}</span>
|
||||||
</StyledBreadcrumbs>
|
</StyledBreadcrumbs>
|
||||||
<StyledBreadcrumbs
|
<StyledBreadcrumbs
|
||||||
|
|||||||
Reference in New Issue
Block a user