fix: should show workspace avatar using blob url (#949)

This commit is contained in:
Peng Xiao
2023-02-13 17:43:44 +08:00
committed by GitHub
parent 98ceb082fc
commit 298f2c1feb
3 changed files with 91 additions and 69 deletions

View File

@@ -0,0 +1,31 @@
import { useAppState } from '@/providers/app-state-provider';
import { WorkspaceUnit } from '@affine/datacenter';
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
export function usePublicWorkspace(workspaceId: string) {
const { dataCenter } = useAppState();
const router = useRouter();
const [workspace, setWorkspace] = useState<WorkspaceUnit>();
useEffect(() => {
let cancel = false;
dataCenter
.loadPublicWorkspace(workspaceId)
.then(data => {
if (!cancel) {
setWorkspace(data);
}
})
.catch(() => {
if (!cancel) {
router.push('/404');
}
});
return () => {
cancel = true;
};
}, [router, workspaceId, dataCenter]);
return workspace;
}

View File

@@ -1,10 +1,8 @@
import { ReactElement, useEffect, useState } from 'react';
import { useAppState } from '@/providers/app-state-provider';
import { ReactElement, useEffect, useMemo, useState } from 'react';
import type { NextPageWithLayout } from '../..//_app';
import { displayFlex, styled } from '@affine/component';
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 '@affine/component';
import { IconButton } from '@affine/component';
@@ -12,64 +10,58 @@ import NextLink from 'next/link';
import { PaperIcon, SearchIcon } from '@blocksuite/icons';
import { WorkspaceUnitAvatar } from '@/components/workspace-avatar';
import { useModal } from '@/store/globalModal';
import { usePublicWorkspace } from '@/hooks/use-public-workspace';
import { useTranslation } from '@affine/i18n';
const DynamicBlocksuite = dynamic(() => import('@/components/editor'), {
ssr: false,
});
const Page: NextPageWithLayout = () => {
const [workspace, setWorkspace] = useState<Workspace>();
const [page, setPage] = useState<PageStore>();
const { dataCenter } = useAppState();
const router = useRouter();
const { workspaceId, pageId } = router.query as Record<string, string>;
const workspaceUnit = usePublicWorkspace(workspaceId);
const [loaded, setLoaded] = useState(false);
const [workspaceName, setWorkspaceName] = useState('');
const [pageTitle, setPageTitle] = useState('');
const { triggerQuickSearchModal } = useModal();
const { t } = useTranslation();
const page = useMemo(() => {
if (workspaceUnit?.blocksuiteWorkspace) {
return workspaceUnit.blocksuiteWorkspace.getPage(pageId);
}
return null;
}, [workspaceUnit, pageId]);
const workspace = workspaceUnit?.blocksuiteWorkspace;
const pageTitle = page?.meta.title;
const workspaceName = workspace?.meta.name;
useEffect(() => {
dataCenter
.loadPublicWorkspace(router.query.workspaceId as string)
.then(data => {
setWorkspaceName(data.blocksuiteWorkspace?.meta.name as string);
if (data.blocksuiteWorkspace) {
setWorkspace(data.blocksuiteWorkspace);
if (
router.query.pageId &&
data.blocksuiteWorkspace.meta.pageMetas.find(
p => p.id === router.query.pageId
)
) {
const page = data.blocksuiteWorkspace.getPage(
router.query.pageId as string
);
page && setPageTitle(page.meta.title);
page && setPage(page);
} else {
router.push('/404');
}
}
})
.catch(() => {
router.push('/404');
});
}, [router, dataCenter]);
const pageNotFound = workspace?.meta.pageMetas.every(p => p.id !== pageId);
if (workspace && pageNotFound) {
router.push('/404');
}
}, [workspace, router, pageId]);
return (
<>
{!loaded && <PageLoading />}
<PageContainer>
<NavContainer>
<Breadcrumbs>
<StyledBreadcrumbs
href={`/public-workspace/${router.query.workspaceId}`}
>
<WorkspaceUnitAvatar size={24} name={workspaceName} />
<StyledBreadcrumbs href={`/public-workspace/${workspaceId}`}>
<WorkspaceUnitAvatar
size={24}
name={workspaceName}
workspaceUnit={workspaceUnit}
/>
<span>{workspaceName}</span>
</StyledBreadcrumbs>
<StyledBreadcrumbs
href={`/public-workspace/${router.query.workspaceId}/${router.query.pageId}`}
href={`/public-workspace/${workspaceId}/${pageId}`}
>
<PaperIcon fontSize={24} />
<span>{pageTitle ? pageTitle : 'Untitled'}</span>
<span>{pageTitle ? pageTitle : t('Untitled')}</span>
</StyledBreadcrumbs>
</Breadcrumbs>
<SearchButton

View File

@@ -1,35 +1,30 @@
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,
NavContainer,
StyledBreadcrumbs,
SearchButton,
} from './[pageId]';
import { Breadcrumbs } from '@affine/component';
import { WorkspaceUnitAvatar } from '@/components/workspace-avatar';
import { SearchIcon } from '@blocksuite/icons';
import { usePublicWorkspace } from '@/hooks/use-public-workspace';
import { PageMeta } from '@/providers/app-state-provider';
import { useModal } from '@/store/globalModal';
const All = () => {
const { dataCenter } = useAppState();
const router = useRouter();
const [pageList, setPageList] = useState<PageMeta[]>([]);
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');
});
}, [router, dataCenter]);
import { Breadcrumbs } from '@affine/component';
import { SearchIcon } from '@blocksuite/icons';
import { useRouter } from 'next/router';
import { ReactElement, useMemo } from 'react';
import {
NavContainer,
PageContainer,
SearchButton,
StyledBreadcrumbs,
} from './[pageId]';
const All = () => {
const router = useRouter();
const { triggerQuickSearchModal } = useModal();
const workspaceUnit = usePublicWorkspace(router.query.workspaceId as string);
const pageList = useMemo(() => {
return (workspaceUnit?.blocksuiteWorkspace?.meta.pageMetas ??
[]) as PageMeta[];
}, [workspaceUnit]);
const workspaceName = workspaceUnit?.blocksuiteWorkspace?.meta.name;
return (
<PageContainer>
<NavContainer>
@@ -37,7 +32,11 @@ const All = () => {
<StyledBreadcrumbs
href={`/public-workspace/${router.query.workspaceId}`}
>
<WorkspaceUnitAvatar size={24} name={workspaceName} />
<WorkspaceUnitAvatar
size={24}
name={workspaceName}
workspaceUnit={workspaceUnit}
/>
<span>{workspaceName}</span>
</StyledBreadcrumbs>
</Breadcrumbs>