aboutsummaryrefslogtreecommitdiff
path: root/src/components/settings/settings.js
blob: c49083f9fc12bffb4bb9903add97044ba777c204 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* eslint-env browser */
import { filter, trim } from 'lodash'

import TabSwitcher from '../tab_switcher/tab_switcher.js'
import StyleSwitcher from '../style_switcher/style_switcher.vue'
import InterfaceLanguageSwitcher from '../interface_language_switcher/interface_language_switcher.vue'
import { extractCommit } from '../../services/version/version.service'
import { instanceDefaultProperties, defaultState as configDefaultState } from '../../modules/config.js'
import Checkbox from '../checkbox/checkbox.vue'

const pleromaFeCommitUrl = 'https://git.pleroma.social/pleroma/pleroma-fe/commit/'
const pleromaBeCommitUrl = 'https://git.pleroma.social/pleroma/pleroma/commit/'

const multiChoiceProperties = [
  'postContentType',
  'subjectLineBehavior'
]

const settings = {
  data () {
    const instance = this.$store.state.instance

    return {
      loopSilentAvailable:
        // Firefox
        Object.getOwnPropertyDescriptor(HTMLVideoElement.prototype, 'mozHasAudio') ||
        // Chrome-likes
        Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'webkitAudioDecodedByteCount') ||
        // Future spec, still not supported in Nightly 63 as of 08/2018
        Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'audioTracks'),

      backendVersion: instance.backendVersion,
      frontendVersion: instance.frontendVersion
    }
  },
  components: {
    TabSwitcher,
    StyleSwitcher,
    InterfaceLanguageSwitcher,
    Checkbox
  },
  computed: {
    user () {
      return this.$store.state.users.currentUser
    },
    currentSaveStateNotice () {
      return this.$store.state.interface.settings.currentSaveStateNotice
    },
    postFormats () {
      return this.$store.state.instance.postFormats || []
    },
    instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel },
    frontendVersionLink () {
      return pleromaFeCommitUrl + this.frontendVersion
    },
    backendVersionLink () {
      return pleromaBeCommitUrl + extractCommit(this.backendVersion)
    },
    // Getting localized values for instance-default properties
    ...instanceDefaultProperties
      .filter(key => multiChoiceProperties.includes(key))
      .map(key => [
        key + 'DefaultValue',
        function () {
          return this.$store.getters.instanceDefaultConfig[key]
        }
      ])
      .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
    ...instanceDefaultProperties
      .filter(key => !multiChoiceProperties.includes(key))
      .map(key => [
        key + 'LocalizedValue',
        function () {
          return this.$t('settings.values.' + this.$store.getters.instanceDefaultConfig[key])
        }
      ])
      .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
    // Generating computed values for vuex properties
    ...Object.keys(configDefaultState)
      .map(key => [key, {
        get () { return this.$store.getters.mergedConfig[key] },
        set (value) {
          this.$store.dispatch('setOption', { name: key, value })
        }
      }])
      .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
    // Special cases (need to transform values)
    muteWordsString: {
      get () { return this.$store.getters.mergedConfig.muteWords.join('\n') },
      set (value) {
        this.$store.dispatch('setOption', {
          name: 'muteWords',
          value: filter(value.split('\n'), (word) => trim(word).length > 0)
        })
      }
    }
  },
  // Updating nested properties
  watch: {
    notificationVisibility: {
      handler (value) {
        this.$store.dispatch('setOption', {
          name: 'notificationVisibility',
          value: this.$store.getters.mergedConfig.notificationVisibility
        })
      },
      deep: true
    }
  }
}

export default settings