From 5468309f6aefbc61467338d2a96f29d6c416cc54 Mon Sep 17 00:00:00 2001 From: tusooa Date: Mon, 20 Feb 2023 23:49:34 -0500 Subject: Make it possible to auto-select the first candidate in autocomplete --- src/modules/config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/modules/config.js') diff --git a/src/modules/config.js b/src/modules/config.js index eb33f95f..3d9cf591 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -115,7 +115,8 @@ export const defaultState = { conversationTreeAdvanced: undefined, // instance default conversationOtherRepliesButton: undefined, // instance default conversationTreeFadeAncestors: undefined, // instance default - maxDepthInThread: undefined // instance default + maxDepthInThread: undefined, // instance default + autocompleteSelect: undefined // instance default } // caching the instance default properties -- cgit v1.2.3-70-g09d2 From af0cd5422304d7b2111739d85c279b3fa175a853 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Sun, 12 Mar 2023 14:32:13 +0200 Subject: 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. --- .../settings_modal/helpers/boolean_setting.js | 53 +------- .../settings_modal/helpers/boolean_setting.vue | 4 +- .../settings_modal/helpers/choice_setting.js | 51 ++------ .../settings_modal/helpers/choice_setting.vue | 2 +- .../settings_modal/helpers/integer_setting.js | 39 +----- .../helpers/profile_setting_indicator.vue | 51 ++++++++ .../helpers/server_side_indicator.vue | 51 -------- src/components/settings_modal/helpers/setting.js | 84 +++++++++++++ .../helpers/shared_computed_object.js | 18 --- .../settings_modal/helpers/size_setting.js | 48 ++----- .../settings_modal/tabs/filtering_tab.vue | 14 +-- src/components/settings_modal/tabs/general_tab.js | 6 +- src/components/settings_modal/tabs/general_tab.vue | 29 ++--- .../settings_modal/tabs/notifications_tab.vue | 4 +- src/components/settings_modal/tabs/profile_tab.vue | 32 +++-- src/main.js | 4 +- src/modules/config.js | 3 +- src/modules/profileConfig.js | 140 +++++++++++++++++++++ src/modules/serverSideConfig.js | 140 --------------------- 19 files changed, 351 insertions(+), 422 deletions(-) create mode 100644 src/components/settings_modal/helpers/profile_setting_indicator.vue delete mode 100644 src/components/settings_modal/helpers/server_side_indicator.vue create mode 100644 src/components/settings_modal/helpers/setting.js create mode 100644 src/modules/profileConfig.js delete mode 100644 src/modules/serverSideConfig.js (limited to 'src/modules/config.js') diff --git a/src/components/settings_modal/helpers/boolean_setting.js b/src/components/settings_modal/helpers/boolean_setting.js index 2e6992cb..078cc5ff 100644 --- a/src/components/settings_modal/helpers/boolean_setting.js +++ b/src/components/settings_modal/helpers/boolean_setting.js @@ -1,56 +1,13 @@ -import { get, set } from 'lodash' import Checkbox from 'src/components/checkbox/checkbox.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 { components: { Checkbox, ModifiedIndicator, - ServerSideIndicator + ProfileSettingIndicator }, - props: [ - '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) - } - } + ...Setting } diff --git a/src/components/settings_modal/helpers/boolean_setting.vue b/src/components/settings_modal/helpers/boolean_setting.vue index 41142966..bc014bc9 100644 --- a/src/components/settings_modal/helpers/boolean_setting.vue +++ b/src/components/settings_modal/helpers/boolean_setting.vue @@ -5,7 +5,7 @@ > - + diff --git a/src/components/settings_modal/helpers/choice_setting.js b/src/components/settings_modal/helpers/choice_setting.js index 3da559fe..8aa5f54b 100644 --- a/src/components/settings_modal/helpers/choice_setting.js +++ b/src/components/settings_modal/helpers/choice_setting.js @@ -1,51 +1,20 @@ -import { get, set } from 'lodash' import Select from 'src/components/select/select.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 { components: { Select, ModifiedIndicator, - ServerSideIndicator + ProfileSettingIndicator }, - props: [ - 'path', - 'disabled', - 'options', - '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) { - set(this.$parent, this.path, e) - }, - reset () { - set(this.$parent, this.path, this.defaultState) + ...Setting, + props: { + ...Setting.props, + options: { + type: Array, + required: true } } } diff --git a/src/components/settings_modal/helpers/choice_setting.vue b/src/components/settings_modal/helpers/choice_setting.vue index 8fdbb5d3..4c4cdefe 100644 --- a/src/components/settings_modal/helpers/choice_setting.vue +++ b/src/components/settings_modal/helpers/choice_setting.vue @@ -23,7 +23,7 @@ :changed="isChanged" :onclick="reset" /> - + diff --git a/src/components/settings_modal/helpers/integer_setting.js b/src/components/settings_modal/helpers/integer_setting.js index e64d0cee..0f29f11a 100644 --- a/src/components/settings_modal/helpers/integer_setting.js +++ b/src/components/settings_modal/helpers/integer_setting.js @@ -1,44 +1,15 @@ -import { get, set } from 'lodash' import ModifiedIndicator from './modified_indicator.vue' +import Setting from './setting.js' + export default { components: { ModifiedIndicator }, - props: { - 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 - } - }, + ...Setting, methods: { + ...Setting.methods, update (e) { - set(this.$parent, this.path, parseInt(e.target.value)) - }, - reset () { - set(this.$parent, this.path, this.defaultState) + this.configSink(this.path, parseInt(e.target.value)) } } } diff --git a/src/components/settings_modal/helpers/profile_setting_indicator.vue b/src/components/settings_modal/helpers/profile_setting_indicator.vue new file mode 100644 index 00000000..d160781b --- /dev/null +++ b/src/components/settings_modal/helpers/profile_setting_indicator.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/components/settings_modal/helpers/server_side_indicator.vue b/src/components/settings_modal/helpers/server_side_indicator.vue deleted file mode 100644 index bf181959..00000000 --- a/src/components/settings_modal/helpers/server_side_indicator.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - - - diff --git a/src/components/settings_modal/helpers/setting.js b/src/components/settings_modal/helpers/setting.js new file mode 100644 index 00000000..dc37675c --- /dev/null +++ b/src/components/settings_modal/helpers/setting.js @@ -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) + } + } +} diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js index 12431dca..6b22174d 100644 --- a/src/components/settings_modal/helpers/shared_computed_object.js +++ b/src/components/settings_modal/helpers/shared_computed_object.js @@ -1,19 +1,9 @@ import { defaultState as configDefaultState } from 'src/modules/config.js' -import { defaultState as serverSideConfigDefaultState } from 'src/modules/serverSideConfig.js' const SharedComputedObject = () => ({ user () { 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 ...Object.keys(configDefaultState) .map(key => [key, { @@ -23,14 +13,6 @@ const SharedComputedObject = () => ({ } }]) .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) useStreamingApi: { get () { return this.$store.getters.mergedConfig.useStreamingApi }, diff --git a/src/components/settings_modal/helpers/size_setting.js b/src/components/settings_modal/helpers/size_setting.js index 58697412..4a0f7e48 100644 --- a/src/components/settings_modal/helpers/size_setting.js +++ b/src/components/settings_modal/helpers/size_setting.js @@ -1,6 +1,6 @@ -import { get, set } from 'lodash' import ModifiedIndicator from './modified_indicator.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 defaultHorizontalUnits = ['px', 'rem', 'vw'] @@ -11,57 +11,31 @@ export default { ModifiedIndicator, Select }, + ...Setting, props: { - path: String, - disabled: Boolean, + ...Setting.props, min: Number, units: { - type: [String], + type: Array, default: () => allCssUnits - }, - expert: [Number, String] + } }, computed: { - pathDefault () { - const [firstSegment, ...rest] = this.path.split('.') - return [firstSegment + 'DefaultValue', ...rest].join('.') - }, + ...Setting.computed, stateUnit () { - return (this.state || '').replace(/\d+/, '') + 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 () { - return get(this.$parent, this.pathDefault) - }, - isChanged () { - return this.state !== this.defaultState - }, - matchesExpertLevel () { - return (this.expert || 0) <= this.$parent.expertLevel + return this.state.replace(/\D+/, '') } }, methods: { - update (e) { - set(this.$parent, this.path, e) - }, - reset () { - set(this.$parent, this.path, this.defaultState) - }, + ...Setting.methods, 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) { - set(this.$parent, this.path, this.stateValue + e.target.value) + this.configSink(this.path, this.stateValue + e.target.value) } } } diff --git a/src/components/settings_modal/tabs/filtering_tab.vue b/src/components/settings_modal/tabs/filtering_tab.vue index 97046ff0..46c6bc5c 100644 --- a/src/components/settings_modal/tabs/filtering_tab.vue +++ b/src/components/settings_modal/tabs/filtering_tab.vue @@ -7,13 +7,11 @@ {{ $t('settings.hide_filtered_statuses') }} -
    +
    • {{ $t('settings.hide_wordfiltered_statuses') }} @@ -22,7 +20,8 @@
    • {{ $t('settings.hide_muted_threads') }} @@ -31,7 +30,8 @@
    • {{ $t('settings.hide_muted_posts') }} diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index ea24d6ad..e8f7016e 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -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 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 { faGlobe @@ -65,7 +65,7 @@ const GeneralTab = { SizeSetting, InterfaceLanguageSwitcher, ScopeSelector, - ServerSideIndicator + ProfileSettingIndicator }, computed: { horizontalUnits () { @@ -108,7 +108,7 @@ const GeneralTab = { }, methods: { changeDefaultScope (value) { - this.$store.dispatch('setServerSideOption', { name: 'defaultScope', value }) + this.$store.dispatch('setProfileOption', { name: 'defaultScope', value }) } } } diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 65248ac1..0eb3d06c 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -29,14 +29,11 @@ {{ $t('settings.streaming') }} -
        +
        • {{ $t('settings.pause_on_unfocused') }} @@ -265,7 +262,7 @@
        • {{ $t('settings.no_rich_text_description') }} @@ -290,7 +287,7 @@ {{ $t('settings.preload_images') }} @@ -299,7 +296,7 @@ {{ $t('settings.use_one_click_nsfw') }} @@ -312,15 +309,13 @@ > {{ $t('settings.loop_video') }} -
            +
            • {{ $t('settings.loop_video_silent_only') }} @@ -418,18 +413,18 @@
              • - + {{ $t('settings.sensitive_by_default') }} diff --git a/src/components/settings_modal/tabs/notifications_tab.vue b/src/components/settings_modal/tabs/notifications_tab.vue index dd3806ed..ea095372 100644 --- a/src/components/settings_modal/tabs/notifications_tab.vue +++ b/src/components/settings_modal/tabs/notifications_tab.vue @@ -4,7 +4,7 @@

                {{ $t('settings.notification_setting_filters') }}

                • - + {{ $t('settings.notification_setting_block_from_strangers') }}
                • @@ -67,7 +67,7 @@
                • {{ $t('settings.notification_setting_hide_notification_contents') }} diff --git a/src/components/settings_modal/tabs/profile_tab.vue b/src/components/settings_modal/tabs/profile_tab.vue index 6a5b478a..74652990 100644 --- a/src/components/settings_modal/tabs/profile_tab.vue +++ b/src/components/settings_modal/tabs/profile_tab.vue @@ -254,37 +254,35 @@

                  {{ $t('settings.account_privacy') }}

                  • - + {{ $t('settings.lock_account_description') }}
                  • - + {{ $t('settings.discoverable') }}
                  • - + {{ $t('settings.allow_following_move') }}
                  • - + {{ $t('settings.hide_favorites_description') }}
                  • - + {{ $t('settings.hide_followers_description') }} -
                      +
                      • {{ $t('settings.hide_followers_count_description') }} @@ -292,17 +290,15 @@
                    • - + {{ $t('settings.hide_follows_description') }} -
                        +
                        • {{ $t('settings.hide_follows_count_description') }} diff --git a/src/main.js b/src/main.js index d3e60a0f..fd712113 100644 --- a/src/main.js +++ b/src/main.js @@ -10,7 +10,7 @@ import listsModule from './modules/lists.js' import usersModule from './modules/users.js' import apiModule from './modules/api.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 shoutModule from './modules/shout.js' import oauthModule from './modules/oauth.js' @@ -80,7 +80,7 @@ const persistedStateOptions = { lists: listsModule, api: apiModule, config: configModule, - serverSideConfig: serverSideConfigModule, + profileConfig: profileConfigModule, serverSideStorage: serverSideStorageModule, shout: shoutModule, oauth: oauthModule, diff --git a/src/modules/config.js b/src/modules/config.js index 3d9cf591..6ab59d6d 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -1,6 +1,7 @@ import Cookies from 'js-cookie' import { setPreset, applyTheme, applyConfig } from '../services/style_setter/style_setter.js' import messages from '../i18n/messages' +import { set } from 'lodash' import localeService from '../services/locale/locale.service.js' const BACKEND_LANGUAGE_COOKIE_NAME = 'userLanguage' @@ -147,7 +148,7 @@ const config = { }, mutations: { setOption (state, { name, value }) { - state[name] = value + set(state, name, value) }, setHighlight (state, { user, color, type }) { const data = this.state.config.highlight[user] diff --git a/src/modules/profileConfig.js b/src/modules/profileConfig.js new file mode 100644 index 00000000..2cb2014a --- /dev/null +++ b/src/modules/profileConfig.js @@ -0,0 +1,140 @@ +import { get, set } from 'lodash' + +const defaultApi = ({ rootState, commit }, { path, value }) => { + const params = {} + set(params, path, value) + return rootState + .api + .backendInteractor + .updateProfile({ params }) + .then(result => { + commit('addNewUsers', [result]) + commit('setCurrentUser', result) + }) +} + +const notificationsApi = ({ rootState, commit }, { path, value, oldValue }) => { + const settings = {} + set(settings, path, value) + return rootState + .api + .backendInteractor + .updateNotificationSettings({ settings }) + .then(result => { + if (result.status === 'success') { + commit('confirmProfileOption', { name, value }) + } else { + commit('confirmProfileOption', { name, value: oldValue }) + } + }) +} + +/** + * Map that stores relation between path for reading (from user profile), + * for writing (into API) an what API to use. + * + * Shorthand - instead of { get, set, api? } object it's possible to use string + * in case default api is used and get = set + * + * If no api is specified, defaultApi is used (see above) + */ +export const settingsMap = { + defaultScope: 'source.privacy', + defaultNSFW: 'source.sensitive', // BROKEN: pleroma/pleroma#2837 + stripRichContent: { + get: 'source.pleroma.no_rich_text', + set: 'no_rich_text' + }, + // Privacy + locked: 'locked', + acceptChatMessages: { + get: 'pleroma.accepts_chat_messages', + set: 'accepts_chat_messages' + }, + allowFollowingMove: { + get: 'pleroma.allow_following_move', + set: 'allow_following_move' + }, + discoverable: { + get: 'source.pleroma.discoverable', + set: 'discoverable' + }, + hideFavorites: { + get: 'pleroma.hide_favorites', + set: 'hide_favorites' + }, + hideFollowers: { + get: 'pleroma.hide_followers', + set: 'hide_followers' + }, + hideFollows: { + get: 'pleroma.hide_follows', + set: 'hide_follows' + }, + hideFollowersCount: { + get: 'pleroma.hide_followers_count', + set: 'hide_followers_count' + }, + hideFollowsCount: { + get: 'pleroma.hide_follows_count', + set: 'hide_follows_count' + }, + // NotificationSettingsAPIs + webPushHideContents: { + get: 'pleroma.notification_settings.hide_notification_contents', + set: 'hide_notification_contents', + api: notificationsApi + }, + blockNotificationsFromStrangers: { + get: 'pleroma.notification_settings.block_from_strangers', + set: 'block_from_strangers', + api: notificationsApi + } +} + +export const defaultState = Object.fromEntries(Object.keys(settingsMap).map(key => [key, null])) + +const profileConfig = { + state: { ...defaultState }, + mutations: { + confirmProfileOption (state, { name, value }) { + set(state, name, value) + }, + wipeProfileOption (state, { name }) { + set(state, name, null) + }, + wipeAllProfileOptions (state) { + Object.keys(settingsMap).forEach(key => { + set(state, key, null) + }) + }, + // Set the settings based on their path location + setCurrentUser (state, user) { + Object.entries(settingsMap).forEach((map) => { + const [name, value] = map + const { get: path = value } = value + set(state, name, get(user._original, path)) + }) + } + }, + actions: { + setProfileOption ({ rootState, state, commit, dispatch }, { name, value }) { + const oldValue = get(state, name) + const map = settingsMap[name] + if (!map) throw new Error('Invalid server-side setting') + const { set: path = map, api = defaultApi } = map + commit('wipeProfileOption', { name }) + + api({ rootState, commit }, { path, value, oldValue }) + .catch((e) => { + console.warn('Error setting server-side option:', e) + commit('confirmProfileOption', { name, value: oldValue }) + }) + }, + logout ({ commit }) { + commit('wipeAllProfileOptions') + } + } +} + +export default profileConfig diff --git a/src/modules/serverSideConfig.js b/src/modules/serverSideConfig.js deleted file mode 100644 index 476263bc..00000000 --- a/src/modules/serverSideConfig.js +++ /dev/null @@ -1,140 +0,0 @@ -import { get, set } from 'lodash' - -const defaultApi = ({ rootState, commit }, { path, value }) => { - const params = {} - set(params, path, value) - return rootState - .api - .backendInteractor - .updateProfile({ params }) - .then(result => { - commit('addNewUsers', [result]) - commit('setCurrentUser', result) - }) -} - -const notificationsApi = ({ rootState, commit }, { path, value, oldValue }) => { - const settings = {} - set(settings, path, value) - return rootState - .api - .backendInteractor - .updateNotificationSettings({ settings }) - .then(result => { - if (result.status === 'success') { - commit('confirmServerSideOption', { name, value }) - } else { - commit('confirmServerSideOption', { name, value: oldValue }) - } - }) -} - -/** - * Map that stores relation between path for reading (from user profile), - * for writing (into API) an what API to use. - * - * Shorthand - instead of { get, set, api? } object it's possible to use string - * in case default api is used and get = set - * - * If no api is specified, defaultApi is used (see above) - */ -export const settingsMap = { - defaultScope: 'source.privacy', - defaultNSFW: 'source.sensitive', // BROKEN: pleroma/pleroma#2837 - stripRichContent: { - get: 'source.pleroma.no_rich_text', - set: 'no_rich_text' - }, - // Privacy - locked: 'locked', - acceptChatMessages: { - get: 'pleroma.accepts_chat_messages', - set: 'accepts_chat_messages' - }, - allowFollowingMove: { - get: 'pleroma.allow_following_move', - set: 'allow_following_move' - }, - discoverable: { - get: 'source.pleroma.discoverable', - set: 'discoverable' - }, - hideFavorites: { - get: 'pleroma.hide_favorites', - set: 'hide_favorites' - }, - hideFollowers: { - get: 'pleroma.hide_followers', - set: 'hide_followers' - }, - hideFollows: { - get: 'pleroma.hide_follows', - set: 'hide_follows' - }, - hideFollowersCount: { - get: 'pleroma.hide_followers_count', - set: 'hide_followers_count' - }, - hideFollowsCount: { - get: 'pleroma.hide_follows_count', - set: 'hide_follows_count' - }, - // NotificationSettingsAPIs - webPushHideContents: { - get: 'pleroma.notification_settings.hide_notification_contents', - set: 'hide_notification_contents', - api: notificationsApi - }, - blockNotificationsFromStrangers: { - get: 'pleroma.notification_settings.block_from_strangers', - set: 'block_from_strangers', - api: notificationsApi - } -} - -export const defaultState = Object.fromEntries(Object.keys(settingsMap).map(key => [key, null])) - -const serverSideConfig = { - state: { ...defaultState }, - mutations: { - confirmServerSideOption (state, { name, value }) { - set(state, name, value) - }, - wipeServerSideOption (state, { name }) { - set(state, name, null) - }, - wipeAllServerSideOptions (state) { - Object.keys(settingsMap).forEach(key => { - set(state, key, null) - }) - }, - // Set the settings based on their path location - setCurrentUser (state, user) { - Object.entries(settingsMap).forEach((map) => { - const [name, value] = map - const { get: path = value } = value - set(state, name, get(user._original, path)) - }) - } - }, - actions: { - setServerSideOption ({ rootState, state, commit, dispatch }, { name, value }) { - const oldValue = get(state, name) - const map = settingsMap[name] - if (!map) throw new Error('Invalid server-side setting') - const { set: path = map, api = defaultApi } = map - commit('wipeServerSideOption', { name }) - - api({ rootState, commit }, { path, value, oldValue }) - .catch((e) => { - console.warn('Error setting server-side option:', e) - commit('confirmServerSideOption', { name, value: oldValue }) - }) - }, - logout ({ commit }) { - commit('wipeAllServerSideOptions') - } - } -} - -export default serverSideConfig -- cgit v1.2.3-70-g09d2 From ac32997f8b17ba3f2209c992c27394c48a1594c7 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Sun, 12 Mar 2023 16:51:50 +0200 Subject: move websocket connection logic into module --- .../helpers/shared_computed_object.js | 19 +----- src/modules/config.js | 70 ++++++++++++++-------- 2 files changed, 46 insertions(+), 43 deletions(-) (limited to 'src/modules/config.js') diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js index 6b22174d..e898c8ac 100644 --- a/src/components/settings_modal/helpers/shared_computed_object.js +++ b/src/components/settings_modal/helpers/shared_computed_object.js @@ -12,24 +12,7 @@ const SharedComputedObject = () => ({ this.$store.dispatch('setOption', { name: key, value }) } }]) - .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}), - // Special cases (need to transform values or perform actions first) - useStreamingApi: { - get () { return this.$store.getters.mergedConfig.useStreamingApi }, - set (value) { - const promise = value - ? this.$store.dispatch('enableMastoSockets') - : this.$store.dispatch('disableMastoSockets') - - promise.then(() => { - this.$store.dispatch('setOption', { name: 'useStreamingApi', value }) - }).catch((e) => { - console.error('Failed starting MastoAPI Streaming socket', e) - this.$store.dispatch('disableMastoSockets') - this.$store.dispatch('setOption', { name: 'useStreamingApi', value: false }) - }) - } - } + .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}) }) export default SharedComputedObject diff --git a/src/modules/config.js b/src/modules/config.js index 6ab59d6d..5e3f0105 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -178,31 +178,51 @@ const config = { commit('setHighlight', { user, color, type }) }, setOption ({ commit, dispatch, state }, { name, value }) { - commit('setOption', { name, value }) - switch (name) { - case 'theme': - setPreset(value) - break - case 'sidebarColumnWidth': - case 'contentColumnWidth': - case 'notifsColumnWidth': - applyConfig(state) - break - case 'customTheme': - case 'customThemeSource': - applyTheme(value) - break - case 'interfaceLanguage': - messages.setLanguage(this.getters.i18n, value) - dispatch('loadUnicodeEmojiData', value) - Cookies.set( - BACKEND_LANGUAGE_COOKIE_NAME, - localeService.internalToBackendLocaleMulti(value) - ) - break - case 'thirdColumnMode': - dispatch('setLayoutWidth', undefined) - break + const exceptions = new Set([ + 'useStreamingApi' + ]) + + if (exceptions.has(name)) { + switch (name) { + case 'useStreamingApi': { + const action = value ? 'enableMastoSockets' : 'disableMastoSockets' + + dispatch(action).then(() => { + commit('setOption', { name: 'useStreamingApi', value }) + }).catch((e) => { + console.error('Failed starting MastoAPI Streaming socket', e) + dispatch('disableMastoSockets') + dispatch('setOption', { name: 'useStreamingApi', value: false }) + }) + } + } + } else { + commit('setOption', { name, value }) + switch (name) { + case 'theme': + setPreset(value) + break + case 'sidebarColumnWidth': + case 'contentColumnWidth': + case 'notifsColumnWidth': + applyConfig(state) + break + case 'customTheme': + case 'customThemeSource': + applyTheme(value) + break + case 'interfaceLanguage': + messages.setLanguage(this.getters.i18n, value) + dispatch('loadUnicodeEmojiData', value) + Cookies.set( + BACKEND_LANGUAGE_COOKIE_NAME, + localeService.internalToBackendLocaleMulti(value) + ) + break + case 'thirdColumnMode': + dispatch('setLayoutWidth', undefined) + break + } } } } -- cgit v1.2.3-70-g09d2 From 3403f6a1ed5388291244487ae7eb3190d7c4353e Mon Sep 17 00:00:00 2001 From: Alexander Tumin Date: Fri, 17 Mar 2023 23:30:46 +0300 Subject: Allow custom emoji reactions: add option to scale reaction buttons --- src/components/emoji_reactions/emoji_reactions.vue | 27 ++++++++++++++-------- src/components/settings_modal/tabs/general_tab.vue | 9 ++++++++ src/i18n/en.json | 1 + src/modules/config.js | 2 ++ src/services/style_setter/style_setter.js | 4 ++-- 5 files changed, 32 insertions(+), 11 deletions(-) (limited to 'src/modules/config.js') diff --git a/src/components/emoji_reactions/emoji_reactions.vue b/src/components/emoji_reactions/emoji_reactions.vue index 12783114..eb46018e 100644 --- a/src/components/emoji_reactions/emoji_reactions.vue +++ b/src/components/emoji_reactions/emoji_reactions.vue @@ -12,20 +12,20 @@ @mouseenter="fetchEmojiReactionsByIfMissing()" > + {{ reaction.name }} - {{ reaction.name }} {{ reaction.count }} @@ -49,6 +49,8 @@ margin-top: 0.25em; flex-wrap: wrap; + --emoji-size: calc(1.25em * var(--emojiReactionsScale, 1)); + .emoji-reaction { padding: 0 0.5em; margin-right: 0.5em; @@ -59,17 +61,24 @@ box-sizing: border-box; .reaction-emoji { - width: 1.25em; - height: 1.25em; + width: var(--emoji-size); + height: var(--emoji-size); margin-right: 0.25em; + line-height: var(--emoji-size); + display: flex; + justify-content: center; + align-items: center; } .reaction-emoji-content { - max-width: 1.25em; - max-height: 1.25em; + max-width: 100%; + max-height: 100%; width: auto; height: auto; + line-height: inherit; overflow: hidden; + font-size: calc(var(--emoji-size) * 0.8); + margin: 0; } &:focus { diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 65248ac1..17afc5ba 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -271,6 +271,15 @@ {{ $t('settings.no_rich_text_description') }}
                        • +
                        • + + {{ $t('settings.emoji_reactions_scale') }} + +
                        • {{ $t('settings.attachments') }}

                        • { body.classList.remove('hidden') } -const configColumns = ({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth }) => - ({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth }) +const configColumns = ({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth, emojiReactionsScale }) => + ({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth, emojiReactionsScale }) const defaultConfigColumns = configColumns(defaultState) -- cgit v1.2.3-70-g09d2