This commit is contained in:
Henry Jameson 2026-03-13 15:32:21 +02:00
commit c7501f21a9
4 changed files with 148 additions and 136 deletions

View file

@ -1,129 +1,129 @@
// this is a snapshot of config keys used prior to sync config.
// used to migrate from old config.
export const defaultStateKeys = [
'expertLevel',
'hideISP',
'hideInstanceWallpaper',
'hideShoutbox',
'hideMutedPosts',
'hideMutedThreads',
'hideWordFilteredPosts',
'muteBotStatuses',
'muteSensitiveStatuses',
'collapseMessageWithSubject',
'padEmoji',
'hideAttachments',
'hideAttachmentsInConv',
'hideScrobbles',
'hideScrobblesAfter',
'maxThumbnails',
'hideNsfw',
'preloadImage',
'loopVideo',
'loopVideoSilentOnly',
'streaming',
'emojiReactionsOnTimeline',
'alwaysShowNewPostButton',
'autohideFloatingPostButton',
'pauseOnUnfocused',
'stopGifs',
'replyVisibility',
'thirdColumnMode',
'notificationVisibility',
'notificationNative',
'webPushNotifications',
'webPushAlwaysShowNotifications',
'interfaceLanguage',
'hideScopeNotice',
'useStreamingApi',
'sidebarRight',
'scopeCopy',
'subjectLineBehavior',
'alwaysShowSubjectInput',
'postContentType',
'minimalScopesMode',
'hideFilteredStatuses',
'modalOnRepeat',
'modalOnUnfollow',
'modalOnBlock',
'modalOnMute',
'modalOnMuteConversation',
'modalOnMuteDomain',
'modalOnDelete',
'modalOnLogout',
'modalOnApproveFollow',
'modalOnDenyFollow',
'modalOnRemoveUserFromFollowers',
'onMuteDefaultAction',
'onBlockDefaultAction',
'modalMobileCenter',
'playVideosInModal',
'useOneClickNsfw',
'useContainFit',
'disableStickyHeaders',
'showScrollbars',
'userPopoverAvatarAction',
'userPopoverOverlay',
'userCardLeftJustify',
'userCardHidePersonalMarks',
'sidebarColumnWidth',
'contentColumnWidth',
'notifsColumnWidth',
'themeEditorMinWidth',
'emojiReactionsScale',
'textSize',
'emojiSize',
'navbarSize',
'panelHeaderSize',
'forcedRoundness',
'navbarColumnStretch',
'greentext',
'mentionLinkDisplay',
'mentionLinkShowTooltip',
'mentionLinkShowAvatar',
'mentionLinkFadeDomain',
'mentionLinkShowYous',
'mentionLinkBoldenYou',
'hidePostStats',
'hideBotIndication',
'hideUserStats',
'virtualScrolling',
'sensitiveByDefault',
'conversationDisplay',
'conversationTreeAdvanced',
'conversationOtherRepliesButton',
'conversationTreeFadeAncestors',
'showExtraNotifications',
'showExtraNotificationsTip',
'showChatsInExtraNotifications',
'showAnnouncementsInExtraNotifications',
'showFollowRequestsInExtraNotifications',
'maxDepthInThread',
'autocompleteSelect',
'closingDrawerMarksAsSeen',
'unseenAtTop',
'ignoreInactionableSeen',
'unsavedPostAction',
'autoSaveDraft',
'useAbsoluteTimeFormat',
'absoluteTimeFormatMinAge',
'absoluteTime12h',
'imageCompression',
'alwaysUseJpeg',
'theme',
'expertLevel',
'hideISP',
'hideInstanceWallpaper',
'hideShoutbox',
'hideMutedPosts',
'hideMutedThreads',
'hideWordFilteredPosts',
'muteBotStatuses',
'muteSensitiveStatuses',
'collapseMessageWithSubject',
'padEmoji',
'hideAttachments',
'hideAttachmentsInConv',
'hideScrobbles',
'hideScrobblesAfter',
'maxThumbnails',
'hideNsfw',
'preloadImage',
'loopVideo',
'loopVideoSilentOnly',
'streaming',
'emojiReactionsOnTimeline',
'alwaysShowNewPostButton',
'autohideFloatingPostButton',
'pauseOnUnfocused',
'stopGifs',
'replyVisibility',
'thirdColumnMode',
'notificationVisibility',
'notificationNative',
'webPushNotifications',
'webPushAlwaysShowNotifications',
'interfaceLanguage',
'hideScopeNotice',
'useStreamingApi',
'sidebarRight',
'scopeCopy',
'subjectLineBehavior',
'alwaysShowSubjectInput',
'postContentType',
'minimalScopesMode',
'hideFilteredStatuses',
'modalOnRepeat',
'modalOnUnfollow',
'modalOnBlock',
'modalOnMute',
'modalOnMuteConversation',
'modalOnMuteDomain',
'modalOnDelete',
'modalOnLogout',
'modalOnApproveFollow',
'modalOnDenyFollow',
'modalOnRemoveUserFromFollowers',
'onMuteDefaultAction',
'onBlockDefaultAction',
'modalMobileCenter',
'playVideosInModal',
'useOneClickNsfw',
'useContainFit',
'disableStickyHeaders',
'showScrollbars',
'userPopoverAvatarAction',
'userPopoverOverlay',
'userCardLeftJustify',
'userCardHidePersonalMarks',
'sidebarColumnWidth',
'contentColumnWidth',
'notifsColumnWidth',
'themeEditorMinWidth',
'emojiReactionsScale',
'textSize',
'emojiSize',
'navbarSize',
'panelHeaderSize',
'forcedRoundness',
'navbarColumnStretch',
'greentext',
'mentionLinkDisplay',
'mentionLinkShowTooltip',
'mentionLinkShowAvatar',
'mentionLinkFadeDomain',
'mentionLinkShowYous',
'mentionLinkBoldenYou',
'hidePostStats',
'hideBotIndication',
'hideUserStats',
'virtualScrolling',
'sensitiveByDefault',
'conversationDisplay',
'conversationTreeAdvanced',
'conversationOtherRepliesButton',
'conversationTreeFadeAncestors',
'showExtraNotifications',
'showExtraNotificationsTip',
'showChatsInExtraNotifications',
'showAnnouncementsInExtraNotifications',
'showFollowRequestsInExtraNotifications',
'maxDepthInThread',
'autocompleteSelect',
'closingDrawerMarksAsSeen',
'unseenAtTop',
'ignoreInactionableSeen',
'unsavedPostAction',
'autoSaveDraft',
'useAbsoluteTimeFormat',
'absoluteTimeFormatMinAge',
'absoluteTime12h',
'imageCompression',
'alwaysUseJpeg',
'theme',
'colors',
'colors',
'customTheme',
'customThemeSource',
'customTheme',
'customThemeSource',
'style',
'styleCustomData',
'palette',
'paletteCustomData',
'themeDebug',
'forceThemeRecompilation',
'theme3hacks',
// 'muteWords', // mutes migrated separately
// 'highlight', // highlight migration is done separately
'style',
'styleCustomData',
'palette',
'paletteCustomData',
'themeDebug',
'forceThemeRecompilation',
'theme3hacks',
// 'muteWords', // mutes migrated separately
// 'highlight', // highlight migration is done separately
]

View file

@ -1,12 +1,13 @@
import sum from 'hash-sum'
import localforage from 'localforage'
import { chunk, throttle } from 'lodash'
import { getCssRules } from '../theme_data/css_utils.js'
import { getEngineChecksum, init } from '../theme_data/theme_data_3.service.js'
import sum from 'hash-sum'
import { useSyncConfigStore } from 'src/stores/sync_config.js'
import { defaultState } from 'src/modules/default_config_state.js'
import { useSyncConfigStore } from 'src/stores/sync_config.js'
// On platforms where this is not supported, it will return undefined
// Otherwise it will return an array
@ -138,9 +139,11 @@ export const tryLoadCache = async () => {
const cache = await localforage.getItem('pleromafe-theme-cache')
if (!cache) return null
try {
if (cache.engineChecksum === getEngineChecksum() &&
cache.checksum !== undefined &&
cache.checksum === useSyncConfigStore().mergedConfig.themeChecksum) {
if (
cache.engineChecksum === getEngineChecksum() &&
cache.checksum !== undefined &&
cache.checksum === useSyncConfigStore().mergedConfig.themeChecksum
) {
const eagerStyles = createStyleSheet(EAGER_STYLE_ID, 10)
const lazyStyles = createStyleSheet(LAZY_STYLE_ID, 20)
@ -206,7 +209,10 @@ export const applyTheme = (
engineChecksum: getEngineChecksum(),
data,
}
useSyncConfigStore().setSimplePrefAndSave({ path: 'themeChecksum', value: checksum })
useSyncConfigStore().setSimplePrefAndSave({
path: 'themeChecksum',
value: checksum,
})
onFinish(cache)
localforage.setItem('pleromafe-theme-cache', cache)
console.info('Theme cache stored')

View file

@ -20,9 +20,9 @@ import { CURRENT_UPDATE_COUNTER } from 'src/components/update_notification/updat
import { useInstanceStore } from 'src/stores/instance.js'
import { useLocalConfigStore } from 'src/stores/local_config.js'
import { storage } from 'src/lib/storage.js'
import { defaultState as configDefaultState } from 'src/modules/default_config_state.js'
import { defaultStateKeys } from 'src/modules/old_default_config_state.js'
import { storage } from 'src/lib/storage.js'
export const VERSION = 2
export const NEW_USER_DATE = new Date('2022-08-04') // date of writing this, basically
@ -421,7 +421,7 @@ export const _doMigrations = async (data, setPreference) => {
if (data._version === 1) {
// Migrate old config to sync config
const vuexState = await storage.getItem('vuex-lz')
defaultStateKeys.forEach(key => {
defaultStateKeys.forEach((key) => {
setPreference({ path: `simple.${key}`, value: vuexState.config[key] })
})
}
@ -633,8 +633,8 @@ export const useSyncConfigStore = defineStore('sync_config', {
})
}
recent = recent && await _doMigrations(recent, this.setPreference)
stale = stale && await _doMigrations(stale, this.setPreference)
recent = recent && (await _doMigrations(recent, this.setPreference))
stale = stale && (await _doMigrations(stale, this.setPreference))
if (!needUpload && recent && stale) {
console.debug('Checking if data needs merging...')

View file

@ -13,8 +13,8 @@ import {
} from 'lodash'
import { defineStore } from 'pinia'
import { toRaw } from 'vue'
import { storage } from 'src/lib/storage.js'
import { storage } from 'src/lib/storage.js'
import { defaultState as configDefaultState } from 'src/modules/default_config_state'
export const NEW_USER_DATE = new Date('2022-08-04') // date of writing this, basically
@ -82,7 +82,9 @@ export const _getRecentData = (cache, live, isTest) => {
result.recent = live
result.stale = cache
} else if (cacheValid && liveValid) {
console.debug('[HIGHLIGHT] Both sources have valid data, figuring things out...')
console.debug(
'[HIGHLIGHT] Both sources have valid data, figuring things out...',
)
if (live._timestamp === cache._timestamp) {
console.debug(
'[HIGHLIGHT] Same timestamp on both sources, source of truth irrelevant',
@ -284,7 +286,9 @@ export const useUserHighlightStore = defineStore('user_highlight', {
needUpload = true
this.set({ user, value: clone(value) })
vuexState.config.highlight[user]._migrated = 1
console.debug(`[HIGHLIGHT] Migrating user ${user}: ${ JSON.stringify(value) }`)
console.debug(
`[HIGHLIGHT] Migrating user ${user}: ${JSON.stringify(value)}`,
)
}
})
storage.setItem('vuex-lz', vuexState)
@ -304,7 +308,9 @@ export const useUserHighlightStore = defineStore('user_highlight', {
const { _timestamp: _0, ...recentData } = recent
const { _timestamp: _2, ...staleData } = stale
dirty = !isEqual(recentData, staleData)
console.debug(`[HIGHLIGHT] Data ${dirty ? 'needs' : "doesn't need"} merging`)
console.debug(
`[HIGHLIGHT] Data ${dirty ? 'needs' : "doesn't need"} merging`,
)
}
let highlights