diff --git a/apps/core/src/adapters/local/index.tsx b/apps/core/src/adapters/local/index.tsx index eb69e2a0ee..5907c2c868 100644 --- a/apps/core/src/adapters/local/index.tsx +++ b/apps/core/src/adapters/local/index.tsx @@ -19,10 +19,11 @@ import { globalBlockSuiteSchema, } from '@affine/workspace/manager'; import { createIndexedDBDownloadProvider } from '@affine/workspace/providers'; -import { useStaticBlockSuiteWorkspace } from '@toeverything/infra/__internal__/react'; +import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; import { getCurrentStore } from '@toeverything/infra/atom'; import { initEmptyPage } from '@toeverything/infra/blocksuite'; import { buildShowcaseWorkspace } from '@toeverything/infra/blocksuite'; +import { useAtomValue } from 'jotai'; import { nanoid } from 'nanoid'; import { useCallback } from 'react'; @@ -87,7 +88,8 @@ export const LocalAdapter: WorkspaceAdapter = { Header: WorkspaceHeader, Provider, PageDetail: ({ currentWorkspaceId, currentPageId, onLoadEditor }) => { - const workspace = useStaticBlockSuiteWorkspace(currentWorkspaceId); + const [workspaceAtom] = getBlockSuiteWorkspaceAtom(currentWorkspaceId); + const workspace = useAtomValue(workspaceAtom); const page = workspace.getPage(currentPageId); if (!page) { throw new PageNotFoundError(workspace, currentPageId); diff --git a/apps/core/src/components/affine/setting-modal/setting-sidebar/index.tsx b/apps/core/src/components/affine/setting-modal/setting-sidebar/index.tsx index 4df47e6abe..2719cab279 100644 --- a/apps/core/src/components/affine/setting-modal/setting-sidebar/index.tsx +++ b/apps/core/src/components/affine/setting-modal/setting-sidebar/index.tsx @@ -11,7 +11,7 @@ import { Avatar } from '@toeverything/components/avatar'; import { Tooltip } from '@toeverything/components/tooltip'; import { useBlockSuiteWorkspaceAvatarUrl } from '@toeverything/hooks/use-block-suite-workspace-avatar-url'; import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name'; -import { useStaticBlockSuiteWorkspace } from '@toeverything/infra/__internal__/react'; +import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; import clsx from 'clsx'; import { useAtom, useAtomValue } from 'jotai/react'; import { type ReactElement, Suspense, useCallback, useMemo } from 'react'; @@ -209,7 +209,8 @@ const WorkspaceListItem = ({ isCurrent: boolean; isActive: boolean; }) => { - const workspace = useStaticBlockSuiteWorkspace(meta.id); + const [workspaceAtom] = getBlockSuiteWorkspaceAtom(meta.id); + const workspace = useAtomValue(workspaceAtom); const [workspaceAvatar] = useBlockSuiteWorkspaceAvatarUrl(workspace); const [workspaceName] = useBlockSuiteWorkspaceName(workspace); diff --git a/apps/core/src/components/affine/setting-modal/workspace-setting/index.tsx b/apps/core/src/components/affine/setting-modal/workspace-setting/index.tsx index 85f49105f8..a96a0b9514 100644 --- a/apps/core/src/components/affine/setting-modal/workspace-setting/index.tsx +++ b/apps/core/src/components/affine/setting-modal/workspace-setting/index.tsx @@ -3,7 +3,6 @@ import { WorkspaceSubPath } from '@affine/env/workspace'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { rootWorkspacesMetadataAtom } from '@affine/workspace/atom'; import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name'; -import { usePassiveWorkspaceEffect } from '@toeverything/infra/__internal__/react'; import { useSetAtom } from 'jotai'; import { useAtomValue } from 'jotai'; import { useCallback } from 'react'; @@ -34,7 +33,6 @@ export const WorkspaceSetting = ({ workspaceId }: { workspaceId: string }) => { const pushNotification = useSetAtom(pushNotificationAtom); const leaveWorkspace = useLeaveWorkspace(); - usePassiveWorkspaceEffect(workspace.blockSuiteWorkspace); const setSettingModal = useSetAtom(openSettingModalAtom); const { deleteWorkspace } = useAppHelper(); diff --git a/apps/core/src/hooks/current/use-current-workspace.ts b/apps/core/src/hooks/current/use-current-workspace.ts index 0d71c7be9c..00a85ef948 100644 --- a/apps/core/src/hooks/current/use-current-workspace.ts +++ b/apps/core/src/hooks/current/use-current-workspace.ts @@ -7,7 +7,7 @@ import { useAtom, useSetAtom } from 'jotai'; import { useCallback, useEffect } from 'react'; import type { AllWorkspace } from '../../shared'; -import { useWorkspace } from '../use-workspace'; +import { useWorkspace, useWorkspaceEffect } from '../use-workspace'; declare global { /** @@ -27,6 +27,8 @@ export function useCurrentWorkspace(): [ const [id, setId] = useAtom(currentWorkspaceIdAtom); assertExists(id); const currentWorkspace = useWorkspace(id); + // when you call current workspace, effect is always called + useWorkspaceEffect(currentWorkspace.id); useEffect(() => { globalThis.currentWorkspace = currentWorkspace; globalThis.dispatchEvent( diff --git a/apps/core/src/hooks/use-workspace.ts b/apps/core/src/hooks/use-workspace.ts index 2d0eeeb637..b8532bd389 100644 --- a/apps/core/src/hooks/use-workspace.ts +++ b/apps/core/src/hooks/use-workspace.ts @@ -2,7 +2,7 @@ import type { AffineOfficialWorkspace } from '@affine/env/workspace'; import { rootWorkspacesMetadataAtom } from '@affine/workspace/atom'; import { assertExists } from '@blocksuite/global/utils'; import type { Workspace } from '@blocksuite/store'; -import { useStaticBlockSuiteWorkspace } from '@toeverything/infra/__internal__/react'; +import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; import type { Atom } from 'jotai'; import { atom, useAtomValue } from 'jotai'; @@ -11,9 +11,18 @@ const workspaceWeakMap = new WeakMap< Atom> >(); +// workspace effect is the side effect like connect to the server/indexeddb, +// this will save the workspace updates permanently. +export function useWorkspaceEffect(workspaceId: string): void { + const [, effectAtom] = getBlockSuiteWorkspaceAtom(workspaceId); + useAtomValue(effectAtom); +} + +// todo(himself65): remove this hook export function useWorkspace(workspaceId: string): AffineOfficialWorkspace { - const blockSuiteWorkspace = useStaticBlockSuiteWorkspace(workspaceId); - if (!workspaceWeakMap.has(blockSuiteWorkspace)) { + const [workspaceAtom] = getBlockSuiteWorkspaceAtom(workspaceId); + const workspace = useAtomValue(workspaceAtom); + if (!workspaceWeakMap.has(workspace)) { const baseAtom = atom(async get => { const metadata = await get(rootWorkspacesMetadataAtom); const flavour = metadata.find(({ id }) => id === workspaceId)?.flavour; @@ -21,15 +30,13 @@ export function useWorkspace(workspaceId: string): AffineOfficialWorkspace { return { id: workspaceId, flavour, - blockSuiteWorkspace, + blockSuiteWorkspace: workspace, }; }); - workspaceWeakMap.set(blockSuiteWorkspace, baseAtom); + workspaceWeakMap.set(workspace, baseAtom); } return useAtomValue( - workspaceWeakMap.get(blockSuiteWorkspace) as Atom< - Promise - > + workspaceWeakMap.get(workspace) as Atom> ); } diff --git a/apps/core/src/layouts/workspace-layout.tsx b/apps/core/src/layouts/workspace-layout.tsx index 00b1d2f72a..15df9f8c29 100644 --- a/apps/core/src/layouts/workspace-layout.tsx +++ b/apps/core/src/layouts/workspace-layout.tsx @@ -28,7 +28,6 @@ import { useSensors, } from '@dnd-kit/core'; import { useBlockSuitePageMeta } from '@toeverything/hooks/use-block-suite-page-meta'; -import { usePassiveWorkspaceEffect } from '@toeverything/infra/__internal__/react'; import { currentWorkspaceIdAtom } from '@toeverything/infra/atom'; import { useAtom, useAtomValue, useSetAtom } from 'jotai'; import { nanoid } from 'nanoid'; @@ -172,8 +171,6 @@ export const WorkspaceLayoutInner = ({ } }, [currentWorkspace.blockSuiteWorkspace.doc]); - usePassiveWorkspaceEffect(currentWorkspace.blockSuiteWorkspace); - const handleCreatePage = useCallback(() => { const id = nanoid(); pageHelper.createPage(id); diff --git a/apps/core/src/pages/workspace/all-page.tsx b/apps/core/src/pages/workspace/all-page.tsx index 982e006186..cc6ef27d0d 100644 --- a/apps/core/src/pages/workspace/all-page.tsx +++ b/apps/core/src/pages/workspace/all-page.tsx @@ -1,7 +1,7 @@ import { useCollectionManager } from '@affine/component/page-list'; import { WorkspaceSubPath } from '@affine/env/workspace'; import { assertExists } from '@blocksuite/global/utils'; -import { getActiveBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; +import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; import { getCurrentStore } from '@toeverything/infra/atom'; import { useCallback } from 'react'; import type { LoaderFunction } from 'react-router-dom'; @@ -16,7 +16,7 @@ export const loader: LoaderFunction = async args => { const rootStore = getCurrentStore(); const workspaceId = args.params.workspaceId; assertExists(workspaceId); - const workspaceAtom = getActiveBlockSuiteWorkspaceAtom(workspaceId); + const [workspaceAtom] = getBlockSuiteWorkspaceAtom(workspaceId); const workspace = await rootStore.get(workspaceAtom); for (const pageId of workspace.pages.keys()) { const page = workspace.getPage(pageId); diff --git a/apps/core/src/pages/workspace/index.tsx b/apps/core/src/pages/workspace/index.tsx index 4f46cfbf32..27109384cc 100644 --- a/apps/core/src/pages/workspace/index.tsx +++ b/apps/core/src/pages/workspace/index.tsx @@ -1,6 +1,6 @@ import { WorkspaceFlavour } from '@affine/env/workspace'; import { rootWorkspacesMetadataAtom } from '@affine/workspace/atom'; -import { getActiveBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; +import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; import { currentPageIdAtom, currentWorkspaceIdAtom, @@ -31,7 +31,7 @@ export const loader: LoaderFunction = async args => { rootStore.set(currentPageIdAtom, null); } if (currentMetadata.flavour === WorkspaceFlavour.AFFINE_CLOUD) { - const workspaceAtom = getActiveBlockSuiteWorkspaceAtom(currentMetadata.id); + const [workspaceAtom] = getBlockSuiteWorkspaceAtom(currentMetadata.id); const workspace = await rootStore.get(workspaceAtom); return (() => { const blockVersions = workspace.meta.blockVersions; diff --git a/packages/component/src/components/card/workspace-card/index.tsx b/packages/component/src/components/card/workspace-card/index.tsx index 779355b2c8..88949055e6 100644 --- a/packages/component/src/components/card/workspace-card/index.tsx +++ b/packages/component/src/components/card/workspace-card/index.tsx @@ -8,7 +8,8 @@ import { Divider } from '@toeverything/components/divider'; import { Tooltip } from '@toeverything/components/tooltip'; import { useBlockSuiteWorkspaceAvatarUrl } from '@toeverything/hooks/use-block-suite-workspace-avatar-url'; import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name'; -import { useStaticBlockSuiteWorkspace } from '@toeverything/infra/__internal__/react'; +import { getBlockSuiteWorkspaceAtom } from '@toeverything/infra/__internal__/workspace'; +import { useAtomValue } from 'jotai/react'; import { useCallback } from 'react'; import { @@ -97,7 +98,8 @@ export const WorkspaceCard = ({ meta, isOwner = true, }: WorkspaceCardProps) => { - const workspace = useStaticBlockSuiteWorkspace(meta.id); + const [workspaceAtom] = getBlockSuiteWorkspaceAtom(meta.id); + const workspace = useAtomValue(workspaceAtom); const [name] = useBlockSuiteWorkspaceName(workspace); const [workspaceAvatar] = useBlockSuiteWorkspaceAvatarUrl(workspace); return ( diff --git a/packages/infra/package.json b/packages/infra/package.json index 2dcf023b37..4a29b62810 100644 --- a/packages/infra/package.json +++ b/packages/infra/package.json @@ -59,6 +59,7 @@ "@blocksuite/global": "0.0.0-20230926212737-6d4b1569-nightly", "@blocksuite/store": "0.0.0-20230926212737-6d4b1569-nightly", "jotai": "^2.4.3", + "jotai-effect": "^0.1.0", "tinykeys": "^2.1.0", "zod": "^3.22.4" }, diff --git a/packages/infra/src/__internal__/react.ts b/packages/infra/src/__internal__/react.ts index 72213cac83..e69de29bb2 100644 --- a/packages/infra/src/__internal__/react.ts +++ b/packages/infra/src/__internal__/react.ts @@ -1,22 +0,0 @@ -import type { Workspace } from '@blocksuite/store'; -import { useAtomValue } from 'jotai/react'; -import { useEffect } from 'react'; - -import { - disablePassiveProviders, - enablePassiveProviders, - getActiveBlockSuiteWorkspaceAtom, -} from './workspace.js'; - -export function useStaticBlockSuiteWorkspace(id: string): Workspace { - return useAtomValue(getActiveBlockSuiteWorkspaceAtom(id)); -} - -export function usePassiveWorkspaceEffect(workspace: Workspace) { - useEffect(() => { - enablePassiveProviders(workspace); - return () => { - disablePassiveProviders(workspace); - }; - }, [workspace]); -} diff --git a/packages/infra/src/__internal__/workspace.ts b/packages/infra/src/__internal__/workspace.ts index 865d2446e1..e788702d84 100644 --- a/packages/infra/src/__internal__/workspace.ts +++ b/packages/infra/src/__internal__/workspace.ts @@ -2,9 +2,9 @@ import type { ActiveDocProvider, Workspace } from '@blocksuite/store'; import type { PassiveDocProvider } from '@blocksuite/store'; import type { Atom } from 'jotai/vanilla'; import { atom } from 'jotai/vanilla'; +import { atomEffect } from 'jotai-effect'; /** - * DO NOT ACCESS THIS MAP IN PRODUCTION, OR YOU WILL BE FIRED * Map: guid -> Workspace */ export const INTERNAL_BLOCKSUITE_HASH_MAP = new Map([]); @@ -14,49 +14,8 @@ const workspaceActiveAtomWeakMap = new WeakMap< Atom> >(); -// Whether the workspace is active to use const workspaceActiveWeakMap = new WeakMap(); - -/** - * Whether the workspace has been enabled the passive effect (background) - * - * @internal - */ -export const workspacePassiveEffectWeakMap = new WeakMap(); - -export function enablePassiveProviders(workspace: Workspace) { - const value = workspacePassiveEffectWeakMap.get(workspace); - if (value !== undefined && value !== 0) { - workspacePassiveEffectWeakMap.set(workspace, value + 1); - return; - } - const providers = workspace.providers.filter( - (provider): provider is PassiveDocProvider => - 'passive' in provider && provider.passive === true - ); - providers.forEach(provider => { - provider.connect(); - }); - workspacePassiveEffectWeakMap.set(workspace, 1); -} - -export function disablePassiveProviders(workspace: Workspace) { - const value = workspacePassiveEffectWeakMap.get(workspace); - if (value && value > 0) { - workspacePassiveEffectWeakMap.set(workspace, value - 1); - if (value - 1 === 0) { - const providers = workspace.providers.filter( - (provider): provider is PassiveDocProvider => - 'passive' in provider && provider.passive === true - ); - providers.forEach(provider => { - provider.disconnect(); - }); - workspacePassiveEffectWeakMap.delete(workspace); - } - return; - } -} +const workspaceEffectAtomWeakMap = new WeakMap>(); export async function waitForWorkspace(workspace: Workspace) { if (workspaceActiveWeakMap.get(workspace) !== true) { @@ -69,6 +28,7 @@ export async function waitForWorkspace(workspace: Workspace) { // we will wait for the necessary providers to be ready await provider.whenReady; } + // timeout is INFINITE workspaceActiveWeakMap.set(workspace, true); } } @@ -80,9 +40,9 @@ export function getWorkspace(id: string) { return INTERNAL_BLOCKSUITE_HASH_MAP.get(id) as Workspace; } -export function getActiveBlockSuiteWorkspaceAtom( +export function getBlockSuiteWorkspaceAtom( id: string -): Atom> { +): [workspaceAtom: Atom>, workspaceEffectAtom: Atom] { if (!INTERNAL_BLOCKSUITE_HASH_MAP.has(id)) { throw new Error('Workspace not found'); } @@ -94,5 +54,26 @@ export function getActiveBlockSuiteWorkspaceAtom( }); workspaceActiveAtomWeakMap.set(workspace, baseAtom); } - return workspaceActiveAtomWeakMap.get(workspace) as Atom>; + if (!workspaceEffectAtomWeakMap.has(workspace)) { + const effectAtom = atomEffect(() => { + const providers = workspace.providers.filter( + (provider): provider is PassiveDocProvider => + 'passive' in provider && provider.passive === true + ); + providers.forEach(provider => { + provider.connect(); + }); + return () => { + providers.forEach(provider => { + provider.disconnect(); + }); + }; + }); + workspaceEffectAtomWeakMap.set(workspace, effectAtom); + } + + return [ + workspaceActiveAtomWeakMap.get(workspace) as Atom>, + workspaceEffectAtomWeakMap.get(workspace) as Atom, + ]; } diff --git a/packages/infra/src/__tests__/use-block-suite-workspace.spec.ts b/packages/infra/src/__tests__/blocksuite-atom.ts similarity index 59% rename from packages/infra/src/__tests__/use-block-suite-workspace.spec.ts rename to packages/infra/src/__tests__/blocksuite-atom.ts index 743a4e5dd7..9644d35b89 100644 --- a/packages/infra/src/__tests__/use-block-suite-workspace.spec.ts +++ b/packages/infra/src/__tests__/blocksuite-atom.ts @@ -2,20 +2,16 @@ * @vitest-environment happy-dom */ import { Schema, Workspace } from '@blocksuite/store'; -import { renderHook } from '@testing-library/react'; +import { waitFor } from '@testing-library/react'; import { getDefaultStore } from 'jotai/vanilla'; import { expect, test, vi } from 'vitest'; import { - usePassiveWorkspaceEffect, - useStaticBlockSuiteWorkspace, -} from '../__internal__/react.js'; -import { - getActiveBlockSuiteWorkspaceAtom, + getBlockSuiteWorkspaceAtom, INTERNAL_BLOCKSUITE_HASH_MAP, } from '../__internal__/workspace.js'; -test('useStaticBlockSuiteWorkspace', async () => { +test('blocksuite atom', async () => { const sync = vi.fn(); let connected = false; const connect = vi.fn(() => (connected = true)); @@ -45,27 +41,15 @@ test('useStaticBlockSuiteWorkspace', async () => { INTERNAL_BLOCKSUITE_HASH_MAP.set('1', workspace); { - const workspaceHook = renderHook(() => useStaticBlockSuiteWorkspace('1')); - // wait for suspense to resolve - await new Promise(resolve => setTimeout(resolve, 100)); - expect(workspaceHook.result.current).toBe(workspace); - expect(sync).toBeCalledTimes(1); - expect(connect).not.toHaveBeenCalled(); - } - - { - const atom = getActiveBlockSuiteWorkspaceAtom('1'); + const [atom, effectAtom] = getBlockSuiteWorkspaceAtom('1'); const store = getDefaultStore(); const result = await store.get(atom); expect(result).toBe(workspace); expect(sync).toBeCalledTimes(1); expect(connect).not.toHaveBeenCalled(); - } - { - renderHook(() => usePassiveWorkspaceEffect(workspace)); - expect(sync).toBeCalledTimes(1); - expect(connect).toBeCalledTimes(1); + store.sub(effectAtom, vi.fn()); + await waitFor(() => expect(connect).toBeCalledTimes(1)); expect(connected).toBe(true); } }); diff --git a/packages/infra/src/__tests__/workspace.spec.ts b/packages/infra/src/__tests__/workspace.spec.ts deleted file mode 100644 index 8bf8406906..0000000000 --- a/packages/infra/src/__tests__/workspace.spec.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { AffineSchemas } from '@blocksuite/blocks/models'; -import type { DocProviderCreator } from '@blocksuite/store'; -import { Schema, Workspace } from '@blocksuite/store'; -import { getDefaultStore } from 'jotai/vanilla'; -import { beforeEach, expect, test } from 'vitest'; - -import { - disablePassiveProviders, - enablePassiveProviders, - getActiveBlockSuiteWorkspaceAtom, - getWorkspace, - INTERNAL_BLOCKSUITE_HASH_MAP, - workspacePassiveEffectWeakMap, -} from '../__internal__/workspace'; - -const schema = new Schema(); - -schema.register(AffineSchemas); - -const activeWorkspaceEnabled = new Set(); -const passiveWorkspaceEnabled = new Set(); - -beforeEach(() => { - activeWorkspaceEnabled.clear(); -}); - -const createWorkspace = (id: string) => { - const activeCreator: DocProviderCreator = () => ({ - flavour: 'active', - active: true, - sync() { - activeWorkspaceEnabled.add(id); - }, - get whenReady(): Promise { - return Promise.resolve(); - }, - }); - const passiveCreator: DocProviderCreator = () => ({ - flavour: 'passive', - passive: true, - connect() { - passiveWorkspaceEnabled.add(id); - }, - disconnect() { - passiveWorkspaceEnabled.delete(id); - }, - get connected() { - return false; - }, - }); - - return new Workspace({ - id, - schema, - providerCreators: [activeCreator, passiveCreator], - }); -}; - -test('workspace passive provider should enable correctly', () => { - INTERNAL_BLOCKSUITE_HASH_MAP.set('1', createWorkspace('1')); - INTERNAL_BLOCKSUITE_HASH_MAP.set('2', createWorkspace('2')); - expect(workspacePassiveEffectWeakMap.get(getWorkspace('1'))).toBe(undefined); - enablePassiveProviders(getWorkspace('1')); - expect(workspacePassiveEffectWeakMap.get(getWorkspace('1'))).toBe(1); - expect(workspacePassiveEffectWeakMap.get(getWorkspace('2'))).toBe(undefined); - enablePassiveProviders(getWorkspace('1')); - expect(workspacePassiveEffectWeakMap.get(getWorkspace('1'))).toBe(2); - disablePassiveProviders(getWorkspace('1')); - expect(workspacePassiveEffectWeakMap.get(getWorkspace('1'))).toBe(1); - disablePassiveProviders(getWorkspace('1')); - expect(workspacePassiveEffectWeakMap.get(getWorkspace('1'))).toBe(undefined); -}); - -test('workspace provider should initialize correctly', async () => { - INTERNAL_BLOCKSUITE_HASH_MAP.set('1', createWorkspace('1')); - { - enablePassiveProviders(getWorkspace('1')); - expect(activeWorkspaceEnabled.size).toBe(0); - expect(passiveWorkspaceEnabled.size).toBe(1); - disablePassiveProviders(getWorkspace('1')); - expect(activeWorkspaceEnabled.size).toBe(0); - expect(passiveWorkspaceEnabled.size).toBe(0); - } - { - const atom = getActiveBlockSuiteWorkspaceAtom('1'); - await getDefaultStore().get(atom); - expect(activeWorkspaceEnabled.size).toBe(1); - expect(passiveWorkspaceEnabled.size).toBe(0); - } -}); diff --git a/packages/infra/src/atom.ts b/packages/infra/src/atom.ts index 601ad31b2a..4957094507 100644 --- a/packages/infra/src/atom.ts +++ b/packages/infra/src/atom.ts @@ -3,7 +3,7 @@ import { assertExists } from '@blocksuite/global/utils'; import type { Workspace } from '@blocksuite/store'; import { atom, createStore } from 'jotai/vanilla'; -import { getActiveBlockSuiteWorkspaceAtom } from './__internal__/workspace'; +import { getBlockSuiteWorkspaceAtom } from './__internal__/workspace'; // global store let rootStore = createStore(); @@ -26,7 +26,7 @@ export const currentPageIdAtom = atom(null); export const currentWorkspaceAtom = atom>(async get => { const workspaceId = get(currentWorkspaceIdAtom); assertExists(workspaceId); - const currentWorkspaceAtom = getActiveBlockSuiteWorkspaceAtom(workspaceId); + const [currentWorkspaceAtom] = getBlockSuiteWorkspaceAtom(workspaceId); return get(currentWorkspaceAtom); }); diff --git a/yarn.lock b/yarn.lock index 7fe1b99a88..5e492d0e69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12424,6 +12424,7 @@ __metadata: async-call-rpc: ^6.3.1 electron: "link:../../apps/electron/node_modules/electron" jotai: ^2.4.3 + jotai-effect: ^0.1.0 nanoid: ^5.0.1 react: ^18.2.0 rxjs: ^7.8.1 @@ -24022,6 +24023,15 @@ __metadata: languageName: node linkType: hard +"jotai-effect@npm:^0.1.0": + version: 0.1.0 + resolution: "jotai-effect@npm:0.1.0" + peerDependencies: + jotai: ">=2.4.3" + checksum: fdf8794f9383c911978aa992a994fa5610e8bf2e7752ed995482dc480f87fc0cd7f68a9df5648a0f2fc7335a02b58bee507f3b1394c28fbbc226f81ca06dc694 + languageName: node + linkType: hard + "jotai@npm:^2.4.3": version: 2.4.3 resolution: "jotai@npm:2.4.3"