diff --git a/apps/web/src/pages/workspace/[workspaceId]/[pageId].tsx b/apps/web/src/pages/workspace/[workspaceId]/[pageId].tsx index 7c04823a6..4cfe46f25 100644 --- a/apps/web/src/pages/workspace/[workspaceId]/[pageId].tsx +++ b/apps/web/src/pages/workspace/[workspaceId]/[pageId].tsx @@ -11,6 +11,7 @@ import Head from 'next/head'; import { useTranslation } from '@affine/i18n'; import { useGlobalState } from '@/store/app'; import exampleMarkdown from '@/templates/Welcome-to-AFFiNE-Alpha-Downhills.md'; +import { assertEquals } from '@blocksuite/store'; const DynamicBlocksuite = dynamic(() => import('@/components/editor'), { ssr: false, @@ -20,7 +21,14 @@ const BlockHubAppender = () => { const setBlockHub = useGlobalState(store => store.setBlockHub); const editor = useGlobalState(store => store.editor); useEffect(() => { + // todo(himself65): refactor with `useRef` + const abortController = new AbortController(); let blockHubElement: HTMLElement | null = null; + abortController.signal.addEventListener('abort', () => { + blockHubElement?.remove(); + const toolWrapper = document.querySelector('#toolWrapper'); + assertEquals(toolWrapper?.childNodes.length, 0); + }); editor?.createBlockHub().then(blockHub => { const toolWrapper = document.querySelector('#toolWrapper'); @@ -28,12 +36,15 @@ const BlockHubAppender = () => { // In an invitation page there is no toolWrapper, which contains helper icon and blockHub icon return; } + if (abortController.signal.aborted) { + return; + } blockHubElement = blockHub; setBlockHub(blockHub); toolWrapper.appendChild(blockHub); }); return () => { - blockHubElement?.remove(); + abortController.abort(); }; }, [editor, setBlockHub]); return null; @@ -73,7 +84,7 @@ const Page: NextPageWithLayout = () => { : undefined } /> - + )}