fix(core): collections initialized logic (#5310)

Collections YArray should be initialized only when the user operates on it, local state can't be trusted
This commit is contained in:
3720
2023-12-19 09:02:01 +00:00
parent 55818539af
commit b9345e8d21
2 changed files with 35 additions and 28 deletions

View File

@@ -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 () => {

View File

@@ -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<Collection> | undefined {
return this.setting.get(COLLECTIONS_KEY) as YArray<Collection>;
}
get collectionsTrashYArray() {
if (!this.setting.has(COLLECTIONS_TRASH_KEY)) {
this.setting.set(COLLECTIONS_TRASH_KEY, new YArray());
}
get collectionsTrashYArray(): YArray<DeletedCollection> | undefined {
return this.setting.get(COLLECTIONS_TRASH_KEY) as YArray<DeletedCollection>;
}
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);
}
});
}