diff --git a/packages/common/infra/src/livedata/effect/__tests__/effect.spec.ts b/packages/common/infra/src/livedata/effect/__tests__/effect.spec.ts index 969510baa1..75d8cbcff4 100644 --- a/packages/common/infra/src/livedata/effect/__tests__/effect.spec.ts +++ b/packages/common/infra/src/livedata/effect/__tests__/effect.spec.ts @@ -56,6 +56,7 @@ describe('example', () => { fetchUser.mockRejectedValue(new Error('some error')); loadUser(1); await vi.waitFor(() => expect(error$.value).toBeInstanceOf(Error)); + await vi.waitFor(() => expect(isLoading$.value).toBe(false)); }); test('isLoading', async () => { diff --git a/packages/common/infra/src/modules/workspace/entities/list.ts b/packages/common/infra/src/modules/workspace/entities/list.ts index 472149ca35..52f01c3333 100644 --- a/packages/common/infra/src/modules/workspace/entities/list.ts +++ b/packages/common/infra/src/modules/workspace/entities/list.ts @@ -11,8 +11,8 @@ export class WorkspaceList extends Entity { .map(workspaces => { return workspaces.flat(); }); - isLoading$ = new LiveData( - this.providers.map(p => p.isLoading$ ?? new LiveData(false)) + isRevalidating$ = new LiveData( + this.providers.map(p => p.isRevalidating$ ?? new LiveData(false)) ) .flat() .map(isLoadings => isLoadings.some(isLoading => isLoading)); @@ -24,4 +24,9 @@ export class WorkspaceList extends Entity { revalidate() { this.providers.forEach(provider => provider.revalidate?.()); } + + waitForRevalidation(signal?: AbortSignal) { + this.revalidate(); + return this.isRevalidating$.waitFor(isLoading => !isLoading, signal); + } } diff --git a/packages/common/infra/src/modules/workspace/entities/workspace.ts b/packages/common/infra/src/modules/workspace/entities/workspace.ts index 2695d3ca3f..e93525b73d 100644 --- a/packages/common/infra/src/modules/workspace/entities/workspace.ts +++ b/packages/common/infra/src/modules/workspace/entities/workspace.ts @@ -62,10 +62,6 @@ export class Workspace extends Entity { return this.framework.get(WorkspaceUpgradeService).upgrade; } - get flavourProvider() { - return this.scope.props.flavourProvider; - } - name$ = LiveData.from( new Observable(subscriber => { subscriber.next(this.docCollection.meta.name); diff --git a/packages/common/infra/src/modules/workspace/providers/flavour.ts b/packages/common/infra/src/modules/workspace/providers/flavour.ts index b12dd3250e..e00fd850e0 100644 --- a/packages/common/infra/src/modules/workspace/providers/flavour.ts +++ b/packages/common/infra/src/modules/workspace/providers/flavour.ts @@ -38,7 +38,7 @@ export interface WorkspaceFlavourProvider { /** * means the workspace list is loading. if it's true, the workspace page will show loading spinner. */ - isLoading$?: LiveData; + isRevalidating$?: LiveData; /** * revalidate the workspace list. diff --git a/packages/common/infra/src/modules/workspace/scopes/workspace.ts b/packages/common/infra/src/modules/workspace/scopes/workspace.ts index 9fae92f612..6371139231 100644 --- a/packages/common/infra/src/modules/workspace/scopes/workspace.ts +++ b/packages/common/infra/src/modules/workspace/scopes/workspace.ts @@ -1,10 +1,10 @@ import { Scope } from '../../../framework'; import type { WorkspaceOpenOptions } from '../open-options'; -import type { WorkspaceFlavourProvider } from '../providers/flavour'; +import type { WorkspaceEngineProvider } from '../providers/flavour'; export type { DocCollection } from '@blocksuite/store'; export class WorkspaceScope extends Scope<{ openOptions: WorkspaceOpenOptions; - flavourProvider: WorkspaceFlavourProvider; + engineProvider: WorkspaceEngineProvider; }> {} diff --git a/packages/common/infra/src/modules/workspace/services/engine.ts b/packages/common/infra/src/modules/workspace/services/engine.ts index d1be647d2f..8dcf8ec6dd 100644 --- a/packages/common/infra/src/modules/workspace/services/engine.ts +++ b/packages/common/infra/src/modules/workspace/services/engine.ts @@ -7,10 +7,7 @@ export class WorkspaceEngineService extends Service { get engine() { if (!this._engine) { this._engine = this.framework.createEntity(WorkspaceEngine, { - engineProvider: - this.workspaceScope.props.flavourProvider.getEngineProvider( - this.workspaceScope.props.openOptions.metadata.id - ), + engineProvider: this.workspaceScope.props.engineProvider, }); } return this._engine; diff --git a/packages/common/infra/src/modules/workspace/services/repo.ts b/packages/common/infra/src/modules/workspace/services/repo.ts index d8d4cb8461..a38652f079 100644 --- a/packages/common/infra/src/modules/workspace/services/repo.ts +++ b/packages/common/infra/src/modules/workspace/services/repo.ts @@ -6,7 +6,10 @@ import { ObjectPool } from '../../../utils'; import type { Workspace } from '../entities/workspace'; import { WorkspaceInitialized } from '../events'; import type { WorkspaceOpenOptions } from '../open-options'; -import type { WorkspaceFlavourProvider } from '../providers/flavour'; +import type { + WorkspaceEngineProvider, + WorkspaceFlavourProvider, +} from '../providers/flavour'; import { WorkspaceScope } from '../scopes/workspace'; import type { WorkspaceProfileService } from './profile'; import { WorkspaceService } from './workspace'; @@ -39,7 +42,7 @@ export class WorkspaceRepositoryService extends Service { */ open = ( options: WorkspaceOpenOptions, - customProvider?: WorkspaceFlavourProvider + customProvider?: WorkspaceEngineProvider ): { workspace: Workspace; dispose: () => void; @@ -76,14 +79,16 @@ export class WorkspaceRepositoryService extends Service { instantiate( openOptions: WorkspaceOpenOptions, - customProvider?: WorkspaceFlavourProvider + customProvider?: WorkspaceEngineProvider ) { logger.info( `open workspace [${openOptions.metadata.flavour}] ${openOptions.metadata.id} ` ); const provider = customProvider ?? - this.providers.find(p => p.flavour === openOptions.metadata.flavour); + this.providers + .find(p => p.flavour === openOptions.metadata.flavour) + ?.getEngineProvider(openOptions.metadata.id); if (!provider) { throw new Error( `Unknown workspace flavour: ${openOptions.metadata.flavour}` @@ -92,7 +97,7 @@ export class WorkspaceRepositoryService extends Service { const workspaceScope = this.framework.createScope(WorkspaceScope, { openOptions, - flavourProvider: provider, + engineProvider: provider, }); const workspace = workspaceScope.get(WorkspaceService).workspace; diff --git a/packages/frontend/core/src/components/affine/share-page-modal/share-menu/share-menu.tsx b/packages/frontend/core/src/components/affine/share-page-modal/share-menu/share-menu.tsx index 42fb69bdd7..897958bd89 100644 --- a/packages/frontend/core/src/components/affine/share-page-modal/share-menu/share-menu.tsx +++ b/packages/frontend/core/src/components/affine/share-page-modal/share-menu/share-menu.tsx @@ -1,7 +1,7 @@ import { Button } from '@affine/component/ui/button'; import { Divider } from '@affine/component/ui/divider'; import { Menu } from '@affine/component/ui/menu'; -import { ShareService } from '@affine/core/modules/share-doc'; +import { ShareInfoService } from '@affine/core/modules/share-doc'; import { WorkspaceFlavour } from '@affine/env/workspace'; import { useI18n } from '@affine/i18n'; import { WebIcon } from '@blocksuite/icons/rc'; @@ -48,12 +48,12 @@ const DefaultShareButton = forwardRef(function DefaultShareButton( ref: Ref ) { const t = useI18n(); - const shareService = useService(ShareService); - const shared = useLiveData(shareService.share.isShared$); + const shareInfoService = useService(ShareInfoService); + const shared = useLiveData(shareInfoService.shareInfo.isShared$); useEffect(() => { - shareService.share.revalidate(); - }, [shareService]); + shareInfoService.shareInfo.revalidate(); + }, [shareInfoService]); return (