194 lines
5.6 KiB
JavaScript
194 lines
5.6 KiB
JavaScript
import { mapState } from 'vuex'
|
|
|
|
import FontControl from 'src/components/font_control/font_control.vue'
|
|
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
|
|
import ScopeSelector from 'src/components/scope_selector/scope_selector.vue'
|
|
import Select from 'src/components/select/select.vue'
|
|
import localeService from 'src/services/locale/locale.service.js'
|
|
import { cacheKey, clearCache, emojiCacheKey } from 'src/services/sw/sw.js'
|
|
import { useInstanceStore } from 'src/stores/instance.js'
|
|
import BooleanSetting from '../helpers/boolean_setting.vue'
|
|
import ChoiceSetting from '../helpers/choice_setting.vue'
|
|
import FloatSetting from '../helpers/float_setting.vue'
|
|
import IntegerSetting from '../helpers/integer_setting.vue'
|
|
import ProfileSettingIndicator from '../helpers/profile_setting_indicator.vue'
|
|
import SharedComputedObject from '../helpers/shared_computed_object.js'
|
|
import UnitSetting from '../helpers/unit_setting.vue'
|
|
|
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
|
import {
|
|
faDatabase,
|
|
faGlobe,
|
|
faMessage,
|
|
faPenAlt,
|
|
faSliders,
|
|
} from '@fortawesome/free-solid-svg-icons'
|
|
|
|
library.add(faGlobe, faMessage, faPenAlt, faDatabase, faSliders)
|
|
|
|
const ComposingTab = {
|
|
props: {
|
|
parentCollapsed: {
|
|
required: true,
|
|
type: Boolean,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
subjectLineOptions: ['email', 'noop', 'masto'].map((mode) => ({
|
|
key: mode,
|
|
value: mode,
|
|
label: this.$t(
|
|
`settings.subject_line_${mode === 'masto' ? 'mastodon' : mode}`,
|
|
),
|
|
})),
|
|
conversationDisplayOptions: ['tree', 'linear'].map((mode) => ({
|
|
key: mode,
|
|
value: mode,
|
|
label: this.$t(`settings.conversation_display_${mode}`),
|
|
})),
|
|
absoluteTime12hOptions: ['24h', '12h'].map((mode) => ({
|
|
key: mode,
|
|
value: mode,
|
|
label: this.$t(`settings.absolute_time_format_12h_${mode}`),
|
|
})),
|
|
conversationOtherRepliesButtonOptions: ['below', 'inside'].map(
|
|
(mode) => ({
|
|
key: mode,
|
|
value: mode,
|
|
label: this.$t(`settings.conversation_other_replies_button_${mode}`),
|
|
}),
|
|
),
|
|
mentionLinkDisplayOptions: ['short', 'full_for_remote', 'full'].map(
|
|
(mode) => ({
|
|
key: mode,
|
|
value: mode,
|
|
label: this.$t(`settings.mention_link_display_${mode}`),
|
|
}),
|
|
),
|
|
userPopoverAvatarActionOptions: ['close', 'zoom', 'open'].map((mode) => ({
|
|
key: mode,
|
|
value: mode,
|
|
label: this.$t(`settings.user_popover_avatar_action_${mode}`),
|
|
})),
|
|
unsavedPostActionOptions: ['save', 'discard', 'confirm'].map((mode) => ({
|
|
key: mode,
|
|
value: mode,
|
|
label: this.$t(`settings.unsaved_post_action_${mode}`),
|
|
})),
|
|
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',
|
|
),
|
|
emailLanguage: this.$store.state.users.currentUser.language || [''],
|
|
}
|
|
},
|
|
components: {
|
|
BooleanSetting,
|
|
ChoiceSetting,
|
|
IntegerSetting,
|
|
FloatSetting,
|
|
UnitSetting,
|
|
InterfaceLanguageSwitcher,
|
|
ProfileSettingIndicator,
|
|
ScopeSelector,
|
|
Select,
|
|
FontControl,
|
|
},
|
|
computed: {
|
|
postFormats() {
|
|
return useInstanceStore().postFormats || []
|
|
},
|
|
postContentOptions() {
|
|
return this.postFormats.map((format) => ({
|
|
key: format,
|
|
value: format,
|
|
label: this.$t(`post_status.content_type["${format}"]`),
|
|
}))
|
|
},
|
|
language: {
|
|
get: function () {
|
|
return this.$store.getters.mergedConfig.interfaceLanguage
|
|
},
|
|
set: function (val) {
|
|
this.$store.dispatch('setOption', {
|
|
name: 'interfaceLanguage',
|
|
value: val,
|
|
})
|
|
},
|
|
},
|
|
...SharedComputedObject(),
|
|
...mapState(useInstanceStore, {
|
|
blockExpirationSupported: (store) => store.featureSet.blockExpiration,
|
|
}),
|
|
},
|
|
methods: {
|
|
changeDefaultScope(value) {
|
|
this.$store.dispatch('setProfileOption', { name: 'defaultScope', value })
|
|
},
|
|
clearCache(key) {
|
|
clearCache(key)
|
|
.then(() => {
|
|
this.$store.dispatch('settingsSaved', { success: true })
|
|
})
|
|
.catch((error) => {
|
|
this.$store.dispatch('settingsSaved', { error })
|
|
})
|
|
},
|
|
tooSmall() {
|
|
this.$emit('tooSmall')
|
|
},
|
|
tooBig() {
|
|
this.$emit('tooBig')
|
|
},
|
|
getNavMode() {
|
|
return this.$refs.tabSwitcher.getNavMode()
|
|
},
|
|
clearAssetCache() {
|
|
this.clearCache(cacheKey)
|
|
},
|
|
clearEmojiCache() {
|
|
this.clearCache(emojiCacheKey)
|
|
},
|
|
updateProfile() {
|
|
const params = {
|
|
language: localeService.internalToBackendLocaleMulti(
|
|
this.emailLanguage,
|
|
),
|
|
}
|
|
|
|
this.$store.state.api.backendInteractor
|
|
.updateProfile({ params })
|
|
.then((user) => {
|
|
this.$store.commit('addNewUsers', [user])
|
|
this.$store.commit('setCurrentUser', user)
|
|
})
|
|
},
|
|
updateFont(key, value) {
|
|
this.$store.dispatch('setOption', {
|
|
name: 'theme3hacks',
|
|
value: {
|
|
...this.mergedConfig.theme3hacks,
|
|
fonts: {
|
|
...this.mergedConfig.theme3hacks.fonts,
|
|
[key]: value,
|
|
},
|
|
},
|
|
})
|
|
},
|
|
},
|
|
}
|
|
|
|
export default ComposingTab
|