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 } })