akkoma-fe/src/modules/config.js

153 lines
4.4 KiB
JavaScript
Raw Normal View History

import { set, delete as del } from 'vue'
import { setPreset, applyTheme } from '../services/style_setter/style_setter.js'
import messages from '../i18n/messages'
const browserLocale = (window.navigator.language || 'en').split('-')[0]
/* TODO this is a bit messy.
* We need to declare settings with their types and also deal with
* instance-default settings in some way, hopefully try to avoid copy-pasta
* in general.
*/
export const multiChoiceProperties = [
'postContentType',
'subjectLineBehavior'
]
export const defaultState = {
2017-02-22 23:04:47 +00:00
colors: {},
theme: undefined,
customTheme: undefined,
customThemeSource: undefined,
hideISP: false,
2020-12-16 16:25:07 +00:00
hideInstanceWallpaper: false,
2021-06-14 19:42:56 +00:00
hideShoutbox: false,
// bad name: actually hides posts of muted USERS
hideMutedPosts: undefined, // instance default
2018-09-25 11:47:02 +00:00
collapseMessageWithSubject: undefined, // instance default
padEmoji: true,
2017-02-22 23:38:05 +00:00
hideAttachments: false,
hideAttachmentsInConv: false,
maxThumbnails: 16,
hideNsfw: true,
preloadImage: true,
loopVideo: true,
loopVideoSilentOnly: true,
streaming: false,
emojiReactionsOnTimeline: true,
2019-04-25 16:32:21 +00:00
autohideFloatingPostButton: false,
pauseOnUnfocused: true,
stopGifs: false,
replyVisibility: 'all',
notificationVisibility: {
follows: true,
mentions: true,
likes: true,
2019-12-10 15:00:10 +00:00
repeats: true,
moves: true,
2021-03-01 14:21:35 +00:00
emojiReactions: true,
2020-05-07 13:10:53 +00:00
followRequest: true,
chatMention: true
},
webPushNotifications: false,
muteWords: [],
highlight: {},
2018-09-25 11:47:02 +00:00
interfaceLanguage: browserLocale,
hideScopeNotice: false,
2019-12-10 19:30:27 +00:00
useStreamingApi: false,
sidebarRight: undefined, // instance default
2018-09-25 11:47:02 +00:00
scopeCopy: undefined, // instance default
subjectLineBehavior: undefined, // instance default
2019-02-05 11:57:11 +00:00
alwaysShowSubjectInput: undefined, // instance default
postContentType: undefined, // instance default
minimalScopesMode: undefined, // instance default
// This hides statuses filtered via a word filter
hideFilteredStatuses: undefined, // instance default
playVideosInModal: false,
useOneClickNsfw: false,
useContainFit: false,
2019-11-13 22:47:20 +00:00
greentext: undefined, // instance default
hidePostStats: undefined, // instance default
2020-09-29 10:18:37 +00:00
hideUserStats: undefined, // instance default
2021-02-23 08:00:23 +00:00
virtualScrolling: undefined, // instance default
2021-05-12 15:16:13 +00:00
sensitiveByDefault: undefined, // instance default
sensitiveIfSubject: undefined
}
// caching the instance default properties
export const instanceDefaultProperties = Object.entries(defaultState)
.filter(([key, value]) => value === undefined)
.map(([key, value]) => key)
const config = {
state: { ...defaultState },
getters: {
defaultConfig (state, getters, rootState, rootGetters) {
const { instance } = rootState
return {
...defaultState,
...Object.fromEntries(
instanceDefaultProperties.map(key => [key, instance[key]])
)
}
},
mergedConfig (state, getters, rootState, rootGetters) {
const { defaultConfig } = rootGetters
return {
...defaultConfig,
// Do not override with undefined
...Object.fromEntries(Object.entries(state).filter(([k, v]) => v !== undefined))
}
}
},
mutations: {
setOption (state, { name, value }) {
set(state, name, value)
},
setHighlight (state, { user, color, type }) {
const data = this.state.config.highlight[user]
if (color || type) {
set(state.highlight, user, { color: color || data.color, type: type || data.type })
} else {
del(state.highlight, user)
}
}
},
actions: {
2021-03-08 17:53:30 +00:00
loadSettings ({ dispatch }, data) {
2021-03-08 19:56:20 +00:00
const knownKeys = new Set(Object.keys(defaultState))
const presentKeys = new Set(Object.keys(data))
const intersection = new Set()
for (let elem of presentKeys) {
if (knownKeys.has(elem)) {
intersection.add(elem)
}
}
2021-03-08 19:56:20 +00:00
intersection.forEach(
2021-03-08 17:53:30 +00:00
name => dispatch('setOption', { name, value: data[name] })
)
},
setHighlight ({ commit, dispatch }, { user, color, type }) {
2019-07-05 07:02:14 +00:00
commit('setHighlight', { user, color, type })
},
setOption ({ commit, dispatch }, { name, value }) {
2019-07-05 07:02:14 +00:00
commit('setOption', { name, value })
switch (name) {
case 'theme':
setPreset(value)
break
case 'customTheme':
case 'customThemeSource':
applyTheme(value)
break
case 'interfaceLanguage':
messages.setLanguage(this.getters.i18n, value)
break
}
}
}
}
export default config