mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-25 18:26:05 +08:00
feat(core): reduce profile loading time (#6616)
This commit is contained in:
@@ -1,8 +1,14 @@
|
||||
import { DebugLogger } from '@affine/debug';
|
||||
import { catchError, EMPTY, from, mergeMap, switchMap } from 'rxjs';
|
||||
import { catchError, EMPTY, mergeMap, switchMap } from 'rxjs';
|
||||
|
||||
import { Entity } from '../../../framework';
|
||||
import { effect, LiveData, onComplete, onStart } from '../../../livedata';
|
||||
import {
|
||||
effect,
|
||||
fromPromise,
|
||||
LiveData,
|
||||
onComplete,
|
||||
onStart,
|
||||
} from '../../../livedata';
|
||||
import type { WorkspaceMetadata } from '../metadata';
|
||||
import type { WorkspaceFlavourProvider } from '../providers/flavour';
|
||||
import type { WorkspaceProfileCacheStore } from '../stores/profile-cache';
|
||||
@@ -54,11 +60,12 @@ export class WorkspaceProfile extends Entity<{ metadata: WorkspaceMetadata }> {
|
||||
|
||||
revalidate = effect(
|
||||
switchMap(() => {
|
||||
if (!this.provider) {
|
||||
const provider = this.provider;
|
||||
if (!provider) {
|
||||
return EMPTY;
|
||||
}
|
||||
return from(
|
||||
this.provider.getWorkspaceProfile(this.props.metadata.id)
|
||||
return fromPromise(signal =>
|
||||
provider.getWorkspaceProfile(this.props.metadata.id, signal)
|
||||
).pipe(
|
||||
mergeMap(info => {
|
||||
if (info) {
|
||||
|
||||
@@ -47,7 +47,10 @@ export interface WorkspaceFlavourProvider {
|
||||
*/
|
||||
revalidate?: () => void;
|
||||
|
||||
getWorkspaceProfile(id: string): Promise<WorkspaceProfileInfo | undefined>;
|
||||
getWorkspaceProfile(
|
||||
id: string,
|
||||
signal?: AbortSignal
|
||||
): Promise<WorkspaceProfileInfo | undefined>;
|
||||
|
||||
getWorkspaceBlob(id: string, blob: string): Promise<Blob | null>;
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ import {
|
||||
} from '@toeverything/infra';
|
||||
import { effect, globalBlockSuiteSchema, Service } from '@toeverything/infra';
|
||||
import { nanoid } from 'nanoid';
|
||||
import { EMPTY, lastValueFrom, map, mergeMap, timeout } from 'rxjs';
|
||||
import { EMPTY, map, mergeMap } from 'rxjs';
|
||||
import { applyUpdate, encodeStateAsUpdate } from 'yjs';
|
||||
|
||||
import type {
|
||||
@@ -179,7 +179,8 @@ export class CloudWorkspaceFlavourProviderService
|
||||
isLoading$ = new LiveData(false);
|
||||
workspaces$ = new LiveData<WorkspaceMetadata[]>([]);
|
||||
async getWorkspaceProfile(
|
||||
id: string
|
||||
id: string,
|
||||
signal?: AbortSignal
|
||||
): Promise<WorkspaceProfileInfo | undefined> {
|
||||
// get information from both cloud and local storage
|
||||
|
||||
@@ -190,7 +191,7 @@ export class CloudWorkspaceFlavourProviderService
|
||||
const localData = await docStorage.doc.get(id);
|
||||
const cloudData = await cloudStorage.pull(id);
|
||||
|
||||
const isOwner = await this.getIsOwner(id);
|
||||
const isOwner = await this.getIsOwner(id, signal);
|
||||
|
||||
if (!cloudData && !localData) {
|
||||
return {
|
||||
@@ -255,18 +256,15 @@ export class CloudWorkspaceFlavourProviderService
|
||||
};
|
||||
}
|
||||
|
||||
private async getIsOwner(workspaceId: string) {
|
||||
private async getIsOwner(workspaceId: string, signal?: AbortSignal) {
|
||||
return (
|
||||
await lastValueFrom(
|
||||
this.graphqlService
|
||||
.rxGql({
|
||||
query: getIsOwnerQuery,
|
||||
variables: {
|
||||
workspaceId,
|
||||
},
|
||||
})
|
||||
.pipe(timeout(3000))
|
||||
)
|
||||
await this.graphqlService.gql({
|
||||
query: getIsOwnerQuery,
|
||||
variables: {
|
||||
workspaceId,
|
||||
},
|
||||
context: { signal },
|
||||
})
|
||||
).isOwner;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user