diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue
index cd463a34a..a0439ed4a 100644
--- a/src/components/settings_modal/tabs/appearance_tab.vue
+++ b/src/components/settings_modal/tabs/appearance_tab.vue
@@ -235,7 +235,7 @@
{{ $t('settings.style.themes3.hacks.underlay_overrides') }}
diff --git a/src/lib/style.js b/src/lib/style.js
index e91362c24..534d120e3 100644
--- a/src/lib/style.js
+++ b/src/lib/style.js
@@ -23,15 +23,12 @@ const APPEARANCE_SETTINGS_KEYS = [
'forcedRoundness',
'emojiSize',
'emojiReactionsScale',
-]
-
-const HACKS_KEYS = new Set([
'fontInterface',
'fontPosts',
'fontInput',
'fontMonospace',
'underlay',
-])
+]
const MIXED_KEYS = new Set([
...APPEARANCE_SETTINGS_KEYS,
@@ -45,8 +42,6 @@ export const piniaStylePlugin = ({ store, options }) => {
const { path } = args[0]
if (MIXED_KEYS.has(path)) {
after(() => applyStyleConfig(useMergedConfigStore().mergedConfig))
- }
- if (HACKS_KEYS.has(path)) {
after(() => useInterfaceStore().applyTheme({ recompile: true }))
}
}
diff --git a/src/main.js b/src/main.js
index ceb8c0878..44b01aabb 100644
--- a/src/main.js
+++ b/src/main.js
@@ -41,7 +41,7 @@ const i18n = createI18n({
messages.setLanguage(i18n.global, currentLocale)
const persistedStateOptions = {
- paths: ['users.lastLoginName', 'oauth'],
+ paths: ['users.lastLoginName', 'oauth', 'config'],
}
;(async () => {
diff --git a/src/modules/config_declaration.js b/src/modules/config_declaration.js
deleted file mode 100644
index 38619f4fb..000000000
--- a/src/modules/config_declaration.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useMergedConfigStore } from 'src/stores/merged_config.js'
-
-export const CONFIG_MIGRATION = 1
-
-import { v4 as uuidv4 } from 'uuid'
-
-// for future use
-/*
-const simpleDeclaration = {
- store: 'server-side',
- migrationFlag: 'configMigration',
- migration(serverside, rootState) {
- serverside.setSimplePrefAndSave({ path: field, value: rootState.config[oldField ?? field] })
- }
-}
-*/
-
-export const declarations = [
- {
- field: 'muteFilters',
- store: 'server-side',
- migrationFlag: 'configMigration',
- migrationNum: 1,
- description: 'Mute filters, wordfilter/regexp/etc',
- valueType: 'complex',
- migration(serverside, rootState) {
- useMergedConfigStore().mergedConfig.muteWords.forEach((word, order) => {
- const uniqueId = uuidv4()
-
- serverside.setPreference({
- path: 'simple.muteFilters.' + uniqueId,
- value: {
- type: 'word',
- value: word,
- name: word,
- enabled: true,
- expires: null,
- hide: false,
- order,
- },
- })
- })
- },
- },
-]
diff --git a/src/modules/default_config_state.js b/src/modules/default_config_state.js
index 1d7873309..5f797126d 100644
--- a/src/modules/default_config_state.js
+++ b/src/modules/default_config_state.js
@@ -531,18 +531,17 @@ export const INSTANCE_DEFAULT_CONFIG_DEFINITIONS = {
type: 'string',
required: false,
},
- theme3hacks: {
- description: 'Theme 3 hacks (need separation)',
- type: 'object',
- required: false,
- default: {},
- },
highlights: {
description: 'User highlights',
type: 'object',
required: false,
default: {},
},
+ underlay: {
+ description: 'Underlay override',
+ required: true,
+ default: 'none',
+ },
}
export const INSTANCE_DEFAULT_CONFIG = convertDefinitions(
INSTANCE_DEFAULT_CONFIG_DEFINITIONS,
@@ -634,11 +633,6 @@ export const LOCAL_DEFAULT_CONFIG_DEFINITIONS = {
description: 'Streaming API (WebSocket)',
default: false,
},
- underlay: {
- description: 'Underlay override',
- required: true,
- default: 'none',
- },
fontInterface: {
description: 'Interface font override',
type: 'object',
@@ -766,6 +760,7 @@ export const validateSetting = ({
if (value === undefined) return undefined // only null is allowed as missing value
if (definition === undefined) return undefined // invalid definition
const path = fullPath.replace(/^simple./, '')
+ const depth = path.split('.')
if (
validateObjects &&
definition.type === 'object' &&
@@ -777,12 +772,6 @@ export const validateSetting = ({
return undefined
}
- if (path.includes('muteFilters')) {
- console.log('##', path, value, definition)
- console.log(value)
- console.log(path)
- console.log('====')
- }
if (get(defaultState, path.split('.')[0]) === undefined) {
const string = `Unknown option ${fullPath}, value: ${value}`
@@ -811,7 +800,7 @@ export const validateSetting = ({
}
}
- if (value !== null && type != null && typeof value !== type) {
+ if (depth > 2 && value !== null && type != null && typeof value !== type) {
const string = `Invalid type for setting ${path}: expected type ${type}, got ${typeof value}, value ${value}; defaulting`
if (throwError) {
diff --git a/src/modules/users.js b/src/modules/users.js
index 8b2a991c5..db5b16ccc 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -30,8 +30,6 @@ import { useOAuthStore } from 'src/stores/oauth.js'
import { useSyncConfigStore } from 'src/stores/sync_config.js'
import { useUserHighlightStore } from 'src/stores/user_highlight.js'
-import { declarations } from 'src/modules/config_declaration'
-
// TODO: Unify with mergeOrAdd in statuses.js
export const mergeOrAdd = (arr, obj, item) => {
if (!item) {
@@ -742,25 +740,6 @@ const users = {
useSyncConfigStore().setFlag({ flag: 'configMigration', value: 0 })
/**/
- const { configMigration } = useSyncConfigStore().flagStorage
- declarations
- .filter((x) => {
- return (
- x.store === 'server-side' &&
- x.migrationNum > 0 &&
- x.migrationNum > configMigration
- )
- })
- .toSorted((a, b) => a.configMigration - b.configMigration)
- .forEach((value) => {
- value.migration(useSyncConfigStore(), store.rootState)
- useSyncConfigStore().setFlag({
- flag: 'configMigration',
- value: value.migrationNum,
- })
- useSyncConfigStore().pushSyncConfig()
- })
-
if (user.token) {
dispatch('setWsToken', user.token)
diff --git a/src/stores/sync_config.js b/src/stores/sync_config.js
index d7422d0a9..722dd7f16 100644
--- a/src/stores/sync_config.js
+++ b/src/stores/sync_config.js
@@ -14,6 +14,7 @@ import {
uniqWith,
unset,
} from 'lodash'
+import { v4 as uuidv4 } from 'uuid'
import { defineStore } from 'pinia'
import { toRaw } from 'vue'
@@ -676,15 +677,17 @@ export const useSyncConfigStore = defineStore('sync_config', {
// Various migrations
console.debug('Migrating from old config')
const vuexState = (await storage.getItem('vuex-lz')) ?? {}
- vuexState.config = vuexState.config ?? {}
+ const config = vuexState.config ?? {}
- const migratedEntries = new Set(vuexState.config._syncMigration ?? [])
+ const migratedEntries = new Set(config._syncMigration ?? [])
console.debug(
`Already migrated Values: ${[...migratedEntries].join() || '[none]'}`,
)
+ const { configMigration } = useSyncConfigStore().flagStorage
+
Object.entries(oldDefaultConfigSync).forEach(([key, value]) => {
- const oldValue = vuexState.config[key]
+ const oldValue = config[key]
const defaultValue = value
const present = oldValue !== undefined
@@ -710,10 +713,27 @@ export const useSyncConfigStore = defineStore('sync_config', {
path: 'fontMonospace',
value: oldValue.fonts.monospace,
})
- useLocalConfigStore().set({
+ useSyncConfigStore().setSimplePrefAndSave({
path: 'underlay',
value: oldValue.underlay,
})
+ } else if (key == 'muteWords') {
+ oldValue.forEach((word, order) => {
+ const uniqueId = uuidv4()
+
+ useSyncConfigStore().setPreference({
+ path: 'simple.muteFilters.' + uniqueId,
+ value: {
+ type: 'word',
+ value: word,
+ name: word,
+ enabled: true,
+ expires: null,
+ hide: false,
+ order,
+ },
+ })
+ })
} else {
this.setPreference({ path: `simple.${key}`, value: oldValue })
}
@@ -722,7 +742,8 @@ export const useSyncConfigStore = defineStore('sync_config', {
}
})
- vuexState.config._syncMigration = [...migratedEntries]
+ config._syncMigration = [...migratedEntries]
+ vuexState.config = config
storage.setItem('vuex-lz', vuexState)
if (!needUpload && recent && stale) {
@@ -789,7 +810,7 @@ export const useSyncConfigStore = defineStore('sync_config', {
})
return finalValue === undefined
- ? definition.default
+ ? [path, definition.default]
: [path, finalValue]
})
newState.prefsStorage.simple = Object.fromEntries(
diff --git a/src/stores/user_highlight.js b/src/stores/user_highlight.js
index ca61c6e4e..5ca13b6a9 100644
--- a/src/stores/user_highlight.js
+++ b/src/stores/user_highlight.js
@@ -278,21 +278,21 @@ export const useUserHighlightStore = defineStore('user_highlight', {
let dirty = false
const vuexState = (await storage.getItem('vuex-lz')) ?? {}
- vuexState.config = vuexState.config ?? {}
- const highlight = vuexState.config.highlight ?? {}
+ const config = vuexState.config ?? {}
+ const highlight = config.highlight ?? {}
Object.entries(highlight).forEach(([user, value]) => {
if ((highlight[user]._migrated || 0) < 1) {
dirty = true
needUpload = true
this.set({ user, value: clone(value) })
- vuexState.config.highlight[user]._migrated = 1
+ highlight[user]._migrated = 1
console.debug(
`[HIGHLIGHT] Migrating user ${user}: ${JSON.stringify(value)}`,
)
}
})
- storage.setItem('vuex-lz', vuexState)
+ storage.setItem('vuex-lz', { ...vuexState, config: { ...config, highlight } })
if (recent === null) {
console.debug(