diff --git a/src/App.js b/src/App.js index 33645c63d..2af10cc8b 100644 --- a/src/App.js +++ b/src/App.js @@ -1,7 +1,9 @@ import { throttle } from 'lodash' +import { mapState } from 'pinia' import { defineAsyncComponent } from 'vue' import { mapGetters } from 'vuex' +import { useServerSideStorageStore } from 'src/stores/serverSideStorage' import DesktopNav from './components/desktop_nav/desktop_nav.vue' import EditStatusModal from './components/edit_status_modal/edit_status_modal.vue' import FeaturesPanel from './components/features_panel/features_panel.vue' @@ -184,9 +186,6 @@ export default { shoutboxPosition() { return this.$store.getters.mergedConfig.alwaysShowNewPostButton || false }, - hideShoutbox() { - return this.$store.getters.mergedConfig.hideShoutbox - }, layoutType() { return useInterfaceStore().layoutType }, @@ -214,6 +213,9 @@ export default { return window /* this.$refs.appContentRef */ }, ...mapGetters(['mergedConfig']), + ...mapState(useServerSideStorageStore, { + hideShoutbox: (store) => store.prefsStorage.simple.hideShoutbox, + }), }, methods: { resizeHandler() { diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 396aa94f0..a073a5eb8 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -8,6 +8,7 @@ import Popover from 'src/components/popover/popover.vue' import { pollFormToMasto } from 'src/services/poll/poll.service.js' import { useInterfaceStore } from 'src/stores/interface.js' import { useMediaViewerStore } from 'src/stores/media_viewer.js' +import { useServerSideStorageStore } from 'src/stores/serverSideStorage' import { propsToNative } from '../../services/attributes_helper/attributes_helper.service.js' import fileTypeService from '../../services/file_type/file_type.service.js' import { findOffset } from '../../services/offset_finder/offset_finder.service.js' @@ -299,10 +300,11 @@ const PostStatusForm = { return this.hasStatusLengthLimit && this.charactersLeft < 0 }, minimalScopesMode() { - return this.$store.state.instance.minimalScopesMode + return useServerSideStorageStore().prefsStorage.simple.minimalScopesMode }, alwaysShowSubject() { - return this.mergedConfig.alwaysShowSubjectInput + return useServerSideStorageStore().prefsStorage.simple + .alwaysShowSubjectInput }, postFormats() { return this.$store.state.instance.postFormats || [] diff --git a/src/components/settings_modal/helpers/setting.js b/src/components/settings_modal/helpers/setting.js index c77de92b1..06ed9b2f6 100644 --- a/src/components/settings_modal/helpers/setting.js +++ b/src/components/settings_modal/helpers/setting.js @@ -1,5 +1,6 @@ import { cloneDeep, get, isEqual, set } from 'lodash' +import { useServerSideStorageStore } from 'src/stores/serverSideStorage' import DraftButtons from './draft_buttons.vue' import ModifiedIndicator from './modified_indicator.vue' import ProfileSettingIndicator from './profile_setting_indicator.vue' @@ -226,6 +227,8 @@ export default { }, configSource() { switch (this.realSource) { + case 'server-side': + return useServerSideStorageStore().prefsStorage case 'profile': return this.$store.state.profileConfig case 'admin': @@ -239,6 +242,39 @@ export default { return (k, v) => this.$emit('update:modelValue', v) } switch (this.realSource) { + case 'server-side': { + return (path, value, operator) => { + const folder = path.split('.')[0] + if (folder === 'collections' || folder === 'objectCollections') { + switch (operator) { + case 'add': + useServerSideStorageStore().addCollectionPreference({ + path, + value, + }) + useServerSideStorageStore().pushServerSideStorage() + break + case 'remove': + useServerSideStorageStore().removeCollectionPreference({ + path, + value, + }) + useServerSideStorageStore().pushServerSideStorage() + break + default: + console.error( + `Unknown server-side collection operator ${operator}, ignoring`, + ) + break + } + } else if (folder === 'simple') { + useServerSideStorageStore().setPreference({ path, value }) + useServerSideStorageStore().pushServerSideStorage() + } else { + console.error(`Unknown server-side folder ${folder}, ignoring`) + } + } + } case 'profile': return (k, v) => this.$store.dispatch('setProfileOption', { name: k, value: v }) @@ -262,6 +298,11 @@ export default { switch (this.realSource) { case 'profile': return {} + case 'server-side': + return get( + this.$store.getters.defaultConfig, + this.path.split(/\./g).slice(1), + ) default: return get(this.$store.getters.defaultConfig, this.path) } diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js index b8197b639..070a35b44 100644 --- a/src/components/settings_modal/helpers/shared_computed_object.js +++ b/src/components/settings_modal/helpers/shared_computed_object.js @@ -1,18 +1,20 @@ +import { mapState as mapPiniaState } from 'pinia' +import { mapGetters, mapState } from 'vuex' + +import { useServerSideStorageStore } from 'src/stores/serverSideStorage' + const SharedComputedObject = () => ({ - user() { - return this.$store.state.users.currentUser - }, + ...mapPiniaState(useServerSideStorageStore, { + serverSide: (store) => store.state.prefsStorage, + }), + ...mapGetters(['mergedConfig']), + ...mapState({ + adminConfig: (state) => state.adminSettings.config, + adminDraft: (state) => state.adminSettings.draft, + user: (state) => state.users.currentUser, + }), expertLevel() { - return this.$store.getters.mergedConfig.expertLevel > 0 - }, - mergedConfig() { - return this.$store.getters.mergedConfig - }, - adminConfig() { - return this.$store.state.adminSettings.config - }, - adminDraft() { - return this.$store.state.adminSettings.draft + return this.mergedConfig.expertLevel > 0 }, }) diff --git a/src/components/settings_modal/tabs/clutter_tab.vue b/src/components/settings_modal/tabs/clutter_tab.vue index daf098f5a..ef230dee0 100644 --- a/src/components/settings_modal/tabs/clutter_tab.vue +++ b/src/components/settings_modal/tabs/clutter_tab.vue @@ -4,41 +4,58 @@

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