|
|
@ -39,6 +39,90 @@ class PreferenceManager { |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clearCache() { |
|
|
|
|
|
[STORAGE_KEY, STORAGE_KEY_LOCALE, STORAGE_KEY_THEME].forEach((key) => { |
|
|
|
|
|
this.cache?.removeItem(key); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public getInitialPreferences() { |
|
|
|
|
|
return this.initialPreferences; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public getPreferences() { |
|
|
|
|
|
return readonly(this.state); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 覆盖偏好设置 |
|
|
|
|
|
* overrides 要覆盖的偏好设置 |
|
|
|
|
|
* namespace 命名空间 |
|
|
|
|
|
*/ |
|
|
|
|
|
public async initPreferences({ namespace, overrides }: InitialOptions) { |
|
|
|
|
|
// 是否初始化过
|
|
|
|
|
|
if (this.isInitialized) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
// 初始化存储管理器
|
|
|
|
|
|
this.cache = new StorageManager({ prefix: namespace }); |
|
|
|
|
|
// 合并初始偏好设置
|
|
|
|
|
|
this.initialPreferences = merge({}, overrides, defaultPreferences); |
|
|
|
|
|
|
|
|
|
|
|
// 加载并合并当前存储的偏好设置
|
|
|
|
|
|
const mergedPreference = merge( |
|
|
|
|
|
{}, |
|
|
|
|
|
// overrides,
|
|
|
|
|
|
this.loadCachedPreferences() || {}, |
|
|
|
|
|
this.initialPreferences, |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
// 更新偏好设置
|
|
|
|
|
|
this.updatePreferences(mergedPreference); |
|
|
|
|
|
|
|
|
|
|
|
this.setupWatcher(); |
|
|
|
|
|
|
|
|
|
|
|
this.initPlatform(); |
|
|
|
|
|
// 标记为已初始化
|
|
|
|
|
|
this.isInitialized = true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 重置偏好设置 |
|
|
|
|
|
* 偏好设置将被重置为初始值,并从 localStorage 中移除。 |
|
|
|
|
|
* |
|
|
|
|
|
* @example |
|
|
|
|
|
* 假设 initialPreferences 为 { theme: 'light', language: 'en' } |
|
|
|
|
|
* 当前 state 为 { theme: 'dark', language: 'fr' } |
|
|
|
|
|
* this.resetPreferences(); |
|
|
|
|
|
* 调用后,state 将被重置为 { theme: 'light', language: 'en' } |
|
|
|
|
|
* 并且 localStorage 中的对应项将被移除 |
|
|
|
|
|
*/ |
|
|
|
|
|
resetPreferences() { |
|
|
|
|
|
// 将状态重置为初始偏好设置
|
|
|
|
|
|
Object.assign(this.state, this.initialPreferences); |
|
|
|
|
|
// 保存重置后的偏好设置
|
|
|
|
|
|
this.savePreferences(this.state); |
|
|
|
|
|
// 从存储中移除偏好设置项
|
|
|
|
|
|
[STORAGE_KEY, STORAGE_KEY_THEME, STORAGE_KEY_LOCALE].forEach((key) => { |
|
|
|
|
|
this.cache?.removeItem(key); |
|
|
|
|
|
}); |
|
|
|
|
|
this.updatePreferences(this.state); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 更新偏好设置 |
|
|
|
|
|
* @param updates - 要更新的偏好设置 |
|
|
|
|
|
*/ |
|
|
|
|
|
public updatePreferences(updates: DeepPartial<Preferences>) { |
|
|
|
|
|
const mergedState = merge({}, updates, markRaw(this.state)); |
|
|
|
|
|
|
|
|
|
|
|
Object.assign(this.state, mergedState); |
|
|
|
|
|
|
|
|
|
|
|
// 根据更新的键值执行相应的操作
|
|
|
|
|
|
this.handleUpdates(updates); |
|
|
|
|
|
this.savePreferences(this.state); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 保存偏好设置 |
|
|
* 保存偏好设置 |
|
|
* @param {Preferences} preference - 需要保存的偏好设置 |
|
|
* @param {Preferences} preference - 需要保存的偏好设置 |
|
|
@ -138,90 +222,6 @@ class PreferenceManager { |
|
|
: dom.classList.remove(COLOR_GRAY); |
|
|
: dom.classList.remove(COLOR_GRAY); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
clearCache() { |
|
|
|
|
|
[STORAGE_KEY, STORAGE_KEY_LOCALE, STORAGE_KEY_THEME].forEach((key) => { |
|
|
|
|
|
this.cache?.removeItem(key); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public getInitialPreferences() { |
|
|
|
|
|
return this.initialPreferences; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public getPreferences() { |
|
|
|
|
|
return readonly(this.state); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 覆盖偏好设置 |
|
|
|
|
|
* overrides 要覆盖的偏好设置 |
|
|
|
|
|
* namespace 命名空间 |
|
|
|
|
|
*/ |
|
|
|
|
|
public async initPreferences({ namespace, overrides }: InitialOptions) { |
|
|
|
|
|
// 是否初始化过
|
|
|
|
|
|
if (this.isInitialized) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
// 初始化存储管理器
|
|
|
|
|
|
this.cache = new StorageManager({ prefix: namespace }); |
|
|
|
|
|
// 合并初始偏好设置
|
|
|
|
|
|
this.initialPreferences = merge({}, overrides, defaultPreferences); |
|
|
|
|
|
|
|
|
|
|
|
// 加载并合并当前存储的偏好设置
|
|
|
|
|
|
const mergedPreference = merge( |
|
|
|
|
|
{}, |
|
|
|
|
|
// overrides,
|
|
|
|
|
|
this.loadCachedPreferences() || {}, |
|
|
|
|
|
this.initialPreferences, |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
// 更新偏好设置
|
|
|
|
|
|
this.updatePreferences(mergedPreference); |
|
|
|
|
|
|
|
|
|
|
|
this.setupWatcher(); |
|
|
|
|
|
|
|
|
|
|
|
this.initPlatform(); |
|
|
|
|
|
// 标记为已初始化
|
|
|
|
|
|
this.isInitialized = true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 重置偏好设置 |
|
|
|
|
|
* 偏好设置将被重置为初始值,并从 localStorage 中移除。 |
|
|
|
|
|
* |
|
|
|
|
|
* @example |
|
|
|
|
|
* 假设 initialPreferences 为 { theme: 'light', language: 'en' } |
|
|
|
|
|
* 当前 state 为 { theme: 'dark', language: 'fr' } |
|
|
|
|
|
* this.resetPreferences(); |
|
|
|
|
|
* 调用后,state 将被重置为 { theme: 'light', language: 'en' } |
|
|
|
|
|
* 并且 localStorage 中的对应项将被移除 |
|
|
|
|
|
*/ |
|
|
|
|
|
resetPreferences() { |
|
|
|
|
|
// 将状态重置为初始偏好设置
|
|
|
|
|
|
Object.assign(this.state, this.initialPreferences); |
|
|
|
|
|
// 保存重置后的偏好设置
|
|
|
|
|
|
this.savePreferences(this.state); |
|
|
|
|
|
// 从存储中移除偏好设置项
|
|
|
|
|
|
[STORAGE_KEY, STORAGE_KEY_THEME, STORAGE_KEY_LOCALE].forEach((key) => { |
|
|
|
|
|
this.cache?.removeItem(key); |
|
|
|
|
|
}); |
|
|
|
|
|
this.updatePreferences(this.state); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 更新偏好设置 |
|
|
|
|
|
* @param updates - 要更新的偏好设置 |
|
|
|
|
|
*/ |
|
|
|
|
|
public updatePreferences(updates: DeepPartial<Preferences>) { |
|
|
|
|
|
const mergedState = merge({}, updates, markRaw(this.state)); |
|
|
|
|
|
|
|
|
|
|
|
Object.assign(this.state, mergedState); |
|
|
|
|
|
|
|
|
|
|
|
// 根据更新的键值执行相应的操作
|
|
|
|
|
|
this.handleUpdates(updates); |
|
|
|
|
|
this.savePreferences(this.state); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const preferencesManager = new PreferenceManager(); |
|
|
const preferencesManager = new PreferenceManager(); |
|
|
|