separation support

This commit is contained in:
Henry Jameson 2026-01-29 20:33:59 +02:00
commit e554eeeef6
30 changed files with 92 additions and 102 deletions

View file

@ -201,11 +201,7 @@ export default {
'styleDataUsed',
'layoutType',
]),
...mapState(useInstanceStore, [
'styleDataUsed',
'instanceSpecificPanelContent',
'private',
]),
...mapState(useInstanceStore, ['styleDataUsed', 'private']),
...mapState(useInstanceStore, {
background: (store) => store.instanceIdentity.background,
showFeaturesPanel: (store) => store.instanceIdentity.showFeaturesPanel,
@ -213,6 +209,8 @@ export default {
store.instanceIdentity.showInstanceSpecificPanel,
suggestionsEnabled: (store) => store.featureSet.suggestionsEnabled,
editingAvailable: (store) => store.featureSet.editingAvailable,
instanceSpecificPanelContent: (store) =>
store.instanceIdentity.instanceSpecificPanelContent,
}),
},
methods: {

View file

@ -21,6 +21,7 @@ import {
} from 'src/modules/default_config_state.js'
import { useAnnouncementsStore } from 'src/stores/announcements'
import { useAuthFlowStore } from 'src/stores/auth_flow'
import { useEmojiStore } from 'src/stores/emoji.js'
import { useI18nStore } from 'src/stores/i18n'
import { useInstanceStore } from 'src/stores/instance.js'
import { useInterfaceStore } from 'src/stores/interface.js'
@ -169,10 +170,10 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
}
Object.keys(staticOrApiConfigDefault)
.map((k) => ({ source: k, destination: `instanceIdentity.${k}`}))
.map((k) => ({ source: k, destination: `instanceIdentity.${k}` }))
.forEach(copyInstanceOption)
Object.keys(instanceDefaultConfig)
.map((k) => ({ source: k, destination: `prefsStorage.${k}`}))
.map((k) => ({ source: k, destination: `prefsStorage.${k}` }))
.forEach(copyInstanceOption)
useAuthFlowStore().setInitialStrategy(config.loginMethod)

View file

@ -1,4 +1,4 @@
import { mapState } from 'vuex'
import { mapState } from 'pinia'
import UserListMenu from 'src/components/user_list_menu/user_list_menu.vue'
import UserTimedFilterModal from 'src/components/user_timed_filter_modal/user_timed_filter_modal.vue'
@ -93,10 +93,10 @@ const AccountActions = {
shouldConfirmRemoveUserFromFollowers() {
return this.$store.getters.mergedConfig.modalOnRemoveUserFromFollowers
},
...mapState({
blockExpirationSupported: (state) => useInstanceStore().blockExpiration,
pleromaChatMessagesAvailable: (state) =>
useInstanceStore().pleromaChatMessagesAvailable,
...mapState(useInstanceStore, {
blockExpirationSupported: (store) => store.featureSet.blockExpiration,
pleromaChatMessagesAvailable: (store) =>
store.featureSet.pleromaChatMessagesAvailable,
}),
},
}

View file

@ -2,6 +2,7 @@ import { take } from 'lodash'
import Popover from 'src/components/popover/popover.vue'
import ScreenReaderNotice from 'src/components/screen_reader_notice/screen_reader_notice.vue'
import { useEmojiStore } from 'src/stores/emoji.js'
import { ensureFinalFallback } from '../../i18n/languages.js'
import Completion from '../../services/completion/completion.js'
import { findOffset } from '../../services/offset_finder/offset_finder.service.js'

View file

@ -1,34 +1,22 @@
import { mapState } from 'pinia'
import { useInstanceStore } from 'src/stores/instance.js'
import fileSizeFormatService from '../../services/file_size_format/file_size_format.js'
const FeaturesPanel = {
computed: {
shout: function () {
return useInstanceStore().shoutAvailable
},
pleromaChatMessages: function () {
return useInstanceStore().pleromaChatMessagesAvailable
},
gopher: function () {
return useInstanceStore().gopherAvailable
},
whoToFollow: function () {
return useInstanceStore().suggestionsEnabled
},
mediaProxy: function () {
return useInstanceStore().mediaProxyAvailable
},
minimalScopesMode: function () {
return useInstanceStore().minimalScopesMode
},
textlimit: function () {
return useInstanceStore().textlimit
},
uploadlimit: function () {
return fileSizeFormatService.fileSizeFormat(
useInstanceStore().uploadlimit,
)
},
...mapState(useInstanceStore, {
shout: (store) => store.shoutAvailable,
pleromaChatMessages: (store) =>
store.featureSet.pleromaChatMessagesAvailable,
gopher: (store) => store.featureSet.gopherAvailable,
whoToFollow: (store) => store.featureSet.suggestionsEnabled,
mediaProxy: (store) => store.featureSet.mediaProxyAvailable,
minimalScopesMode: (store) => store.prefsStorage.minimalScopesMode,
textlimit: (store) => store.limits.textlimit,
uploadlimit: (store) =>
fileSizeFormatService.fileSizeFormat(store.limits.uploadlimit),
}),
},
}

View file

@ -55,7 +55,7 @@ const ModerationTools = {
},
canUseTagPolicy() {
return (
useInstanceStore().tagPolicyAvailable &&
useInstanceStore().featureSet.tagPolicyAvailable &&
this.privileged('users_manage_tags')
)
},

View file

@ -111,6 +111,14 @@ const NavPanel = {
unreadAnnouncementCount: 'unreadAnnouncementCount',
supportsAnnouncements: (store) => store.supportsAnnouncements,
}),
...mapPiniaState(useInstanceStore, ['private', 'federating']),
...mapPiniaState(useInstanceStore, {
pleromaChatMessagesAvailable: (store) =>
store.featureSet.pleromaChatMessagesAvailable,
bookmarkFolders: (store) =>
store.fetaureSet.pleromaBookmarkFoldersAvailable,
bubbleTimeline: (store) => store.fetaureSet.localBubble,
}),
...mapPiniaState(useServerSideStorageStore, {
collapsed: (store) => store.prefsStorage.simple.collapseNav,
pinnedItems: (store) =>
@ -119,14 +127,6 @@ const NavPanel = {
...mapState({
currentUser: (state) => state.users.currentUser,
followRequestCount: (state) => state.api.followRequests.length,
privateMode: (state) => useInstanceStore().private,
federating: (state) => useInstanceStore().federating,
pleromaChatMessagesAvailable: (state) =>
useInstanceStore().pleromaChatMessagesAvailable,
bookmarkFolders: (state) =>
useInstanceStore().pleromaBookmarkFoldersAvailable,
bubbleTimeline: (state) =>
useInstanceStore().localBubbleInstances.length > 0,
}),
timelinesItems() {
return filterNavigation(

View file

@ -72,15 +72,16 @@ const NavPanel = {
pinnedItems: (store) =>
new Set(store.prefsStorage.collections.pinnedNavItems),
}),
...mapPiniaState(useInstanceStore, {
bookmarks: getBookmarkFolderEntries,
pleromaChatMessagesAvailable: (store) =>
store.featureSet.pleromaChatMessagesAvailable,
bubbleTimeline: (store) => store.featureSet.localBubble,
}),
...mapPiniaState(useInstanceStore, ['private', 'federating']),
...mapState({
currentUser: (state) => state.users.currentUser,
followRequestCount: (state) => state.api.followRequests.length,
privateMode: (state) => useInstanceStore().private,
federating: (state) => useInstanceStore().federating,
pleromaChatMessagesAvailable: (state) =>
useInstanceStore().pleromaChatMessagesAvailable,
bubbleTimeline: (state) =>
useInstanceStore().localBubbleInstances.length > 0,
}),
pinnedList() {
if (!this.currentUser) {
@ -94,7 +95,7 @@ const NavPanel = {
hasChats: this.pleromaChatMessagesAvailable,
hasAnnouncements: this.supportsAnnouncements,
isFederating: this.federating,
isPrivate: this.privateMode,
isPrivate: this.private,
currentUser: this.currentUser,
supportsBubbleTimeline: this.bubbleTimeline,
supportsBookmarkFolders: this.bookmarks,
@ -118,7 +119,7 @@ const NavPanel = {
supportsBubbleTimeline: this.bubbleTimeline,
supportsBookmarkFolders: this.bookmarks,
isFederating: this.federating,
isPrivate: this.privateMode,
isPrivate: this.private,
currentUser: this.currentUser,
},
).slice(0, this.limit)

View file

@ -24,9 +24,6 @@ const passwordReset = {
signedIn: (state) => !!state.users.currentUser,
}),
...mapPiniaState(useInstanceStore, ['server', 'mailerEnabled']),
mailerEnabled() {
return this.mailerEnabled
},
},
created() {
if (this.signedIn) {

View file

@ -53,7 +53,7 @@ export default {
},
},
pollLimits() {
return useInstanceStore().pollLimits
return useInstanceStore().limits.pollLimits
},
maxOptions() {
return this.pollLimits.max_options

View file

@ -307,15 +307,15 @@ const PostStatusForm = {
return this.mergedConfig.alwaysShowSubjectInput
},
postFormats() {
return useInstanceStore().postFormats || []
return useInstanceStore().featureSet.postFormats || []
},
safeDMEnabled() {
return useInstanceStore().safeDM
return useInstanceStore().featureSet.safeDM
},
pollsAvailable() {
return (
useInstanceStore().pollsAvailable &&
useInstanceStore().pollLimits.max_options >= 2 &&
useInstanceStore().featureSet.pollsAvailable &&
useInstanceStore().limits.pollLimits.max_options >= 2 &&
this.disablePolls !== true
)
},
@ -344,7 +344,7 @@ const PostStatusForm = {
return typeof this.statusId !== 'undefined' && this.statusId.trim() !== ''
},
quotable() {
if (!useInstanceStore().quotingAvailable) {
if (!useInstanceStore().featureSet.quotingAvailable) {
return false
}

View file

@ -1,6 +1,5 @@
import { mapActions, mapState } from 'pinia'
import { v4 as uuidv4 } from 'uuid'
import { mapState as mapVuexState } from 'vuex'
import Checkbox from 'src/components/checkbox/checkbox.vue'
import Select from 'src/components/select/select.vue'
@ -33,8 +32,8 @@ const ClutterTab = {
Object.entries(store.prefsStorage.simple.muteFilters),
muteFiltersObject: (store) => store.prefsStorage.simple.muteFilters,
}),
...mapVuexState({
blockExpirationSupported: (state) => useInstanceStore().blockExpiration,
...mapState(useInstanceStore, {
blockExpirationSupported: (store) => store.featureSet.blockExpiration,
}),
onMuteDefaultActionLv1: {
get() {

View file

@ -130,8 +130,8 @@ const ComposingTab = {
},
},
...SharedComputedObject(),
...mapState({
blockExpirationSupported: (state) => useInstanceStore().blockExpiration,
...mapState(useInstanceStore, {
blockExpirationSupported: (store) => store.featureSet.blockExpiration,
}),
},
methods: {

View file

@ -1,7 +1,6 @@
import { cloneDeep } from 'lodash'
import { mapActions, mapState } from 'pinia'
import { v4 as uuidv4 } from 'uuid'
import { mapState as mapVuexState } from 'vuex'
import Checkbox from 'src/components/checkbox/checkbox.vue'
import Select from 'src/components/select/select.vue'
@ -99,8 +98,8 @@ const FilteringTab = {
Object.entries(store.prefsStorage.simple.muteFilters),
muteFiltersObject: (store) => store.prefsStorage.simple.muteFilters,
}),
...mapVuexState({
blockExpirationSupported: (state) => useInstanceStore().blockExpiration,
...mapState(useInstanceStore, {
blockExpirationSupported: (store) => store.featureSet.blockExpiration,
}),
onMuteDefaultActionLv1: {
get() {

View file

@ -1,4 +1,4 @@
import { mapState } from 'vuex'
import { mapState } from 'pinia'
import FontControl from 'src/components/font_control/font_control.vue'
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
@ -50,8 +50,8 @@ const GeneralTab = {
},
},
...SharedComputedObject(),
...mapState({
blockExpirationSupported: (state) => useInstanceStore().blockExpiration,
...mapState(useInstanceStore, {
blockExpirationSupported: (store) => store.featureSet.blockExpiration,
}),
},
methods: {

View file

@ -31,10 +31,10 @@ const GeneralTab = {
},
computed: {
postFormats() {
return useInstanceStore().postFormats || []
return useInstanceStore().featureSet.postFormats || []
},
instanceShoutboxPresent() {
return useInstanceStore().shoutAvailable
return useInstanceStore().featureSet.shoutAvailable
},
columns() {
const mode = this.$store.getters.mergedConfig.thirdColumnMode

View file

@ -43,7 +43,7 @@ const SecurityTab = {
return this.$store.state.users.currentUser
},
pleromaExtensionsAvailable() {
return useInstanceStore().pleromaExtensionsAvailable
return useInstanceStore().featureSet.pleromaExtensionsAvailable
},
oauthTokens() {
return useOAuthTokensStore().tokens.map((oauthToken) => {

View file

@ -495,7 +495,7 @@ const Status = {
return this.status.edited_at !== null
},
editingAvailable() {
return useInstanceStore().editingAvailable
return useInstanceStore().featureSet.editingAvailable
},
hasVisibleQuote() {
return this.status.quote_url && this.status.quote_visible

View file

@ -160,7 +160,10 @@ export const BUTTONS = [
icon: 'history',
label: 'status.status_history',
if({ status, state }) {
return useInstanceStore().editingAvailable && status.edited_at !== null
return (
useInstanceStore().featureSet.editingAvailable &&
status.edited_at !== null
)
},
action({ status }) {
const originalStatus = { ...status }
@ -190,7 +193,7 @@ export const BUTTONS = [
if({ status, loggedIn, currentUser, state }) {
return (
loggedIn &&
useInstanceStore().editingAvailable &&
useInstanceStore().featureSet.editingAvailable &&
status.user.id === currentUser.id
)
},

View file

@ -1,4 +1,6 @@
/* eslint-env browser */
import { useEmojiStore } from 'src/stores/emoji.js'
import { useInstanceStore } from 'src/stores/instance.js'
import statusPosterService from '../../services/status_poster/status_poster.service.js'
import TabSwitcher from '../tab_switcher/tab_switcher.jsx'

View file

@ -1,3 +1,4 @@
import { mapState as mapPiniaState } from 'pinia'
import { mapState } from 'vuex'
import { filterNavigation } from 'src/components/navigation/filter.js'
@ -59,14 +60,16 @@ const TimelineMenu = {
(route === 'bookmark-folder' || route === 'bookmarks')
)
},
...mapPiniaState(useInstanceStore, ['private', 'federating']),
...mapPiniaState(useInstanceStore, {
pleromaChatMessagesAvailable: (store) =>
store.featureSet.pleromaChatMessagesAvailable,
bookmarkFolders: (store) =>
store.featureSet.pleromaBookmarkFoldersAvailable,
bubbleTimeline: (store) => store.featureSet.localBubble,
}),
...mapState({
currentUser: (state) => state.users.currentUser,
privateMode: (state) => useInstanceStore().private,
federating: (state) => useInstanceStore().federating,
bookmarkFolders: (state) =>
useInstanceStore().pleromaBookmarkFoldersAvailable,
bubbleTimeline: (state) =>
useInstanceStore().localBubbleInstances.length > 0,
}),
timelinesList() {
return filterNavigation(
@ -74,7 +77,7 @@ const TimelineMenu = {
{
hasChats: this.pleromaChatMessagesAvailable,
isFederating: this.federating,
isPrivate: this.privateMode,
isPrivate: this.private,
currentUser: this.currentUser,
supportsBookmarkFolders: this.bookmarkFolders,
supportsBubbleTimeline: this.bubbleTimeline,

View file

@ -178,7 +178,7 @@ export default {
return false
},
groupActorAvailable() {
return useInstanceStore().groupActorAvailable
return useInstanceStore().featureSet.groupActorAvailable
},
availableActorTypes() {
return this.groupActorAvailable

View file

@ -88,7 +88,7 @@ const UserProfile = {
favoritesTabVisible() {
return (
this.isUs ||
(useInstanceStore().pleromaPublicFavouritesAvailable &&
(useInstanceStore().featureSet.pleromaPublicFavouritesAvailable &&
!this.user.hide_favorites)
)
},

View file

@ -47,7 +47,7 @@ const WhoToFollowPanel = {
return this.$store.state.users.currentUser.screen_name
},
suggestionsEnabled() {
return useInstanceStore().suggestionsEnabled
return useInstanceStore().featureSet.suggestionsEnabled
},
},
methods: {

View file

@ -238,7 +238,7 @@ const api = {
) {
if (
timeline === 'favourites' &&
!useInstanceStore().pleromaPublicFavouritesAvailable
!useInstanceStore().featureSet.pleromaPublicFavouritesAvailable
)
return
if (store.state.fetchers[timeline]) return
@ -323,7 +323,7 @@ const api = {
// Bookmark folders
startFetchingBookmarkFolders(store) {
if (store.state.fetchers.bookmarkFolders) return
if (!useInstanceStore().pleromaBookmarkFoldersAvailable) return
if (!useInstanceStore().featureSet.pleromaBookmarkFoldersAvailable) return
const fetcher =
store.state.backendInteractor.startFetchingBookmarkFolders({ store })
store.commit('addFetcher', { fetcherName: 'bookmarkFolders', fetcher })

View file

@ -763,7 +763,9 @@ const users = {
// Start fetching notifications
dispatch('startFetchingNotifications')
if (useInstanceStore().pleromaChatMessagesAvailable) {
if (
useInstanceStore().featureSet.pleromaChatMessagesAvailable
) {
// Start fetching chats
dispatch('startFetchingChats')
}

View file

@ -29,7 +29,7 @@ const fetchAndUpdate = ({ store, credentials, older = false, since }) => {
const timelineData = rootState.notifications
const hideMutedPosts = getters.mergedConfig.hideMutedPosts
if (useInstanceStore().pleromaChatMessagesAvailable) {
if (useInstanceStore().featureSet.pleromaChatMessagesAvailable) {
mastoApiNotificationTypes.add('pleroma:chat_mention')
}

View file

@ -77,7 +77,7 @@ const fetchAndUpdate = ({
.then((response) => {
if (response.errors) {
if (timeline === 'favorites') {
useInstanceStore().pleromaPublicFavouritesAvailable = false
useInstanceStore().featureSet.pleromaPublicFavouritesAvailable = false
return
}
throw new Error(`${response.status} ${response.statusText}`)

View file

@ -16,7 +16,7 @@ const defaultState = {
unicodeEmojiAnnotations: {},
// Stickers
stickers: null
stickers: null,
}
const SORTED_EMOJI_GROUP_IDS = [
@ -130,7 +130,7 @@ export const useEmojiStore = defineStore('emoji', {
},
},
actions: {
setStickers (stickers) {
setStickers(stickers) {
this.stickers = stickers
},
async getStaticEmoji() {

View file

@ -92,10 +92,6 @@ const defaultState = {
localBubble: false, // Akkoma
},
// Html stuff
instanceSpecificPanelContent: '',
tos: '',
// Version Information
backendVersion: '',
backendRepository: '',