From ff7d6c115f7c8325775fc33cb70bfc2cacf541f8 Mon Sep 17 00:00:00 2001 From: lin onetwo Date: Mon, 1 Jan 2024 13:10:36 +0800 Subject: [PATCH] fix: data race when two try to set setting file --- .../SortableWorkspaceSelectorButton.tsx | 1 - src/services/pages/debouncedSetSettingFile.ts | 3 +- src/services/pages/index.ts | 34 ++++++++----------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/components/WorkspaceIconAndSelector/SortableWorkspaceSelectorButton.tsx b/src/components/WorkspaceIconAndSelector/SortableWorkspaceSelectorButton.tsx index b6b75f06..072d644d 100644 --- a/src/components/WorkspaceIconAndSelector/SortableWorkspaceSelectorButton.tsx +++ b/src/components/WorkspaceIconAndSelector/SortableWorkspaceSelectorButton.tsx @@ -6,7 +6,6 @@ import { MouseEvent, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { WorkspaceSelectorBase } from './WorkspaceSelectorBase'; -import defaultIcon from '@/images/default-icon.png'; import { PageType } from '@services/pages/interface'; import { WindowNames } from '@services/windows/WindowProperties'; import { useLocation } from 'wouter'; diff --git a/src/services/pages/debouncedSetSettingFile.ts b/src/services/pages/debouncedSetSettingFile.ts index ade45828..8bf43390 100644 --- a/src/services/pages/debouncedSetSettingFile.ts +++ b/src/services/pages/debouncedSetSettingFile.ts @@ -15,4 +15,5 @@ export const debouncedSetSettingFile = debounce(async (pages: Record(this.getPagesAsListSync()); - this.updatePageSubject = debounce(this.updatePageSubject.bind(this), 500) as () => Promise; } private async updatePageSubject(): Promise { @@ -73,11 +72,8 @@ export class Pages implements IPagesService { const oldActivePage = this.getActivePageSync(); const oldActivePageID = oldActivePage?.id; logger.info(`setActivePage() closePage: ${oldActivePageID ?? 'undefined'}`); - if (id !== PageType.wiki) { - await this.workspaceViewService.clearActiveWorkspaceView(); - } if (oldActivePageID === id) return; - if (oldActivePageID === undefined) { + if (oldActivePageID === undefined || oldActivePageID === PageType.wiki) { await this.update(id, { active: true }); } else { if (id === PageType.wiki) { @@ -87,6 +83,12 @@ export class Pages implements IPagesService { await this.updatePages({ [id]: { active: true }, [oldActivePageID]: { active: false } }); } } + if (id !== PageType.wiki) { + // delay this so the page state can be updated first + setTimeout(() => { + void this.workspaceViewService.clearActiveWorkspaceView(); + }, 0); + } } public async clearActivePage(id: string | PageType | undefined): Promise { @@ -113,13 +115,11 @@ export class Pages implements IPagesService { } public async set(id: string | PageType, page: IPage, updateSettingFile = true): Promise { - logger.info(`set page ${id} with ${JSON.stringify(page)}`); + logger.info(`set page ${id} with ${JSON.stringify(page)}`, { updateSettingFile }); this.pages[id] = page; if (updateSettingFile) { - await Promise.all([ - debouncedSetSettingFile(this.pages), - this.updatePageSubject(), - ]); + await this.updatePageSubject(); + void debouncedSetSettingFile(this.pages); } } @@ -136,20 +136,16 @@ export class Pages implements IPagesService { for (const id in newPages) { await this.set(id, newPages[id], false); } - await Promise.all([ - debouncedSetSettingFile(this.pages), - this.updatePageSubject(), - ]); + await this.updatePageSubject(); + void debouncedSetSettingFile(this.pages); } public async updatePages(newPages: Record>): Promise { for (const id in newPages) { await this.update(id, newPages[id], false); } - await Promise.all([ - debouncedSetSettingFile(this.pages), - this.updatePageSubject(), - ]); + await this.updatePageSubject(); + void debouncedSetSettingFile(this.pages); } /**