serverSideConfig renamed into profileSettingConfig to avoid confusion

with serverSideStorage, reduced overall need for SharedComputedObject in
settings tabs, moved copypaste code of "setting" type of helpers into a
separate file.
This commit is contained in:
Henry Jameson 2023-03-12 14:32:13 +02:00
parent 8abaf8fa37
commit af0cd54223
17 changed files with 177 additions and 248 deletions

View File

@ -1,56 +1,13 @@
import { get, set } from 'lodash'
import Checkbox from 'src/components/checkbox/checkbox.vue' import Checkbox from 'src/components/checkbox/checkbox.vue'
import ModifiedIndicator from './modified_indicator.vue' import ModifiedIndicator from './modified_indicator.vue'
import ServerSideIndicator from './server_side_indicator.vue' import ProfileSettingIndicator from './profile_setting_indicator.vue'
import Setting from './setting.js'
export default { export default {
components: { components: {
Checkbox, Checkbox,
ModifiedIndicator, ModifiedIndicator,
ServerSideIndicator ProfileSettingIndicator
}, },
props: [ ...Setting
'path',
'disabled',
'expert'
],
computed: {
pathDefault () {
const [firstSegment, ...rest] = this.path.split('.')
return [firstSegment + 'DefaultValue', ...rest].join('.')
},
state () {
const value = get(this.$parent, this.path)
if (value === undefined) {
return this.defaultState
} else {
return value
}
},
defaultState () {
return get(this.$parent, this.pathDefault)
},
isServerSide () {
return this.path.startsWith('serverSide_')
},
isChanged () {
return !this.path.startsWith('serverSide_') && this.state !== this.defaultState
},
matchesExpertLevel () {
return (this.expert || 0) <= this.$parent.expertLevel
}
},
methods: {
update (e) {
const [firstSegment, ...rest] = this.path.split('.')
set(this.$parent, this.path, e)
// Updating nested properties does not trigger update on its parent.
// probably still not as reliable, but works for depth=1 at least
if (rest.length > 0) {
set(this.$parent, firstSegment, { ...get(this.$parent, firstSegment) })
}
},
reset () {
set(this.$parent, this.path, this.defaultState)
}
}
} }

View File

@ -5,7 +5,7 @@
> >
<Checkbox <Checkbox
:model-value="state" :model-value="state"
:disabled="disabled" :disabled="shouldBeDisabled"
@update:modelValue="update" @update:modelValue="update"
> >
<span <span
@ -19,7 +19,7 @@
:changed="isChanged" :changed="isChanged"
:onclick="reset" :onclick="reset"
/> />
<ServerSideIndicator :server-side="isServerSide" /> <ProfileSettingIndicator :is-profile="isProfileTied" />
</Checkbox> </Checkbox>
</label> </label>
</template> </template>

View File

@ -1,51 +1,20 @@
import { get, set } from 'lodash'
import Select from 'src/components/select/select.vue' import Select from 'src/components/select/select.vue'
import ModifiedIndicator from './modified_indicator.vue' import ModifiedIndicator from './modified_indicator.vue'
import ServerSideIndicator from './server_side_indicator.vue' import ProfileSettingIndicator from './profile_setting_indicator.vue'
import Setting from './setting.js'
export default { export default {
components: { components: {
Select, Select,
ModifiedIndicator, ModifiedIndicator,
ServerSideIndicator ProfileSettingIndicator
}, },
props: [ ...Setting,
'path', props: {
'disabled', ...Setting.props,
'options', options: {
'expert' type: Array,
], required: true
computed: {
pathDefault () {
const [firstSegment, ...rest] = this.path.split('.')
return [firstSegment + 'DefaultValue', ...rest].join('.')
},
state () {
const value = get(this.$parent, this.path)
if (value === undefined) {
return this.defaultState
} else {
return value
}
},
defaultState () {
return get(this.$parent, this.pathDefault)
},
isServerSide () {
return this.path.startsWith('serverSide_')
},
isChanged () {
return !this.path.startsWith('serverSide_') && this.state !== this.defaultState
},
matchesExpertLevel () {
return (this.expert || 0) <= this.$parent.expertLevel
}
},
methods: {
update (e) {
set(this.$parent, this.path, e)
},
reset () {
set(this.$parent, this.path, this.defaultState)
} }
} }
} }

View File

@ -23,7 +23,7 @@
:changed="isChanged" :changed="isChanged"
:onclick="reset" :onclick="reset"
/> />
<ServerSideIndicator :server-side="isServerSide" /> <ProfileSettingIndicator :is-profile="isProfileSetting" />
</label> </label>
</template> </template>

View File

@ -1,44 +1,15 @@
import { get, set } from 'lodash'
import ModifiedIndicator from './modified_indicator.vue' import ModifiedIndicator from './modified_indicator.vue'
import Setting from './setting.js'
export default { export default {
components: { components: {
ModifiedIndicator ModifiedIndicator
}, },
props: { ...Setting,
path: String,
disabled: Boolean,
min: Number,
expert: [Number, String]
},
computed: {
pathDefault () {
const [firstSegment, ...rest] = this.path.split('.')
return [firstSegment + 'DefaultValue', ...rest].join('.')
},
state () {
const value = get(this.$parent, this.path)
if (value === undefined) {
return this.defaultState
} else {
return value
}
},
defaultState () {
return get(this.$parent, this.pathDefault)
},
isChanged () {
return this.state !== this.defaultState
},
matchesExpertLevel () {
return (this.expert || 0) <= this.$parent.expertLevel
}
},
methods: { methods: {
...Setting.methods,
update (e) { update (e) {
set(this.$parent, this.path, parseInt(e.target.value)) this.configSink(this.path, parseInt(e.target.value))
},
reset () {
set(this.$parent, this.path, this.defaultState)
} }
} }
} }

View File

@ -1,7 +1,7 @@
<template> <template>
<span <span
v-if="serverSide" v-if="isProfile"
class="ServerSideIndicator" class="ProfileSettingIndicator"
> >
<Popover <Popover
trigger="hover" trigger="hover"
@ -14,7 +14,7 @@
/> />
</template> </template>
<template #content> <template #content>
<div class="serverside-tooltip"> <div class="profilesetting-tooltip">
{{ $t('settings.setting_server_side') }} {{ $t('settings.setting_server_side') }}
</div> </div>
</template> </template>
@ -33,17 +33,17 @@ library.add(
export default { export default {
components: { Popover }, components: { Popover },
props: ['serverSide'] props: ['isProfile']
} }
</script> </script>
<style lang="scss"> <style lang="scss">
.ServerSideIndicator { .ProfileSettingIndicator {
display: inline-block; display: inline-block;
position: relative; position: relative;
} }
.serverside-tooltip { .profilesetting-tooltip {
margin: 0.5em 1em; margin: 0.5em 1em;
min-width: 10em; min-width: 10em;
text-align: center; text-align: center;

View File

@ -0,0 +1,84 @@
import { get, set } from 'lodash'
export default {
props: {
path: {
type: String,
required: true
},
disabled: {
type: Boolean,
default: false
},
parentPath: {
type: String
},
parentInvert: {
type: Boolean,
default: false
},
expert: {
type: [Number, String],
default: 0
},
source: {
type: String,
default: 'default'
}
},
computed: {
state () {
const value = get(this.configSource, this.path)
if (value === undefined) {
return this.defaultState
} else {
return value
}
},
shouldBeDisabled () {
const parentValue = this.parentPath !== undefined ? get(this.configSource, this.parentPath) : null
return this.disabled || (parentValue !== null ? (this.parentInvert ? parentValue : !parentValue) : false)
},
configSource () {
switch (this.source) {
case 'profile':
return this.$store.state.profileConfig
default:
return this.$store.getters.mergedConfig
}
},
configSink () {
switch (this.source) {
case 'profile':
return (k, v) => this.$store.dispatch('setProfileOption', { name: k, value: v })
default:
return (k, v) => this.$store.dispatch('setOption', { name: k, value: v })
}
},
defaultState () {
switch (this.source) {
case 'profile':
return {}
default:
return get(this.$store.getters.defaultConfig, this.path)
}
},
isProfileTied () {
return this.source === 'profile'
},
isChanged () {
return !this.source === 'default' && this.state !== this.defaultState
},
matchesExpertLevel () {
return (this.expert || 0) <= this.$store.state.config.expertLevel > 0
}
},
methods: {
update (e) {
console.log('U', this.path, e)
this.configSink(this.path, e)
},
reset () {
set(this.$store.getters.mergedConfig, this.path, this.defaultState)
}
}
}

View File

@ -1,19 +1,9 @@
import { defaultState as configDefaultState } from 'src/modules/config.js' import { defaultState as configDefaultState } from 'src/modules/config.js'
import { defaultState as serverSideConfigDefaultState } from 'src/modules/serverSideConfig.js'
const SharedComputedObject = () => ({ const SharedComputedObject = () => ({
user () { user () {
return this.$store.state.users.currentUser return this.$store.state.users.currentUser
}, },
// Getting values for default properties
...Object.keys(configDefaultState)
.map(key => [
key + 'DefaultValue',
function () {
return this.$store.getters.defaultConfig[key]
}
])
.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
// Generating computed values for vuex properties // Generating computed values for vuex properties
...Object.keys(configDefaultState) ...Object.keys(configDefaultState)
.map(key => [key, { .map(key => [key, {
@ -23,14 +13,6 @@ const SharedComputedObject = () => ({
} }
}]) }])
.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}), .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
...Object.keys(serverSideConfigDefaultState)
.map(key => ['serverSide_' + key, {
get () { return this.$store.state.serverSideConfig[key] },
set (value) {
this.$store.dispatch('setServerSideOption', { name: key, value })
}
}])
.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
// Special cases (need to transform values or perform actions first) // Special cases (need to transform values or perform actions first)
useStreamingApi: { useStreamingApi: {
get () { return this.$store.getters.mergedConfig.useStreamingApi }, get () { return this.$store.getters.mergedConfig.useStreamingApi },

View File

@ -1,6 +1,6 @@
import { get, set } from 'lodash'
import ModifiedIndicator from './modified_indicator.vue' import ModifiedIndicator from './modified_indicator.vue'
import Select from 'src/components/select/select.vue' import Select from 'src/components/select/select.vue'
import Setting from './setting.js'
export const allCssUnits = ['cm', 'mm', 'in', 'px', 'pt', 'pc', 'em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', '%'] export const allCssUnits = ['cm', 'mm', 'in', 'px', 'pt', 'pc', 'em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', '%']
export const defaultHorizontalUnits = ['px', 'rem', 'vw'] export const defaultHorizontalUnits = ['px', 'rem', 'vw']
@ -11,57 +11,31 @@ export default {
ModifiedIndicator, ModifiedIndicator,
Select Select
}, },
...Setting,
props: { props: {
path: String, ...Setting.props,
disabled: Boolean,
min: Number, min: Number,
units: { units: {
type: [String], type: Array,
default: () => allCssUnits default: () => allCssUnits
},
expert: [Number, String]
},
computed: {
pathDefault () {
const [firstSegment, ...rest] = this.path.split('.')
return [firstSegment + 'DefaultValue', ...rest].join('.')
},
stateUnit () {
return (this.state || '').replace(/\d+/, '')
},
stateValue () {
return (this.state || '').replace(/\D+/, '')
},
state () {
const value = get(this.$parent, this.path)
if (value === undefined) {
return this.defaultState
} else {
return value
} }
}, },
defaultState () { computed: {
return get(this.$parent, this.pathDefault) ...Setting.computed,
stateUnit () {
return this.state.replace(/\d+/, '')
}, },
isChanged () { stateValue () {
return this.state !== this.defaultState return this.state.replace(/\D+/, '')
},
matchesExpertLevel () {
return (this.expert || 0) <= this.$parent.expertLevel
} }
}, },
methods: { methods: {
update (e) { ...Setting.methods,
set(this.$parent, this.path, e)
},
reset () {
set(this.$parent, this.path, this.defaultState)
},
updateValue (e) { updateValue (e) {
set(this.$parent, this.path, parseInt(e.target.value) + this.stateUnit) this.configSink(this.path, parseInt(e.target.value) + this.stateUnit)
}, },
updateUnit (e) { updateUnit (e) {
set(this.$parent, this.path, this.stateValue + e.target.value) this.configSink(this.path, this.stateValue + e.target.value)
} }
} }
} }

View File

@ -7,13 +7,11 @@
<BooleanSetting path="hideFilteredStatuses"> <BooleanSetting path="hideFilteredStatuses">
{{ $t('settings.hide_filtered_statuses') }} {{ $t('settings.hide_filtered_statuses') }}
</BooleanSetting> </BooleanSetting>
<ul <ul class="setting-list suboptions">
class="setting-list suboptions"
:class="[{disabled: !streaming}]"
>
<li> <li>
<BooleanSetting <BooleanSetting
:disabled="hideFilteredStatuses" parentPath="hideFilteredStatuses"
:parentInvert="true"
path="hideWordFilteredPosts" path="hideWordFilteredPosts"
> >
{{ $t('settings.hide_wordfiltered_statuses') }} {{ $t('settings.hide_wordfiltered_statuses') }}
@ -22,7 +20,8 @@
<li> <li>
<BooleanSetting <BooleanSetting
v-if="user" v-if="user"
:disabled="hideFilteredStatuses" parentPath="hideFilteredStatuses"
:parentInvert="true"
path="hideMutedThreads" path="hideMutedThreads"
> >
{{ $t('settings.hide_muted_threads') }} {{ $t('settings.hide_muted_threads') }}
@ -31,7 +30,8 @@
<li> <li>
<BooleanSetting <BooleanSetting
v-if="user" v-if="user"
:disabled="hideFilteredStatuses" parentPath="hideFilteredStatuses"
:parentInvert="true"
path="hideMutedPosts" path="hideMutedPosts"
> >
{{ $t('settings.hide_muted_posts') }} {{ $t('settings.hide_muted_posts') }}

View File

@ -6,7 +6,7 @@ import SizeSetting, { defaultHorizontalUnits } from '../helpers/size_setting.vue
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue' import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
import SharedComputedObject from '../helpers/shared_computed_object.js' import SharedComputedObject from '../helpers/shared_computed_object.js'
import ServerSideIndicator from '../helpers/server_side_indicator.vue' import ProfileSettingIndicator from '../helpers/profile_setting_indicator.vue'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
faGlobe faGlobe
@ -65,7 +65,7 @@ const GeneralTab = {
SizeSetting, SizeSetting,
InterfaceLanguageSwitcher, InterfaceLanguageSwitcher,
ScopeSelector, ScopeSelector,
ServerSideIndicator ProfileSettingIndicator
}, },
computed: { computed: {
horizontalUnits () { horizontalUnits () {
@ -108,7 +108,7 @@ const GeneralTab = {
}, },
methods: { methods: {
changeDefaultScope (value) { changeDefaultScope (value) {
this.$store.dispatch('setServerSideOption', { name: 'defaultScope', value }) this.$store.dispatch('setProfileOption', { name: 'defaultScope', value })
} }
} }
} }

View File

@ -29,14 +29,11 @@
<BooleanSetting path="streaming"> <BooleanSetting path="streaming">
{{ $t('settings.streaming') }} {{ $t('settings.streaming') }}
</BooleanSetting> </BooleanSetting>
<ul <ul class="setting-list suboptions">
class="setting-list suboptions"
:class="[{disabled: !streaming}]"
>
<li> <li>
<BooleanSetting <BooleanSetting
path="pauseOnUnfocused" path="pauseOnUnfocused"
:disabled="!streaming" parentPath="streaming"
> >
{{ $t('settings.pause_on_unfocused') }} {{ $t('settings.pause_on_unfocused') }}
</BooleanSetting> </BooleanSetting>
@ -265,7 +262,7 @@
<li> <li>
<BooleanSetting <BooleanSetting
v-if="user" v-if="user"
path="serverSide_stripRichContent" source="profile" path="stripRichContent"
expert="1" expert="1"
> >
{{ $t('settings.no_rich_text_description') }} {{ $t('settings.no_rich_text_description') }}
@ -290,7 +287,7 @@
<BooleanSetting <BooleanSetting
path="preloadImage" path="preloadImage"
expert="1" expert="1"
:disabled="!hideNsfw" parentPath="hideNsfw"
> >
{{ $t('settings.preload_images') }} {{ $t('settings.preload_images') }}
</BooleanSetting> </BooleanSetting>
@ -299,7 +296,7 @@
<BooleanSetting <BooleanSetting
path="useOneClickNsfw" path="useOneClickNsfw"
expert="1" expert="1"
:disabled="!hideNsfw" parentPath="hideNsfw"
> >
{{ $t('settings.use_one_click_nsfw') }} {{ $t('settings.use_one_click_nsfw') }}
</BooleanSetting> </BooleanSetting>
@ -312,15 +309,13 @@
> >
{{ $t('settings.loop_video') }} {{ $t('settings.loop_video') }}
</BooleanSetting> </BooleanSetting>
<ul <ul class="setting-list suboptions">
class="setting-list suboptions"
:class="[{disabled: !streaming}]"
>
<li> <li>
<BooleanSetting <BooleanSetting
path="loopVideoSilentOnly" path="loopVideoSilentOnly"
expert="1" expert="1"
:disabled="!loopVideo || !loopSilentAvailable" parentPath="loopVideo"
:disabled="!loopSilentAvailable"
> >
{{ $t('settings.loop_video_silent_only') }} {{ $t('settings.loop_video_silent_only') }}
</BooleanSetting> </BooleanSetting>
@ -418,18 +413,18 @@
<ul class="setting-list"> <ul class="setting-list">
<li> <li>
<label for="default-vis"> <label for="default-vis">
{{ $t('settings.default_vis') }} <ServerSideIndicator :server-side="true" /> {{ $t('settings.default_vis') }} <ProfileSettingIndicator :is-profile="true" />
<ScopeSelector <ScopeSelector
class="scope-selector" class="scope-selector"
:show-all="true" :show-all="true"
:user-default="serverSide_defaultScope" :user-default="$store.state.profileConfig.defaultScope"
:initial-scope="serverSide_defaultScope" :initial-scope="$store.state.profileConfig.defaultScope"
:on-scope-change="changeDefaultScope" :on-scope-change="changeDefaultScope"
/> />
</label> </label>
</li> </li>
<li> <li>
<!-- <BooleanSetting path="serverSide_defaultNSFW"> --> <!-- <BooleanSetting source="profile" path="defaultNSFW"> -->
<BooleanSetting path="sensitiveByDefault"> <BooleanSetting path="sensitiveByDefault">
{{ $t('settings.sensitive_by_default') }} {{ $t('settings.sensitive_by_default') }}
</BooleanSetting> </BooleanSetting>

View File

@ -4,7 +4,7 @@
<h2>{{ $t('settings.notification_setting_filters') }}</h2> <h2>{{ $t('settings.notification_setting_filters') }}</h2>
<ul class="setting-list"> <ul class="setting-list">
<li> <li>
<BooleanSetting path="serverSide_blockNotificationsFromStrangers"> <BooleanSetting source="profile" path="blockNotificationsFromStrangers">
{{ $t('settings.notification_setting_block_from_strangers') }} {{ $t('settings.notification_setting_block_from_strangers') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
@ -67,7 +67,7 @@
</li> </li>
<li> <li>
<BooleanSetting <BooleanSetting
path="serverSide_webPushHideContents" source="profile" path="webPushHideContents"
expert="1" expert="1"
> >
{{ $t('settings.notification_setting_hide_notification_contents') }} {{ $t('settings.notification_setting_hide_notification_contents') }}

View File

@ -254,37 +254,35 @@
<h2>{{ $t('settings.account_privacy') }}</h2> <h2>{{ $t('settings.account_privacy') }}</h2>
<ul class="setting-list"> <ul class="setting-list">
<li> <li>
<BooleanSetting path="serverSide_locked"> <BooleanSetting source="profile" path="locked">
{{ $t('settings.lock_account_description') }} {{ $t('settings.lock_account_description') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<li> <li>
<BooleanSetting path="serverSide_discoverable"> <BooleanSetting source="profile" path="discoverable">
{{ $t('settings.discoverable') }} {{ $t('settings.discoverable') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<li> <li>
<BooleanSetting path="serverSide_allowFollowingMove"> <BooleanSetting source="profile" path="allowFollowingMove">
{{ $t('settings.allow_following_move') }} {{ $t('settings.allow_following_move') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<li> <li>
<BooleanSetting path="serverSide_hideFavorites"> <BooleanSetting source="profile" path="hideFavorites">
{{ $t('settings.hide_favorites_description') }} {{ $t('settings.hide_favorites_description') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<li> <li>
<BooleanSetting path="serverSide_hideFollowers"> <BooleanSetting source="profile" path="hideFollowers">
{{ $t('settings.hide_followers_description') }} {{ $t('settings.hide_followers_description') }}
</BooleanSetting> </BooleanSetting>
<ul <ul class="setting-list suboptions">
class="setting-list suboptions"
:class="[{disabled: !serverSide_hideFollowers}]"
>
<li> <li>
<BooleanSetting <BooleanSetting
path="serverSide_hideFollowersCount" source="profile"
:disabled="!serverSide_hideFollowers" path="hideFollowersCount"
parentPath="hideFollowers"
> >
{{ $t('settings.hide_followers_count_description') }} {{ $t('settings.hide_followers_count_description') }}
</BooleanSetting> </BooleanSetting>
@ -292,17 +290,15 @@
</ul> </ul>
</li> </li>
<li> <li>
<BooleanSetting path="serverSide_hideFollows"> <BooleanSetting source="profile" path="hideFollows">
{{ $t('settings.hide_follows_description') }} {{ $t('settings.hide_follows_description') }}
</BooleanSetting> </BooleanSetting>
<ul <ul class="setting-list suboptions">
class="setting-list suboptions"
:class="[{disabled: !serverSide_hideFollows}]"
>
<li> <li>
<BooleanSetting <BooleanSetting
path="serverSide_hideFollowsCount" source="profile"
:disabled="!serverSide_hideFollows" path="hideFollowsCount"
parentPath="hideFollows"
> >
{{ $t('settings.hide_follows_count_description') }} {{ $t('settings.hide_follows_count_description') }}
</BooleanSetting> </BooleanSetting>

View File

@ -10,7 +10,7 @@ import listsModule from './modules/lists.js'
import usersModule from './modules/users.js' import usersModule from './modules/users.js'
import apiModule from './modules/api.js' import apiModule from './modules/api.js'
import configModule from './modules/config.js' import configModule from './modules/config.js'
import serverSideConfigModule from './modules/serverSideConfig.js' import profileConfigModule from './modules/profileConfig.js'
import serverSideStorageModule from './modules/serverSideStorage.js' import serverSideStorageModule from './modules/serverSideStorage.js'
import shoutModule from './modules/shout.js' import shoutModule from './modules/shout.js'
import oauthModule from './modules/oauth.js' import oauthModule from './modules/oauth.js'
@ -80,7 +80,7 @@ const persistedStateOptions = {
lists: listsModule, lists: listsModule,
api: apiModule, api: apiModule,
config: configModule, config: configModule,
serverSideConfig: serverSideConfigModule, profileConfig: profileConfigModule,
serverSideStorage: serverSideStorageModule, serverSideStorage: serverSideStorageModule,
shout: shoutModule, shout: shoutModule,
oauth: oauthModule, oauth: oauthModule,

View File

@ -1,6 +1,7 @@
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import { setPreset, applyTheme, applyConfig } from '../services/style_setter/style_setter.js' import { setPreset, applyTheme, applyConfig } from '../services/style_setter/style_setter.js'
import messages from '../i18n/messages' import messages from '../i18n/messages'
import { set } from 'lodash'
import localeService from '../services/locale/locale.service.js' import localeService from '../services/locale/locale.service.js'
const BACKEND_LANGUAGE_COOKIE_NAME = 'userLanguage' const BACKEND_LANGUAGE_COOKIE_NAME = 'userLanguage'
@ -147,7 +148,7 @@ const config = {
}, },
mutations: { mutations: {
setOption (state, { name, value }) { setOption (state, { name, value }) {
state[name] = value set(state, name, value)
}, },
setHighlight (state, { user, color, type }) { setHighlight (state, { user, color, type }) {
const data = this.state.config.highlight[user] const data = this.state.config.highlight[user]

View File

@ -22,9 +22,9 @@ const notificationsApi = ({ rootState, commit }, { path, value, oldValue }) => {
.updateNotificationSettings({ settings }) .updateNotificationSettings({ settings })
.then(result => { .then(result => {
if (result.status === 'success') { if (result.status === 'success') {
commit('confirmServerSideOption', { name, value }) commit('confirmProfileOption', { name, value })
} else { } else {
commit('confirmServerSideOption', { name, value: oldValue }) commit('confirmProfileOption', { name, value: oldValue })
} }
}) })
} }
@ -94,16 +94,16 @@ export const settingsMap = {
export const defaultState = Object.fromEntries(Object.keys(settingsMap).map(key => [key, null])) export const defaultState = Object.fromEntries(Object.keys(settingsMap).map(key => [key, null]))
const serverSideConfig = { const profileConfig = {
state: { ...defaultState }, state: { ...defaultState },
mutations: { mutations: {
confirmServerSideOption (state, { name, value }) { confirmProfileOption (state, { name, value }) {
set(state, name, value) set(state, name, value)
}, },
wipeServerSideOption (state, { name }) { wipeProfileOption (state, { name }) {
set(state, name, null) set(state, name, null)
}, },
wipeAllServerSideOptions (state) { wipeAllProfileOptions (state) {
Object.keys(settingsMap).forEach(key => { Object.keys(settingsMap).forEach(key => {
set(state, key, null) set(state, key, null)
}) })
@ -118,23 +118,23 @@ const serverSideConfig = {
} }
}, },
actions: { actions: {
setServerSideOption ({ rootState, state, commit, dispatch }, { name, value }) { setProfileOption ({ rootState, state, commit, dispatch }, { name, value }) {
const oldValue = get(state, name) const oldValue = get(state, name)
const map = settingsMap[name] const map = settingsMap[name]
if (!map) throw new Error('Invalid server-side setting') if (!map) throw new Error('Invalid server-side setting')
const { set: path = map, api = defaultApi } = map const { set: path = map, api = defaultApi } = map
commit('wipeServerSideOption', { name }) commit('wipeProfileOption', { name })
api({ rootState, commit }, { path, value, oldValue }) api({ rootState, commit }, { path, value, oldValue })
.catch((e) => { .catch((e) => {
console.warn('Error setting server-side option:', e) console.warn('Error setting server-side option:', e)
commit('confirmServerSideOption', { name, value: oldValue }) commit('confirmProfileOption', { name, value: oldValue })
}) })
}, },
logout ({ commit }) { logout ({ commit }) {
commit('wipeAllServerSideOptions') commit('wipeAllProfileOptions')
} }
} }
} }
export default serverSideConfig export default profileConfig