11import { defineStore } from 'pinia' ;
2- import config from '@/config' ;
2+ import config , { type ThemeMode } from '@/config' ;
33
44const DARK_THEMES : ReadonlySet < string > = new Set ( [ 'PurpleThemeDark' ] ) ;
55
6- export const useCustomizerStore = defineStore ( "customizer" , {
6+ function resolveUiThemeFromMode ( mode : ThemeMode ) : string {
7+ if ( mode === 'dark' ) return 'PurpleThemeDark' ;
8+ if ( mode === 'light' ) return 'PurpleTheme' ;
9+ const prefersDark =
10+ typeof window !== 'undefined' &&
11+ window . matchMedia ( '(prefers-color-scheme: dark)' ) . matches ;
12+ return prefersDark ? 'PurpleThemeDark' : 'PurpleTheme' ;
13+ }
14+
15+ export const useCustomizerStore = defineStore ( 'customizer' , {
716 state : ( ) => ( {
817 Sidebar_drawer : config . Sidebar_drawer ,
918 Customizer_drawer : config . Customizer_drawer ,
1019 mini_sidebar : config . mini_sidebar ,
11- fontTheme : " Noto Sans SC" ,
20+ fontTheme : ' Noto Sans SC' ,
1221 uiTheme : config . uiTheme ,
22+ themeMode : config . themeMode as ThemeMode ,
1323 inputBg : config . inputBg ,
14- chatSidebarOpen : false // chat mode mobile sidebar state
24+ chatSidebarOpen : false , // chat mode mobile sidebar state
1525 } ) ,
1626
1727 getters : {
1828 isDark : ( state ) => state . uiTheme ? DARK_THEMES . has ( state . uiTheme ) : false ,
1929 } ,
30+
2031 actions : {
2132 SET_SIDEBAR_DRAWER ( ) {
2233 this . Sidebar_drawer = ! this . Sidebar_drawer ;
@@ -27,9 +38,31 @@ export const useCustomizerStore = defineStore("customizer", {
2738 SET_FONT ( payload : string ) {
2839 this . fontTheme = payload ;
2940 } ,
41+
42+ /**
43+ * 保留原有 action,兼容未改动的调用方。
44+ * 调用方传入 'PurpleTheme' 或 'PurpleThemeDark' 时,同时把
45+ * themeMode 推断并更新,保持两个字段一致。
46+ */
3047 SET_UI_THEME ( payload : string ) {
3148 this . uiTheme = payload ;
32- localStorage . setItem ( "uiTheme" , payload ) ;
49+ localStorage . setItem ( 'uiTheme' , payload ) ;
50+ // 同步推断 themeMode(仅在直接调用此 action 时用作兜底)
51+ const mode : ThemeMode = payload === 'PurpleThemeDark' ? 'dark' : 'light' ;
52+ this . themeMode = mode ;
53+ localStorage . setItem ( 'themeMode' , mode ) ;
54+ } ,
55+
56+ /**
57+ * 新 action:切换主题意图
58+ * 同时更新 themeMode、uiTheme 和 localStorage,Vuetify theme 由调用方负责。
59+ */
60+ SET_THEME_MODE ( mode : ThemeMode ) {
61+ this . themeMode = mode ;
62+ localStorage . setItem ( 'themeMode' , mode ) ;
63+ const uiTheme = resolveUiThemeFromMode ( mode ) ;
64+ this . uiTheme = uiTheme ;
65+ localStorage . setItem ( 'uiTheme' , uiTheme ) ;
3366 } ,
3467
3568 TOGGLE_CHAT_SIDEBAR ( ) {
@@ -38,5 +71,5 @@ export const useCustomizerStore = defineStore("customizer", {
3871 SET_CHAT_SIDEBAR ( payload : boolean ) {
3972 this . chatSidebarOpen = payload ;
4073 } ,
41- }
74+ } ,
4275} ) ;
0 commit comments