Files
xuetang/TongjiUniApp/native-adapter/tang-detective/pages/home/home.js
T
2026-09-09 14:47:29 +08:00

185 lines
5.4 KiB
JavaScript

const memoryCards = require('../../data/memoryCards')
const { getProgress } = require('../../utils/storage')
const { getCollectedMemories } = require('../../utils/memoryCollection')
const { chapterRoute } = require('../../utils/chapterRoute')
const bridge = require('../../utils/platformBridge')
const STATUS_TEXT = {
guest: '游客阅读 · 仅存本机', offline: '离线存档 · 点此重试', pending: '本机已保存 · 等待同步',
connecting: '正在连接存档…', syncing: '本机已保存 · 正在同步', synced: '阅读存档已同步',
conflict: '存档有冲突 · 点此选择', 'auth-expired': '登录已失效 · 本机记录保留',
'storage-error': '本机未存成功 · 请检查空间', 'version-error': '存档版本不一致 · 仅本机阅读',
'sync-error': '存档未同步 · 请更新后重试',
}
const {
getHomeLayoutMetrics,
getHomeLayoutStyle,
hasReadingProgress,
} = require('./homeLayout')
Page({
data: {
tangStatusText: '正在读取存档…',
coverOpened: false,
completedCount: 0,
lastChapter: 1,
hasReadingProgress: false,
memoryCount: 0,
homeLayoutStyle: [
'height:390px',
'--home-top-inset:8px',
'--home-right-inset:10px',
'--home-bottom-inset:7px',
'--home-left-inset:10px',
].join(';'),
},
onLoad() {
this.unsubscribeTang = bridge.subscribe(() => this.refreshTangStatus())
this.refreshTangStatus()
this.applyHomeLayout()
},
onShow() {
this.refreshHomeProgress()
this.refreshTangStatus()
},
onUnload() {
if (this.unsubscribeTang) this.unsubscribeTang()
},
refreshHomeProgress() {
const progress = getProgress()
this.setData({
completedCount: progress.completedChapters.length,
lastChapter: progress.lastChapter || 1,
hasReadingProgress: hasReadingProgress(progress),
memoryCount: getCollectedMemories(progress, memoryCards).length,
})
this.applyHomeLayout()
},
refreshTangStatus() {
this.setData({ tangStatusText: STATUS_TEXT[bridge.getStatus()] || '本机阅读存档' })
},
async syncTang() {
const scope = bridge.getScope()
const visibleGeneration = this.__tangShowGeneration
const stillActive = () => !this.__tangDead && this.__tangVisible
&& this.__tangShowGeneration === visibleGeneration && bridge.getScope() === scope
if (!wx.getStorageSync('token')) {
wx.showToast({ title: '请先在学堂登录,游客记录不会自动上传', icon: 'none' })
return
}
await bridge.open(true)
if (!stillActive()) return
if (bridge.getStatus() !== 'conflict') { this.refreshHomeProgress(); return }
const conflictContext = bridge.getConflictContext()
wx.showActionSheet({
itemList: ['采用云端存档', '用本机存档覆盖云端'],
success: result => {
if (!stillActive() || bridge.getConflictContext() !== conflictContext) return
const choice = result.tapIndex === 0 ? 'cloud' : 'local'
wx.showModal({
title: '确认阅读存档',
content: choice === 'cloud' ? '将用云端进度替换当前本机进度。原记录会保留一份本机备份。'
: '将用本机进度覆盖云端,其他设备的未同步阅读可能不在其中。原记录会保留一份本机备份。',
confirmText: '确认使用',
success: async answer => {
if (answer.confirm && stillActive()) {
await bridge.resolveConflict(choice, conflictContext)
if (stillActive()) this.refreshHomeProgress()
}
},
})
},
})
},
returnToXuetang() {
bridge.flush()
wx.reLaunch({ url: '/tongji/pages/weekly' })
},
onResize(resizeInfo) {
this.applyHomeLayout(resizeInfo)
},
applyHomeLayout(resizeInfo = null) {
let windowInfo = {}
try {
windowInfo = wx.getWindowInfo
? wx.getWindowInfo()
: wx.getSystemInfoSync()
} catch (error) {
windowInfo = {}
}
const resizeSize = resizeInfo && resizeInfo.size
? resizeInfo.size
: resizeInfo
if (resizeSize) {
windowInfo = {
...windowInfo,
windowWidth: resizeSize.windowWidth || windowInfo.windowWidth,
windowHeight: resizeSize.windowHeight || windowInfo.windowHeight,
}
}
let menuRect = {}
try {
menuRect = wx.getMenuButtonBoundingClientRect
? wx.getMenuButtonBoundingClientRect()
: {}
} catch (error) {
menuRect = {}
}
const metrics = getHomeLayoutMetrics(windowInfo, menuRect)
this.setData({
homeLayoutStyle: getHomeLayoutStyle(metrics),
})
},
startGame() {
const chapter = this.data.lastChapter || 1
wx.navigateTo({
url: chapterRoute(chapter),
})
},
revealCover() {
if (this.data.coverOpened) return
this.setData({ coverOpened: true })
},
keepCoverOpen() {},
openCatalog() {
wx.navigateTo({ url: '/tang-detective/pages/catalog/catalog' })
},
openCast() {
wx.navigateTo({ url: '/tang-detective/pages/cast/cast' })
},
openMemories() {
wx.navigateTo({ url: '/tang-detective/pages/memories/memories' })
},
onShareAppMessage() {
return {
title: '唐侦探:在一桌饭里,看见被忽略的人',
path: '/tang-detective/pages/home/home',
}
},
onShareTimeline() {
return {
title: '唐侦探:在一桌饭里,看见被忽略的人',
query: '',
}
},
})