import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth' import { getEventPlay, launchEvent, type BackendEventPlayResult } from '../../utils/backendApi' import { adaptBackendLaunchResultToEnvelope } from '../../utils/backendLaunchAdapter' import { prepareMapPageUrlForLaunch } from '../../utils/gameLaunch' type EventPageData = { eventId: string loading: boolean titleText: string summaryText: string releaseText: string actionText: string statusText: string } function getAccessToken(): string | null { const app = getApp() const tokens = app.globalData && app.globalData.backendAuthTokens ? app.globalData.backendAuthTokens : loadBackendAuthTokens() return tokens && tokens.accessToken ? tokens.accessToken : null } Page({ data: { eventId: '', loading: false, titleText: '活动详情', summaryText: '未加载', releaseText: '--', actionText: '--', statusText: '待加载', } as EventPageData, onLoad(query: { eventId?: string }) { const eventId = query && query.eventId ? decodeURIComponent(query.eventId) : '' if (!eventId) { this.setData({ statusText: '缺少 eventId', }) return } this.setData({ eventId }) this.loadEventPlay(eventId) }, async loadEventPlay(eventId?: string) { const targetEventId = eventId || this.data.eventId const accessToken = getAccessToken() if (!accessToken) { wx.redirectTo({ url: '/pages/login/login' }) return } this.setData({ loading: true, statusText: '正在加载活动上下文', }) try { const result = await getEventPlay({ baseUrl: loadBackendBaseUrl(), eventId: targetEventId, accessToken, }) this.applyEventPlay(result) } catch (error) { const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误' this.setData({ loading: false, statusText: `活动加载失败:${message}`, }) } }, applyEventPlay(result: BackendEventPlayResult) { this.setData({ loading: false, titleText: result.event.displayName, summaryText: result.event.summary || '暂无活动简介', releaseText: result.resolvedRelease ? `${result.resolvedRelease.configLabel} / ${result.resolvedRelease.releaseId}` : '当前无可用 release', actionText: `${result.play.primaryAction} / ${result.play.reason}`, statusText: result.play.canLaunch ? '可启动' : '当前不可启动', }) }, handleRefresh() { this.loadEventPlay() }, async handleLaunch() { const accessToken = getAccessToken() if (!accessToken) { wx.redirectTo({ url: '/pages/login/login' }) return } this.setData({ statusText: '正在创建 session 并进入地图', }) try { const result = await launchEvent({ baseUrl: loadBackendBaseUrl(), eventId: this.data.eventId, accessToken, clientType: 'wechat', deviceKey: 'mini-dev-device-001', }) const envelope = adaptBackendLaunchResultToEnvelope(result) wx.navigateTo({ url: prepareMapPageUrlForLaunch(envelope), }) } catch (error) { const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误' this.setData({ statusText: `launch 失败:${message}`, }) } }, })