2026-03-06 14:12:18 +08:00
|
|
|
export type ThemeMode = 'light' | 'dark' | 'system';
|
|
|
|
|
|
2026-05-18 14:31:54 +08:00
|
|
|
const THEME_MODE_STORAGE_KEY = 'mumulingsi_theme_mode';
|
|
|
|
|
const LEGACY_THEME_MODE_STORAGE_KEY = 'xinmi_theme_mode';
|
2026-03-06 14:12:18 +08:00
|
|
|
|
|
|
|
|
const isThemeMode = (value: string | null): value is ThemeMode => {
|
|
|
|
|
return value === 'light' || value === 'dark' || value === 'system';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const getStoredThemeMode = (): ThemeMode => {
|
|
|
|
|
try {
|
2026-05-18 14:31:54 +08:00
|
|
|
let value = localStorage.getItem(THEME_MODE_STORAGE_KEY);
|
|
|
|
|
if (!value) {
|
|
|
|
|
value = localStorage.getItem(LEGACY_THEME_MODE_STORAGE_KEY);
|
|
|
|
|
if (isThemeMode(value)) {
|
|
|
|
|
localStorage.setItem(THEME_MODE_STORAGE_KEY, value);
|
|
|
|
|
try {
|
|
|
|
|
localStorage.removeItem(LEGACY_THEME_MODE_STORAGE_KEY);
|
|
|
|
|
} catch {
|
|
|
|
|
// ignore
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-03-06 14:12:18 +08:00
|
|
|
if (isThemeMode(value)) {
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.warn('读取主题模式失败:', error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 'system';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const setStoredThemeMode = (mode: ThemeMode): void => {
|
|
|
|
|
try {
|
|
|
|
|
localStorage.setItem(THEME_MODE_STORAGE_KEY, mode);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.warn('保存主题模式失败:', error);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const getThemeModeStorageKey = (): string => THEME_MODE_STORAGE_KEY;
|