summaryrefslogtreecommitdiff
path: root/packages/frontend/src/pizzax.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/pizzax.ts')
-rw-r--r--packages/frontend/src/pizzax.ts19
1 files changed, 16 insertions, 3 deletions
diff --git a/packages/frontend/src/pizzax.ts b/packages/frontend/src/pizzax.ts
index 8723110b08..b3d2374899 100644
--- a/packages/frontend/src/pizzax.ts
+++ b/packages/frontend/src/pizzax.ts
@@ -7,6 +7,7 @@
import { onUnmounted, Ref, ref, watch } from 'vue';
import { BroadcastChannel } from 'broadcast-channel';
+import { defu } from 'defu';
import { $i } from '@/account.js';
import { misskeyApi } from '@/scripts/misskey-api.js';
import { get, set } from '@/scripts/idb-proxy.js';
@@ -80,6 +81,18 @@ export class Storage<T extends StateDef> {
this.loaded = this.ready.then(() => this.load());
}
+ private isPureObject(value: unknown): value is Record<string, unknown> {
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
+ }
+
+ private mergeState<T>(value: T, def: T): T {
+ if (this.isPureObject(value) && this.isPureObject(def)) {
+ if (_DEV_) console.log('Merging state. Incoming: ', value, ' Default: ', def);
+ return defu(value, def) as T;
+ }
+ return value;
+ }
+
private async init(): Promise<void> {
await this.migrate();
@@ -89,11 +102,11 @@ export class Storage<T extends StateDef> {
for (const [k, v] of Object.entries(this.def) as [keyof T, T[keyof T]['default']][]) {
if (v.where === 'device' && Object.prototype.hasOwnProperty.call(deviceState, k)) {
- this.reactiveState[k].value = this.state[k] = deviceState[k];
+ this.reactiveState[k].value = this.state[k] = this.mergeState<T[keyof T]['default']>(deviceState[k], v.default);
} else if (v.where === 'account' && $i && Object.prototype.hasOwnProperty.call(registryCache, k)) {
- this.reactiveState[k].value = this.state[k] = registryCache[k];
+ this.reactiveState[k].value = this.state[k] = this.mergeState<T[keyof T]['default']>(registryCache[k], v.default);
} else if (v.where === 'deviceAccount' && Object.prototype.hasOwnProperty.call(deviceAccountState, k)) {
- this.reactiveState[k].value = this.state[k] = deviceAccountState[k];
+ this.reactiveState[k].value = this.state[k] = this.mergeState<T[keyof T]['default']>(deviceAccountState[k], v.default);
} else {
this.reactiveState[k].value = this.state[k] = v.default;
if (_DEV_) console.log('Use default value', k, v.default);