fix: public workspace loading (#1144)

This commit is contained in:
Himself65
2023-02-20 20:32:32 -06:00
committed by GitHub
parent 8c492d2a83
commit ed4d1e8bcd
8 changed files with 58 additions and 97 deletions

View File

@@ -1,36 +0,0 @@
import { WorkspaceUnit } from '@affine/datacenter';
import { dataCenterPromise } from '@affine/store';
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
export function useLoadPublicWorkspace(workspaceId: string) {
const router = useRouter();
const [workspace, setWorkspace] = useState<WorkspaceUnit | null>();
const [status, setStatus] = useState<'loading' | 'error' | 'success'>(
'loading'
);
useEffect(() => {
setStatus('loading');
const init = async () => {
const dataCenter = await dataCenterPromise;
dataCenter
.loadPublicWorkspace(workspaceId)
.then(data => {
setWorkspace(data);
setStatus('success');
})
.catch(() => {
// if (!cancel) {
// router.push('/404');
// }
setStatus('error');
});
};
init();
}, [router, workspaceId]);
return { status, workspace };
}

View File

@@ -7,15 +7,13 @@ import '@affine/i18n';
import { useTranslation } from '@affine/i18n';
import { DataCenterPreloader } from '@affine/store';
import { NoSsr } from '@mui/material';
import { Logger } from '@toeverything/pathfinder-logger';
import type { NextPage } from 'next';
import type { AppProps } from 'next/app';
import Head from 'next/head';
// import AppStateProvider2 from '@/providers/app-state-provider2/provider';
import { useRouter } from 'next/router';
import type { PropsWithChildren, ReactElement, ReactNode } from 'react';
import { Suspense, useEffect } from 'react';
import type { ReactElement, ReactNode } from 'react';
import { Suspense } from 'react';
import React from 'react';
import { PageLoading } from '@/components/loading';
@@ -37,16 +35,9 @@ type AppPropsWithLayout = AppProps & {
Component: NextPageWithLayout;
};
// Page list which do not rely on app state
const NoNeedAppStatePageList = [
'/404',
'/public-workspace/[workspaceId]',
'/public-workspace/[workspaceId]/[pageId]',
];
const App = ({ Component, pageProps }: AppPropsWithLayout) => {
const getLayout = Component.getLayout || (page => page);
const { i18n } = useTranslation();
const router = useRouter();
React.useEffect(() => {
document.documentElement.lang = i18n.language;
@@ -73,35 +64,16 @@ const App = ({ Component, pageProps }: AppPropsWithLayout) => {
<ConfirmProvider key="ConfirmProvider" />,
]}
>
<NoSsr>
{NoNeedAppStatePageList.includes(router.route) ? (
getLayout(<Component {...pageProps} />)
) : (
<Suspense fallback={<PageLoading />}>
<DataCenterPreloader>
<MessageCenterHandler>
<AppDefender>
{getLayout(<Component {...pageProps} />)}
</AppDefender>
</MessageCenterHandler>
</DataCenterPreloader>
</Suspense>
)}
</NoSsr>
<Suspense fallback={<PageLoading />}>
<DataCenterPreloader>
<MessageCenterHandler>
{getLayout(<Component {...pageProps} />)}
</MessageCenterHandler>
</DataCenterPreloader>
</Suspense>
</ProviderComposer>
</>
);
};
const AppDefender = ({ children }: PropsWithChildren) => {
const router = useRouter();
useEffect(() => {
if (['/index.html', '/'].includes(router.asPath)) {
router.replace('/workspace');
}
}, [router]);
return <>{children}</>;
};
export default App;

View File

@@ -1,7 +1,15 @@
import type { NextPage } from 'next';
import { useRouter } from 'next/router';
import { useEffect } from 'react';
import { PageLoading } from '@/components/loading';
const Home: NextPage = () => {
return <div title="Home Page"></div>;
const router = useRouter();
useEffect(() => {
router.replace('/workspace');
}, [router]);
return <PageLoading />;
};
export default Home;

View File

@@ -2,6 +2,7 @@ import { displayFlex, styled } from '@affine/component';
import { Breadcrumbs } from '@affine/component';
import { IconButton } from '@affine/component';
import { useTranslation } from '@affine/i18n';
import { useDataCenterPublicWorkspace } from '@affine/store';
import { PaperIcon, SearchIcon } from '@blocksuite/icons';
import dynamic from 'next/dynamic';
import NextLink from 'next/link';
@@ -10,7 +11,6 @@ import { ReactElement, useEffect, useMemo } from 'react';
import { PageLoading } from '@/components/loading';
import { WorkspaceUnitAvatar } from '@/components/workspace-avatar';
import { useLoadPublicWorkspace } from '@/hooks/use-load-public-workspace';
import { useModal } from '@/store/globalModal';
import type { NextPageWithLayout } from '../..//_app';
@@ -21,13 +21,17 @@ const DynamicBlocksuite = dynamic(() => import('@/components/editor'), {
const Page: NextPageWithLayout = () => {
const router = useRouter();
const { workspaceId, pageId } = router.query as Record<string, string>;
const { status, workspace: workspaceUnit } =
useLoadPublicWorkspace(workspaceId);
const { workspaceId, pageId } = router.query;
const { error, workspace: workspaceUnit } = useDataCenterPublicWorkspace(
typeof workspaceId === 'string' ? workspaceId : null
);
const { triggerQuickSearchModal } = useModal();
const { t } = useTranslation();
const page = useMemo(() => {
if (typeof pageId !== 'string') {
return null;
}
if (workspaceUnit?.blocksuiteWorkspace) {
return workspaceUnit.blocksuiteWorkspace.getPage(pageId);
}
@@ -46,18 +50,15 @@ const Page: NextPageWithLayout = () => {
}, [workspace, router, pageId]);
useEffect(() => {
if (status === 'error') {
if (error) {
router.push('/404');
}
}, [router, status]);
}, [router, error]);
if (status === 'loading') {
if (!workspace) {
return <PageLoading />;
}
if (status === 'error') {
return null;
}
return (
<PageContainer>
<NavContainer>
@@ -86,7 +87,7 @@ const Page: NextPageWithLayout = () => {
</SearchButton>
</NavContainer>
{workspace && page && (
{page && (
<DynamicBlocksuite
page={page}
workspace={workspace}

View File

@@ -1,5 +1,5 @@
import { Breadcrumbs } from '@affine/component';
import { PageMeta } from '@affine/store';
import { PageMeta, useDataCenterPublicWorkspace } from '@affine/store';
import { SearchIcon } from '@blocksuite/icons';
import { useRouter } from 'next/router';
import { ReactElement, useEffect, useMemo } from 'react';
@@ -7,7 +7,6 @@ import { ReactElement, useEffect, useMemo } from 'react';
import { PageLoading } from '@/components/loading';
import { PageList } from '@/components/page-list';
import { WorkspaceUnitAvatar } from '@/components/workspace-avatar';
import { useLoadPublicWorkspace } from '@/hooks/use-load-public-workspace';
import { useModal } from '@/store/globalModal';
import {
@@ -20,8 +19,10 @@ import {
const All = () => {
const router = useRouter();
const { triggerQuickSearchModal } = useModal();
const { status, workspace } = useLoadPublicWorkspace(
router.query.workspaceId as string
const { workspace, error } = useDataCenterPublicWorkspace(
typeof router.query.workspaceId === 'string'
? router.query.workspaceId
: null
);
const pageList = useMemo(() => {
@@ -31,19 +32,15 @@ const All = () => {
const workspaceName = workspace?.blocksuiteWorkspace?.meta.name;
useEffect(() => {
if (status === 'error') {
if (error) {
router.push('/404');
}
}, [router, status]);
}, [router, error]);
if (status === 'loading') {
if (!workspace) {
return <PageLoading />;
}
if (status === 'error') {
return null;
}
return (
<PageContainer>
<NavContainer>