124 lines
3.5 KiB
TypeScript
124 lines
3.5 KiB
TypeScript
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<IAppOption>()
|
|
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}`,
|
|
})
|
|
}
|
|
},
|
|
})
|