settings.js (4479B)
1 /* eslint-env browser */
2 import { filter, trim } from 'lodash'
3
4 import TabSwitcher from '../tab_switcher/tab_switcher.js'
5 import StyleSwitcher from '../style_switcher/style_switcher.vue'
6 import InterfaceLanguageSwitcher from '../interface_language_switcher/interface_language_switcher.vue'
7 import { extractCommit } from '../../services/version/version.service'
8 import { instanceDefaultProperties, defaultState as configDefaultState } from '../../modules/config.js'
9 import Checkbox from '../checkbox/checkbox.vue'
10
11 const pleromaFeCommitUrl = 'https://git.pleroma.social/pleroma/pleroma-fe/commit/'
12 const pleromaBeCommitUrl = 'https://git.pleroma.social/pleroma/pleroma/commit/'
13
14 const multiChoiceProperties = [
15 'postContentType',
16 'subjectLineBehavior'
17 ]
18
19 const settings = {
20 data () {
21 const instance = this.$store.state.instance
22
23 return {
24 loopSilentAvailable:
25 // Firefox
26 Object.getOwnPropertyDescriptor(HTMLVideoElement.prototype, 'mozHasAudio') ||
27 // Chrome-likes
28 Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'webkitAudioDecodedByteCount') ||
29 // Future spec, still not supported in Nightly 63 as of 08/2018
30 Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'audioTracks'),
31
32 backendVersion: instance.backendVersion,
33 frontendVersion: instance.frontendVersion
34 }
35 },
36 components: {
37 TabSwitcher,
38 StyleSwitcher,
39 InterfaceLanguageSwitcher,
40 Checkbox
41 },
42 computed: {
43 user () {
44 return this.$store.state.users.currentUser
45 },
46 currentSaveStateNotice () {
47 return this.$store.state.interface.settings.currentSaveStateNotice
48 },
49 postFormats () {
50 return this.$store.state.instance.postFormats || []
51 },
52 instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel },
53 frontendVersionLink () {
54 return pleromaFeCommitUrl + this.frontendVersion
55 },
56 backendVersionLink () {
57 return pleromaBeCommitUrl + extractCommit(this.backendVersion)
58 },
59 // Getting localized values for instance-default properties
60 ...instanceDefaultProperties
61 .filter(key => multiChoiceProperties.includes(key))
62 .map(key => [
63 key + 'DefaultValue',
64 function () {
65 return this.$store.getters.instanceDefaultConfig[key]
66 }
67 ])
68 .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
69 ...instanceDefaultProperties
70 .filter(key => !multiChoiceProperties.includes(key))
71 .map(key => [
72 key + 'LocalizedValue',
73 function () {
74 return this.$t('settings.values.' + this.$store.getters.instanceDefaultConfig[key])
75 }
76 ])
77 .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
78 // Generating computed values for vuex properties
79 ...Object.keys(configDefaultState)
80 .map(key => [key, {
81 get () { return this.$store.getters.mergedConfig[key] },
82 set (value) {
83 this.$store.dispatch('setOption', { name: key, value })
84 }
85 }])
86 .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
87 // Special cases (need to transform values or perform actions first)
88 muteWordsString: {
89 get () { return this.$store.getters.mergedConfig.muteWords.join('\n') },
90 set (value) {
91 this.$store.dispatch('setOption', {
92 name: 'muteWords',
93 value: filter(value.split('\n'), (word) => trim(word).length > 0)
94 })
95 }
96 },
97 useStreamingApi: {
98 get () { return this.$store.getters.mergedConfig.useStreamingApi },
99 set (value) {
100 const promise = value
101 ? this.$store.dispatch('enableMastoSockets')
102 : this.$store.dispatch('disableMastoSockets')
103
104 promise.then(() => {
105 this.$store.dispatch('setOption', { name: 'useStreamingApi', value })
106 }).catch((e) => {
107 console.error('Failed starting MastoAPI Streaming socket', e)
108 this.$store.dispatch('disableMastoSockets')
109 this.$store.dispatch('setOption', { name: 'useStreamingApi', value: false })
110 })
111 }
112 }
113 },
114 // Updating nested properties
115 watch: {
116 notificationVisibility: {
117 handler (value) {
118 this.$store.dispatch('setOption', {
119 name: 'notificationVisibility',
120 value: this.$store.getters.mergedConfig.notificationVisibility
121 })
122 },
123 deep: true
124 }
125 }
126 }
127
128 export default settings