import { MutationTree , ActionTree , Module } from 'vuex' ; import router from '@/router' ; import { LightTheme , DarkTheme , SolarizedLightTheme , SolarizedDarkTheme , KimbieDarkTheme , ThemeColorType } from '~/src/constants/themeColor' ; import DisplayStyle from '~/src/constants/displayStyle' ; import Theme from '~/src/constants/theme' ; import TimeFormat from '~/src/constants/timeFormat' ; import Language from '~/src/constants/language' ; import DefaultFonts from '@/utils/fonts' ; import { RootState } from '@/store' ; import { Notify } from '~/src/types/notify' ; import { BaseConfig } from '~/src/types/preference' ; import { Appearance } from '~/src/types/appearance' ; import { MyWindow } from '~/src/types/global' ; const win = ( window as any ) as MyWindow ; export type AppState = { theme : ThemeColorType ; fontSize : number ; displayNameStyle : number ; notify : Notify ; timeFormat : number ; language : string ; defaultFonts : Array < string > ; ignoreCW : boolean ; ignoreNSFW : boolean ; hideAllAttachments : boolean ; tootPadding : number ; userAgent : string ; } ; const state = ( ) : AppState => ( { theme : LightTheme , fontSize : 14 , displayNameStyle : DisplayStyle . DisplayNameAndUsername . value , notify : { reply : true , reblog : true , favourite : true , follow : true , follow_request : true , reaction : true , status : true , poll_vote : true , poll_expired : true } , tootPadding : 8 , timeFormat : TimeFormat . Absolute . value , language : Language . en . key , defaultFonts : DefaultFonts , ignoreCW : false , ignoreNSFW : false , hideAllAttachments : false , userAgent : 'Whalebird' } ) ; const MUTATION_TYPES = { UPDATE_THEME : 'updateTheme' , UPDATE_FONT_SIZE : 'updateFontSize' , UPDATE_DISPLAY_NAME_STYLE : 'updateDisplayNameStyle' , UPDATE_NOTIFY : 'updateNotify' , UPDATE_TOOT_PADDING : 'updateTootPadding' , UPDATE_TIME_FORMAT : 'updateTimeFormat' , UPDATE_LANGUAGE : 'updateLanguage' , ADD_FONT : 'addFont' , UPDATE_IGNORE_CW : 'updateIgnoreCW' , UPDATE_IGNORE_NSFW : 'updateIgnoreNSFW' , UPDATE_HIDE_ALL_ATTACHMENTS : 'updateHideAllAttachments' } ; const mutations = { [ MUTATION_TYPES . UPDATE_THEME ] : ( state , themeColorList ) => { state . theme = themeColorList ; } , [ MUTATION_TYPES . UPDATE_FONT_SIZE ] : ( state , value ) => { state . fontSize = value ; } , [ MUTATION_TYPES . UPDATE_DISPLAY_NAME_STYLE ] : ( state , value ) => { state . displayNameStyle = value ; } , [ MUTATION_TYPES . UPDATE_NOTIFY ] : ( state , notify ) => { state . notify = notify ; } , [ MUTATION_TYPES . UPDATE_TOOT_PADDING ] : ( state , value ) => { state . tootPadding = value ; } , [ MUTATION_TYPES . UPDATE_TIME_FORMAT ] : ( state , format ) => { state . timeFormat = format ; } , [ MUTATION_TYPES . UPDATE_LANGUAGE ] : ( state , key ) => { state . language = key ; } , [ MUTATION_TYPES . ADD_FONT ] : ( state , font ) => { const list = [ font ] . concat ( DefaultFonts ) ; state . defaultFonts = Array . from ( new Set ( list ) ) ; } , [ MUTATION_TYPES . UPDATE_IGNORE_CW ] : ( state , cw ) => { state . ignoreCW = cw ; } , [ MUTATION_TYPES . UPDATE_IGNORE_NSFW ] : ( state , nsfw ) => { state . ignoreNSFW = nsfw ; } , [ MUTATION_TYPES . UPDATE_HIDE_ALL_ATTACHMENTS ] : ( state , hideAllAttachments ) => { state . hideAllAttachments = hideAllAttachments ; } } ; const actions = { watchShortcutsEvents : ( ) => { win . ipcRenderer . on ( 'open-preferences' , ( ) => { router . push ( '/preferences/general' ) ; } ) ; } , removeShortcutsEvents : ( ) => { win . ipcRenderer . removeAllListeners ( 'open-preferences' ) ; } , loadPreferences : async ( { commit , dispatch } ) => { const conf = await win . ipcRenderer . invoke ( 'get-preferences' ) ; await dispatch ( 'updateTheme' , conf . appearance ) ; commit ( MUTATION_TYPES . UPDATE_DISPLAY_NAME_STYLE , conf . appearance . displayNameStyle ) ; commit ( MUTATION_TYPES . UPDATE_FONT_SIZE , conf . appearance . fontSize ) ; commit ( MUTATION_TYPES . UPDATE_NOTIFY , conf . notification . notify ) ; commit ( MUTATION_TYPES . UPDATE_TIME_FORMAT , conf . appearance . timeFormat ) ; commit ( MUTATION_TYPES . UPDATE_LANGUAGE , conf . language . language ) ; commit ( MUTATION_TYPES . UPDATE_TOOT_PADDING , conf . appearance . tootPadding ) ; commit ( MUTATION_TYPES . ADD_FONT , conf . appearance . font ) ; commit ( MUTATION_TYPES . UPDATE_IGNORE_CW , conf . general . timeline . cw ) ; commit ( MUTATION_TYPES . UPDATE_IGNORE_NSFW , conf . general . timeline . nsfw ) ; commit ( MUTATION_TYPES . UPDATE_HIDE_ALL_ATTACHMENTS , conf . general . timeline . hideAllAttachments ) ; return conf ; } , updateTheme : async ( { commit } , appearance ) => { const themeKey = appearance . theme ; switch ( themeKey ) { case Theme . System . key : { const dark = await win . ipcRenderer . invoke ( 'system-use-dark-theme' ) ; if ( dark ) { commit ( MUTATION_TYPES . UPDATE_THEME , DarkTheme ) ; } else { commit ( MUTATION_TYPES . UPDATE_THEME , LightTheme ) ; } break ; } case Theme . Light . key : commit ( MUTATION_TYPES . UPDATE_THEME , LightTheme ) ; break ; case Theme . Dark . key : commit ( MUTATION_TYPES . UPDATE_THEME , DarkTheme ) ; break ; case Theme . SolarizedLight . key : commit ( MUTATION_TYPES . UPDATE_THEME , SolarizedLightTheme ) ; break ; case Theme . SolarizedDark . key : commit ( MUTATION_TYPES . UPDATE_THEME , SolarizedDarkTheme ) ; break ; case Theme . KimbieDark . key : commit ( MUTATION_TYPES . UPDATE_THEME , KimbieDarkTheme ) ; break ; case Theme . Custom . key : commit ( MUTATION_TYPES . UPDATE_THEME , appearance . customThemeColor ) ; break ; default : commit ( MUTATION_TYPES . UPDATE_THEME , LightTheme ) ; break ; } } } ; const App = { namespaced : true , state : state , mutations : mutations , actions : actions } ; export default App ;