diff --git a/src/renderer/store/App.js b/src/renderer/store/App.js deleted file mode 100644 index 370a45e8..00000000 --- a/src/renderer/store/App.js +++ /dev/null @@ -1,123 +0,0 @@ -import { ipcRenderer } from 'electron' -import router from '@/router' -import { LightTheme, DarkTheme, SolarizedLightTheme, SolarizedDarkTheme, KimbieDarkTheme } from '@/utils/theme' -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' - -const App = { - namespaced: true, - state: { - theme: LightTheme, - fontSize: 14, - displayNameStyle: DisplayStyle.DisplayNameAndUsername.value, - notify: { - reply: true, - reblog: true, - favourite: true, - follow: true - }, - timeFormat: TimeFormat.Absolute.value, - language: Language.en.key, - defaultFonts: DefaultFonts, - ignoreCW: false, - ignoreNFSW: false, - hideAllAttachments: false - }, - mutations: { - updateTheme (state, themeColorList) { - state.theme = themeColorList - }, - updateFontSize (state, value) { - state.fontSize = value - }, - updateDisplayNameStyle (state, value) { - state.displayNameStyle = value - }, - updateNotify (state, notify) { - state.notify = notify - }, - updateTimeFormat (state, format) { - state.timeFormat = format - }, - updateLanguage (state, key) { - state.language = key - }, - addFont (state, font) { - const list = [font].concat(DefaultFonts) - state.defaultFonts = Array.from(new Set(list)) - }, - updateIgnoreCW (state, cw) { - state.ignoreCW = cw - }, - updateIgnoreNFSW (state, nfsw) { - state.ignoreNFSW = nfsw - }, - updateHideAllAttachments (state, hideAllAttachments) { - state.hideAllAttachments = hideAllAttachments - } - }, - actions: { - watchShortcutsEvents () { - ipcRenderer.on('open-preferences', () => { - router.push('/preferences/general') - }) - }, - removeShortcutsEvents () { - ipcRenderer.removeAllListeners('open-preferences') - }, - loadPreferences ({ commit, dispatch }) { - return new Promise((resolve, reject) => { - ipcRenderer.send('get-preferences') - ipcRenderer.once('error-get-preferences', (event, err) => { - ipcRenderer.removeAllListeners('response-get-preferences') - reject(err) - }) - ipcRenderer.once('response-get-preferences', (event, conf) => { - ipcRenderer.removeAllListeners('error-get-preferences') - dispatch('updateTheme', conf.appearance) - commit('updateDisplayNameStyle', conf.appearance.displayNameStyle) - commit('updateFontSize', conf.appearance.fontSize) - commit('updateNotify', conf.notification.notify) - commit('updateTimeFormat', conf.appearance.timeFormat) - commit('updateLanguage', conf.language.language) - commit('addFont', conf.appearance.font) - commit('updateIgnoreCW', conf.general.timeline.cw) - commit('updateIgnoreNFSW', conf.general.timeline.nfsw) - commit('updateHideAllAttachments', conf.general.timeline.hideAllAttachments) - resolve(conf) - }) - }) - }, - updateTheme ({ commit }, appearance) { - const themeKey = appearance.theme - switch (themeKey) { - case Theme.Light.key: - commit('updateTheme', LightTheme) - break - case Theme.Dark.key: - commit('updateTheme', DarkTheme) - break - case Theme.SolarizedLight.key: - commit('updateTheme', SolarizedLightTheme) - break - case Theme.SolarizedDark.key: - commit('updateTheme', SolarizedDarkTheme) - break - case Theme.KimbieDark.key: - commit('updateTheme', KimbieDarkTheme) - break - case Theme.Custom.key: - commit('updateTheme', appearance.customThemeColor) - break - default: - commit('updateTheme', LightTheme) - break - } - } - } -} - -export default App diff --git a/src/renderer/store/App.ts b/src/renderer/store/App.ts new file mode 100644 index 00000000..30a75396 --- /dev/null +++ b/src/renderer/store/App.ts @@ -0,0 +1,165 @@ +import { ipcRenderer } from 'electron' +import { MutationTree, ActionTree, Module } from 'vuex' +import router from '@/router' +import { LightTheme, DarkTheme, SolarizedLightTheme, SolarizedDarkTheme, KimbieDarkTheme } from '@/utils/theme' +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' + +export interface Notify { + reply: boolean, + reblog: boolean, + favourite: boolean, + follow: boolean +} + +export interface AppState { + theme: any, // TODO: type + fontSize: number, + displayNameStyle: number, + notify: Notify, + timeFormat: number, + language: string, + defaultFonts: Array, + ignoreCW: boolean, + ignoreNFSW: boolean, + hideAllAttachments: boolean +} + +const state = (): AppState => ({ + theme: LightTheme, + fontSize: 14, + displayNameStyle: DisplayStyle.DisplayNameAndUsername.value, + notify: { + reply: true, + reblog: true, + favourite: true, + follow: true + }, + timeFormat: TimeFormat.Absolute.value, + language: Language.en.key, + defaultFonts: DefaultFonts, + ignoreCW: false, + ignoreNFSW: false, + hideAllAttachments: false +}) + +const MUTATION_TYPES = { + UPDATE_THEME: 'updateTheme', + UPDATE_FONT_SIZE: 'updateFontSize', + UPDATE_DISPLAY_NAME_STYLE: 'updateDisplayNameStyle', + UPDATE_NOTIFY: 'updateNotify', + UPDATE_TIME_FORMAT: 'updateTimeFormat', + UPDATE_LANGUAGE: 'updateLanguage', + ADD_FONT: 'addFont', + UPDATE_IGNORE_CW: 'updateIgnoreCW', + UPDATE_IGNORE_NFSW: 'updateIgnoreNFSW', + UPDATE_HIDE_ALL_ATTACHMENTS: 'updateHideAllAttachments' +} + +const mutations: MutationTree = { + [MUTATION_TYPES.UPDATE_THEME]: (state: AppState, themeColorList: any) => { + 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_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_NFSW]: (state: AppState, nfsw: boolean) => { + state.ignoreNFSW = nfsw + }, + [MUTATION_TYPES.UPDATE_HIDE_ALL_ATTACHMENTS]: (state: AppState, hideAllAttachments: boolean) => { + state.hideAllAttachments = hideAllAttachments + } +} + +// TODO: use type of rootState +const actions: ActionTree = { + watchShortcutsEvents: () => { + ipcRenderer.on('open-preferences', () => { + router.push('/preferences/general') + }) + }, + removeShortcutsEvents: () => { + ipcRenderer.removeAllListeners('open-preferences') + }, + loadPreferences: ({ commit, dispatch }) => { + return new Promise((resolve, reject) => { + ipcRenderer.send('get-preferences') + ipcRenderer.once('error-get-preferences', (_, err) => { + ipcRenderer.removeAllListeners('response-get-preferences') + reject(err) + }) + ipcRenderer.once('response-get-preferences', (_, conf: any) => { + ipcRenderer.removeAllListeners('error-get-preferences') + dispatch('updateTheme', conf.appearance as any) + commit(MUTATION_TYPES.UPDATE_DISPLAY_NAME_STYLE, conf.appearance.displayNameStyle as number) + commit(MUTATION_TYPES.UPDATE_FONT_SIZE, conf.appearance.fontSize as number) + commit(MUTATION_TYPES.UPDATE_NOTIFY, conf.notification.notify as Notify) + commit(MUTATION_TYPES.UPDATE_TIME_FORMAT, conf.appearance.timeFormat as number) + commit(MUTATION_TYPES.UPDATE_LANGUAGE, conf.language.language as string) + commit(MUTATION_TYPES.ADD_FONT, conf.appearance.font as string) + commit(MUTATION_TYPES.UPDATE_IGNORE_CW, conf.general.timeline.cw as boolean) + commit(MUTATION_TYPES.UPDATE_IGNORE_NFSW, conf.general.timeline.nfsw as boolean) + commit(MUTATION_TYPES.UPDATE_HIDE_ALL_ATTACHMENTS, conf.general.timeline.hideAllAttachments as boolean) + resolve(conf) + }) + }) + }, + updateTheme: ({ commit }, appearance: any) => { + const themeKey = appearance.theme + switch (themeKey) { + 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 + } + } +} + +// TODO: use type of rootState +const App: Module = { + namespaced: true, + state: state, + mutations: mutations, + actions: actions +} + +export default App