fix: theme persistence — error handling, backup, stale highlight
Bug 1 (critical): setTheme lacked try/catch around wx.setStorageSync.
If storage write throws (full / permission), the theme silently
fails to persist but UI has already changed → on next cold start
getCurrentTheme falls back to orange.
→ Wrap in try/catch; still apply UI change even if storage fails
(better to see the right color now than revert immediately).
Bug 2 (display): settings onShow called applyThemeToPage (updates
'theme' object) but never refreshed 'currentThemeId'. After tab
switching, the radio highlight showed the wrong theme.
→ Add setData({ currentThemeId }) in onShow.
Redundancy: theme now also saved as themeId in user_settings.
getCurrentTheme falls back to user_settings.themeId if app_theme
key is unexpectedly missing, providing a recovery path.
This commit is contained in:
+20
-3
@@ -50,8 +50,15 @@ let _navColorTimer = null
|
||||
const getThemeById = (id) => THEMES.find(t => t.id === id) || THEMES[0]
|
||||
|
||||
const getCurrentTheme = () => {
|
||||
const id = wx.getStorageSync(THEME_KEY) || DEFAULT_THEME_ID
|
||||
return getThemeById(id)
|
||||
let id = wx.getStorageSync(THEME_KEY)
|
||||
if (!id) {
|
||||
// fallback: try recovering from user_settings backup
|
||||
try {
|
||||
const s = wx.getStorageSync('user_settings')
|
||||
if (s && s.themeId) id = s.themeId
|
||||
} catch (e) {}
|
||||
}
|
||||
return getThemeById(id || DEFAULT_THEME_ID)
|
||||
}
|
||||
|
||||
const _setNavBarColor = (primary) => {
|
||||
@@ -69,7 +76,17 @@ const _setNavBarColor = (primary) => {
|
||||
}
|
||||
|
||||
const setTheme = (id) => {
|
||||
wx.setStorageSync(THEME_KEY, id)
|
||||
try {
|
||||
wx.setStorageSync(THEME_KEY, id)
|
||||
// redundant backup in user_settings
|
||||
try {
|
||||
const s = wx.getStorageSync('user_settings') || {}
|
||||
s.themeId = id
|
||||
wx.setStorageSync('user_settings', s)
|
||||
} catch (e) {}
|
||||
} catch (e) {
|
||||
console.error('Failed to save theme:', e)
|
||||
}
|
||||
const theme = getThemeById(id)
|
||||
_setNavBarColor(theme.primary)
|
||||
const app = getApp()
|
||||
|
||||
Reference in New Issue
Block a user