This commit is contained in:
syuilo 2025-05-31 16:11:08 +09:00
parent fed783773c
commit fde05bfbf5
1 changed files with 46 additions and 16 deletions

View File

@ -139,11 +139,11 @@ export class PreferencesManager {
// TODO: 定期的にクラウドの値をフェッチ // TODO: 定期的にクラウドの値をフェッチ
} }
private isAccountDependentKey<K extends keyof PREF>(key: K): boolean { private static isAccountDependentKey<K extends keyof PREF>(key: K): boolean {
return (PREF_DEF as PreferencesDefinition)[key].accountDependent === true; return (PREF_DEF as PreferencesDefinition)[key].accountDependent === true;
} }
private isServerDependentKey<K extends keyof PREF>(key: K): boolean { private static isServerDependentKey<K extends keyof PREF>(key: K): boolean {
return (PREF_DEF as PreferencesDefinition)[key].serverDependent === true; return (PREF_DEF as PreferencesDefinition)[key].serverDependent === true;
} }
@ -166,7 +166,7 @@ export class PreferencesManager {
const record = this.getMatchedRecordOf(key); const record = this.getMatchedRecordOf(key);
if (parseScope(record[0]).account == null && this.isAccountDependentKey(key)) { if (parseScope(record[0]).account == null && PreferencesManager.isAccountDependentKey(key)) {
this.profile.preferences[key].push([makeScope({ this.profile.preferences[key].push([makeScope({
server: host, server: host,
account: $i!.id, account: $i!.id,
@ -175,7 +175,7 @@ export class PreferencesManager {
return; return;
} }
if (parseScope(record[0]).server == null && this.isServerDependentKey(key)) { if (parseScope(record[0]).server == null && PreferencesManager.isServerDependentKey(key)) {
this.profile.preferences[key].push([makeScope({ this.profile.preferences[key].push([makeScope({
server: host, server: host,
}), v, {}]); }), v, {}]);
@ -276,7 +276,19 @@ export class PreferencesManager {
public static newProfile(): PreferencesProfile { public static newProfile(): PreferencesProfile {
const data = {} as PreferencesProfile['preferences']; const data = {} as PreferencesProfile['preferences'];
for (const key in PREF_DEF) { for (const key in PREF_DEF) {
data[key] = [[makeScope({}), getInitialPrefValue(key as keyof typeof PREF_DEF), {}]]; const v = getInitialPrefValue(key as keyof typeof PREF_DEF);
if (PreferencesManager.isAccountDependentKey(key as keyof typeof PREF_DEF)) {
data[key] = $i ? [[makeScope({
server: host,
account: $i.id,
}), v, {}]] : [[makeScope({}), v, {}]];
} else if (PreferencesManager.isServerDependentKey(key as keyof typeof PREF_DEF)) {
data[key] = [[makeScope({
server: host,
}), v, {}]];
} else {
data[key] = [[makeScope({}), v, {}]];
}
} }
return { return {
id: uuid(), id: uuid(),
@ -293,18 +305,36 @@ export class PreferencesManager {
for (const key in PREF_DEF) { for (const key in PREF_DEF) {
const records = profileLike.preferences[key]; const records = profileLike.preferences[key];
if (records == null || records.length === 0) { if (records == null || records.length === 0) {
data[key] = [[makeScope({}), getInitialPrefValue(key as keyof typeof PREF_DEF), {}]]; const v = getInitialPrefValue(key as keyof typeof PREF_DEF);
if (PreferencesManager.isAccountDependentKey(key as keyof typeof PREF_DEF)) {
data[key] = $i ? [[makeScope({
server: host,
account: $i.id,
}), v, {}]] : [[makeScope({}), v, {}]];
} else if (PreferencesManager.isServerDependentKey(key as keyof typeof PREF_DEF)) {
data[key] = [[makeScope({
server: host,
}), v, {}]];
} else {
data[key] = [[makeScope({}), v, {}]];
}
continue; continue;
} else { } else {
data[key] = records; if ($i && PreferencesManager.isAccountDependentKey(key as keyof typeof PREF_DEF) && !records.some(([scope]) => parseScope(scope).server === host && parseScope(scope).account === $i!.id)) {
data[key] = records.concat([[makeScope({
// alpha段階ではmetaが無かったのでマイグレート server: host,
// TODO: そのうち消す account: $i.id,
for (const record of data[key] as any[][]) { }), getInitialPrefValue(key as keyof typeof PREF_DEF), {}]]);
if (record.length === 2) { continue;
record.push({});
}
} }
if ($i && PreferencesManager.isServerDependentKey(key as keyof typeof PREF_DEF) && !records.some(([scope]) => parseScope(scope).server === host)) {
data[key] = records.concat([[makeScope({
server: host,
}), getInitialPrefValue(key as keyof typeof PREF_DEF), {}]]);
continue;
}
data[key] = records;
} }
} }
@ -342,7 +372,7 @@ export class PreferencesManager {
public setAccountOverride<K extends keyof PREF>(key: K) { public setAccountOverride<K extends keyof PREF>(key: K) {
if ($i == null) return; if ($i == null) return;
if (this.isAccountDependentKey(key)) throw new Error('already account-dependent'); if (PreferencesManager.isAccountDependentKey(key)) throw new Error('already account-dependent');
if (this.isAccountOverrided(key)) return; if (this.isAccountOverrided(key)) return;
const records = this.profile.preferences[key]; const records = this.profile.preferences[key];
@ -356,7 +386,7 @@ export class PreferencesManager {
public clearAccountOverride<K extends keyof PREF>(key: K) { public clearAccountOverride<K extends keyof PREF>(key: K) {
if ($i == null) return; if ($i == null) return;
if (this.isAccountDependentKey(key)) throw new Error('cannot clear override for this account-dependent property'); if (PreferencesManager.isAccountDependentKey(key)) throw new Error('cannot clear override for this account-dependent property');
const records = this.profile.preferences[key]; const records = this.profile.preferences[key];