From 2665d0c5cd79855d98ff773a426797c5cbc1d41a Mon Sep 17 00:00:00 2001 From: alt0 Date: Thu, 22 Dec 2022 23:19:53 +0800 Subject: [PATCH] fix: switch workspace --- .../src/components/workspace-layout/index.tsx | 33 +++-------------- packages/app/src/hooks/use-init-workspace.ts | 35 +++++++++++++++++++ .../pages/workspace/[workspaceId]/index.tsx | 11 ++---- packages/app/src/pages/workspace/index.tsx | 19 +++++----- 4 files changed, 51 insertions(+), 47 deletions(-) create mode 100644 packages/app/src/hooks/use-init-workspace.ts diff --git a/packages/app/src/components/workspace-layout/index.tsx b/packages/app/src/components/workspace-layout/index.tsx index 62dacdbf80..46aa3701e7 100644 --- a/packages/app/src/components/workspace-layout/index.tsx +++ b/packages/app/src/components/workspace-layout/index.tsx @@ -2,38 +2,15 @@ import HelpIsland from '@/components/help-island'; import { WorkSpaceSliderBar } from '@/components/workspace-slider-bar'; import { useRouter } from 'next/router'; import { StyledPage, StyledWrapper } from './styles'; -import { PropsWithChildren, useEffect, useState } from 'react'; +import { PropsWithChildren } from 'react'; import { useAppState } from '@/providers/app-state-provider'; +import { useInitWorkspace } from '@/hooks/use-init-workspace'; export const WorkspaceDefender = ({ children }: PropsWithChildren) => { - const router = useRouter(); - const [workspaceLoaded, setWorkspaceLoaded] = useState(false); - const { synced, loadWorkspace, workspacesMeta } = useAppState(); + const { synced } = useAppState(); + const { loading } = useInitWorkspace(!synced); - useEffect(() => { - const initWorkspace = async () => { - const workspaceId = - (router.query.workspaceId as string) || - workspacesMeta?.[0]?.id || - new Date().getTime().toString(); - - await loadWorkspace(workspaceId); - setWorkspaceLoaded(true); - }; - if (!synced) { - return; - } - - initWorkspace(); - }, [ - loadWorkspace, - router.pathname, - router.query.workspaceId, - synced, - workspaceLoaded, - workspacesMeta, - ]); - return <>{workspaceLoaded ? children : null}; + return <>{!loading ? children : null}; }; export const WorkspaceLayout = ({ children }: PropsWithChildren) => { diff --git a/packages/app/src/hooks/use-init-workspace.ts b/packages/app/src/hooks/use-init-workspace.ts new file mode 100644 index 0000000000..a05e9e7d02 --- /dev/null +++ b/packages/app/src/hooks/use-init-workspace.ts @@ -0,0 +1,35 @@ +import { useRouter } from 'next/router'; +import { useAppState } from '@/providers/app-state-provider/context'; +import { useEffect, useState } from 'react'; + +export const useInitWorkspace = (disabled?: boolean) => { + const [loading, setLoading] = useState(true); + const router = useRouter(); + const { + workspacesMeta, + loadWorkspace, + currentWorkspace, + currentWorkspaceId, + } = useAppState(); + const workspaceId = + (router.query.workspaceId as string) || + workspacesMeta?.[0]?.id || + new Date().getTime().toString(); + + useEffect(() => { + if (disabled) { + setLoading(false); + return; + } + setLoading(true); + loadWorkspace(workspaceId).finally(() => { + setLoading(false); + }); + }, [workspaceId, disabled]); + + return { + workspaceId, + workspace: workspaceId === currentWorkspaceId ? currentWorkspace : null, + loading, + }; +}; diff --git a/packages/app/src/pages/workspace/[workspaceId]/index.tsx b/packages/app/src/pages/workspace/[workspaceId]/index.tsx index 6c356d23fc..b326e2d703 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/index.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/index.tsx @@ -1,13 +1,12 @@ -import React, { ReactElement, useEffect } from 'react'; +import { useEffect } from 'react'; import { useRouter } from 'next/router'; import { useAppState } from '@/providers/app-state-provider/context'; -import { useLoadWorkspace } from '@/providers/app-state-provider/hooks'; -import WorkspaceLayout from '@/components/workspace-layout'; +import { useInitWorkspace } from '@/hooks/use-init-workspace'; const WorkspaceIndex = () => { const router = useRouter(); - const workspace = useLoadWorkspace(); const { createPage, currentWorkspaceId } = useAppState(); + const { workspace } = useInitWorkspace(); useEffect(() => { const initPage = async () => { @@ -29,8 +28,4 @@ const WorkspaceIndex = () => { return <>; }; -WorkspaceIndex.getLayout = function getLayout(page: ReactElement) { - return {page}; -}; - export default WorkspaceIndex; diff --git a/packages/app/src/pages/workspace/index.tsx b/packages/app/src/pages/workspace/index.tsx index 0f1688d1de..c9c5886a7f 100644 --- a/packages/app/src/pages/workspace/index.tsx +++ b/packages/app/src/pages/workspace/index.tsx @@ -1,21 +1,18 @@ -import React, { ReactElement, useEffect } from 'react'; -import WorkspaceLayout from '@/components/workspace-layout'; -import { useAppState } from '@/providers/app-state-provider'; +import { useEffect } from 'react'; import { useRouter } from 'next/router'; +import { useInitWorkspace } from '@/hooks/use-init-workspace'; export const WorkspaceIndex = () => { const router = useRouter(); - const { currentWorkspaceId } = useAppState(); + const { workspaceId, workspace } = useInitWorkspace(); + useEffect(() => { - if (currentWorkspaceId) { - router.replace(`/workspace/${currentWorkspaceId}`); + if (workspace) { + router.push(`/workspace/${workspaceId}`); } - }, [currentWorkspaceId, router]); + }, [workspace, workspaceId]); + return <>; }; -WorkspaceIndex.getLayout = function getLayout(page: ReactElement) { - return {page}; -}; - export default WorkspaceIndex;