Files
wx_pbzc/app.js
T
lc fa8d8e7b4b fix: seed existing local data to cloud on first launch
Previously cloud sync only triggered on writes. If the user already
had training records before cloud was enabled, they'd never be pushed
— leaving the database empty until the next training session.

Now onLaunch handles both cases:
  - Local empty → restore from cloud (recovery after deletion)
  - Local has data → check cloud; if cloud empty, push existing data up

Also extract _restoreFromCloud to reduce nesting.
2026-06-04 17:29:13 +08:00

71 lines
1.9 KiB
JavaScript

const themeMod = require('./utils/theme')
const cloud = require('./utils/cloud')
App({
onLaunch() {
// Init cloud storage (no-op if not configured)
cloud.init()
const settings = wx.getStorageSync('user_settings')
if (!settings) {
wx.setStorageSync('user_settings', {
planId: 'beginner',
dailyReminder: true,
reminderTime: '08:00',
voiceGuide: true,
vibrate: true
})
}
const streak = wx.getStorageSync('current_streak')
if (!streak) {
wx.setStorageSync('current_streak', { count: 0, lastDate: '' })
}
this.globalData.theme = themeMod.getCurrentTheme()
// Sync with cloud: pull on empty local, push on empty cloud
const records = wx.getStorageSync('training_records')
if (!records || Object.keys(records).length === 0) {
// Case 1: Fresh install — restore from cloud
cloud.pullAll().then(cloudData => this._restoreFromCloud(cloudData))
} else {
// Case 2: Has local data — check if cloud needs seeding
cloud.pullAll().then(cloudData => {
if (!cloudData) {
// Cloud empty: push existing local data up
cloud.pushAll()
} else {
// Both have data — trust local (latest) and re-push
cloud.pushAll()
}
})
}
},
_restoreFromCloud(cloudData) {
if (!cloudData) return
try {
if (cloudData.records && Object.keys(cloudData.records).length > 0) {
wx.setStorageSync('training_records', cloudData.records)
}
if (cloudData.settings) {
wx.setStorageSync('user_settings', cloudData.settings)
}
if (cloudData.streak) {
wx.setStorageSync('current_streak', cloudData.streak)
}
if (cloudData.themeId) {
themeMod.setTheme(cloudData.themeId)
}
} catch (e) {
console.error('Cloud restore failed:', e)
}
},
globalData: {
planId: 'beginner',
theme: null
}
})