From b9345e8d2143427d7d7200dfcc471d2c6c5b6161 Mon Sep 17 00:00:00 2001 From: 3720 <17165520+zzj3720@users.noreply.github.com> Date: Tue, 19 Dec 2023 09:02:01 +0000 Subject: [PATCH] fix(core): collections initialized logic (#5310) Collections YArray should be initialized only when the user operates on it, local state can't be trusted --- .../frontend/core/src/atoms/collections.ts | 4 +- .../core/src/utils/workspace-setting.ts | 59 +++++++++++-------- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/packages/frontend/core/src/atoms/collections.ts b/packages/frontend/core/src/atoms/collections.ts index af69f4fced..2f0f9a85f9 100644 --- a/packages/frontend/core/src/atoms/collections.ts +++ b/packages/frontend/core/src/atoms/collections.ts @@ -193,9 +193,9 @@ export const pageCollectionBaseAtom = collections: workspaceSetting.collections, }); }; - workspaceSetting.collectionsYArray.observe(fn); + workspaceSetting.setting.observeDeep(fn); group.add(() => { - workspaceSetting.collectionsYArray.unobserve(fn); + workspaceSetting.setting.unobserveDeep(fn); }); return () => { diff --git a/packages/frontend/core/src/utils/workspace-setting.ts b/packages/frontend/core/src/utils/workspace-setting.ts index dacdc92ce9..c4c86e0049 100644 --- a/packages/frontend/core/src/utils/workspace-setting.ts +++ b/packages/frontend/core/src/utils/workspace-setting.ts @@ -23,50 +23,53 @@ export class WorkspaceSetting { return this.workspace.doc.getMap(SETTING_KEY); } - get collectionsYArray() { - if (!this.setting.has(COLLECTIONS_KEY)) { - this.setting.set(COLLECTIONS_KEY, new YArray()); - } + get collectionsYArray(): YArray | undefined { return this.setting.get(COLLECTIONS_KEY) as YArray; } - get collectionsTrashYArray() { - if (!this.setting.has(COLLECTIONS_TRASH_KEY)) { - this.setting.set(COLLECTIONS_TRASH_KEY, new YArray()); - } + get collectionsTrashYArray(): YArray | undefined { return this.setting.get(COLLECTIONS_TRASH_KEY) as YArray; } get collections(): Collection[] { - return this.collectionsYArray.toArray() ?? []; + return this.collectionsYArray?.toArray() ?? []; } get collectionsTrash(): DeletedCollection[] { - return this.collectionsTrashYArray.toArray() ?? []; + return this.collectionsTrashYArray?.toArray() ?? []; } updateCollection(id: string, updater: (value: Collection) => Collection) { - updateFirstOfYArray( - this.collectionsYArray, - v => v.id === id, - v => { - return updater(v); - } - ); + if (this.collectionsYArray) { + updateFirstOfYArray( + this.collectionsYArray, + v => v.id === id, + v => { + return updater(v); + } + ); + } } addCollection(...collections: Collection[]) { + if (!this.setting.has(COLLECTIONS_KEY)) { + this.setting.set(COLLECTIONS_KEY, new YArray()); + } this.doc.transact(() => { - this.collectionsYArray.insert(0, collections); + this.collectionsYArray?.insert(0, collections); }); } deleteCollection(info: DeleteCollectionInfo, ...ids: string[]) { + const collectionsYArray = this.collectionsYArray; + if (!collectionsYArray) { + return; + } const set = new Set(ids); this.workspace.doc.transact(() => { const indexList: number[] = []; const list: Collection[] = []; - this.collectionsYArray.forEach((collection, i) => { + collectionsYArray.forEach((collection, i) => { if (set.has(collection.id)) { set.delete(collection.id); indexList.unshift(i); @@ -74,9 +77,16 @@ export class WorkspaceSetting { } }); indexList.forEach(i => { - this.collectionsYArray.delete(i); + collectionsYArray.delete(i); }); - this.collectionsTrashYArray.insert( + if (!this.collectionsTrashYArray) { + this.setting.set(COLLECTIONS_TRASH_KEY, new YArray()); + } + const collectionsTrashYArray = this.collectionsTrashYArray; + if (!collectionsTrashYArray) { + return; + } + collectionsTrashYArray.insert( 0, list.map(collection => ({ userId: info?.userId, @@ -84,11 +94,8 @@ export class WorkspaceSetting { collection, })) ); - if (this.collectionsTrashYArray.length > 10) { - this.collectionsTrashYArray.delete( - 10, - this.collectionsTrashYArray.length - 10 - ); + if (collectionsTrashYArray.length > 10) { + collectionsTrashYArray.delete(10, collectionsTrashYArray.length - 10); } }); }