fix(app): repair theme CSS sync persistence and data loss (#2067)

This commit is contained in:
Hampus authored and GitHub committed 2026-08-29 03:37:41 +02:00
1 parent 14de5971d5
commit 9ad026b8ce
4 files changed
+35 -5

No files matched your search

@@ -125,6 +125,7 @@ class ThemeLibrary {
localFiles: Array<ThemeLibraryLocalFileReference> = [];
enabledThemeIds: Array<string> = [];
isHydrated = false;
loadFailed = false;
isBusy = false;
revision = 0;
private initPromise: Promise<void> | null = null;
@@ -173,12 +174,13 @@ class ThemeLibrary {
this.localFiles = localFiles.sort((a, b) => a.name.localeCompare(b.name));
this.enabledThemeIds = enabledThemeIds.filter((id) => themes.some((theme) => theme.id === id));
this.isHydrated = true;
this.loadFailed = false;
this.revision += 1;
});
} catch (error) {
logger.error('Failed to hydrate theme library', error);
runInAction(() => {
this.isHydrated = true;
this.loadFailed = true;
});
}
}
@@ -94,7 +94,7 @@ function getDatabase(): Promise<IDBDatabase> {
if (openPromise) {
return openPromise;
}
openPromise = new Promise((resolve, reject) => {
const promise = new Promise<IDBDatabase>((resolve, reject) => {
if (!browserIndexedDB) {
reject(new Error('IndexedDB unavailable'));
return;
@@ -126,7 +126,13 @@ function getDatabase(): Promise<IDBDatabase> {
request.onerror = () => reject(request.error ?? new Error('Failed to open theme library database'));
request.onblocked = () => reject(new Error('Theme library database upgrade is blocked by another window'));
});
return openPromise;
promise.catch(() => {
if (openPromise === promise) {
openPromise = null;
}
});
openPromise = promise;
return promise;
}
async function withReadonlyDb<T>(