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 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: MutationTree = { [MUTATION_TYPES.UPDATE_THEME]: (state: AppState, themeColorList: ThemeColorType) => { state.theme = themeColorList }, [MUTATION_TYPES.UPDATE_FONT_SIZE]: (state: AppState, value: number) => { state.fontSize = value }, [MUTATION_TYPES.UPDATE_DISPLAY_NAME_STYLE]: (state: AppState, value: number) => { state.displayNameStyle = value }, [MUTATION_TYPES.UPDATE_NOTIFY]: (state: AppState, notify: Notify) => { state.notify = notify }, [MUTATION_TYPES.UPDATE_TOOT_PADDING]: (state: AppState, value: number) => { state.tootPadding = value }, [MUTATION_TYPES.UPDATE_TIME_FORMAT]: (state: AppState, format: number) => { state.timeFormat = format }, [MUTATION_TYPES.UPDATE_LANGUAGE]: (state: AppState, key: string) => { state.language = key }, [MUTATION_TYPES.ADD_FONT]: (state: AppState, font: string) => { const list = [font].concat(DefaultFonts) state.defaultFonts = Array.from(new Set(list)) }, [MUTATION_TYPES.UPDATE_IGNORE_CW]: (state: AppState, cw: boolean) => { state.ignoreCW = cw }, [MUTATION_TYPES.UPDATE_IGNORE_NSFW]: (state: AppState, nsfw: boolean) => { state.ignoreNSFW = nsfw }, [MUTATION_TYPES.UPDATE_HIDE_ALL_ATTACHMENTS]: (state: AppState, hideAllAttachments: boolean) => { state.hideAllAttachments = hideAllAttachments } } const actions: ActionTree = { watchShortcutsEvents: () => { win.ipcRenderer.on('open-preferences', () => { router.push('/preferences/general') }) }, removeShortcutsEvents: () => { win.ipcRenderer.removeAllListeners('open-preferences') }, loadPreferences: async ({ commit, dispatch }) => { const conf: BaseConfig = 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: Appearance) => { const themeKey: string = appearance.theme switch (themeKey) { case Theme.System.key: { const dark: boolean = 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: Module = { namespaced: true, state: state, mutations: mutations, actions: actions } export default App