import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth' import { getEventPlay, type BackendEventPlayResult } from '../../utils/backendApi' import { formatBackendPlayActionText, formatBackendPlayStatusText } from '../../utils/backendPlayCopy' type EventPageData = { eventId: string loading: boolean titleText: string summaryText: string releaseText: string actionText: string statusText: string variantModeText: string variantSummaryText: string presentationText: string contentBundleText: string } function formatAssignmentMode(mode?: string | null): string { if (mode === 'manual') { return '手动选择' } if (mode === 'random') { return '随机分配' } if (mode === 'server-assigned') { return '后台指定' } return '默认单赛道' } function formatVariantSummary(result: BackendEventPlayResult): string { const variants = result.play.courseVariants || [] if (!variants.length) { return '当前未声明额外赛道版本' } const selectable = variants.filter((item) => item.selectable !== false) const preview = variants.slice(0, 3).map((item) => item.routeCode || item.name).join(' / ') const suffix = variants.length > 3 ? ' / ...' : '' return `${variants.length} 条赛道,可选 ${selectable.length} 条:${preview}${suffix}` } function formatPresentationSummary(result: BackendEventPlayResult): string { const currentPresentation = result.currentPresentation if (!currentPresentation) { return '当前未声明展示版本' } const presentationId = currentPresentation.presentationId || '--' const templateKey = currentPresentation.templateKey || '--' const version = currentPresentation.version || '--' return `${presentationId} / ${templateKey} / ${version}` } function formatContentBundleSummary(result: BackendEventPlayResult): string { const currentContentBundle = result.currentContentBundle if (!currentContentBundle) { return '当前未声明内容包版本' } const bundleId = currentContentBundle.bundleId || '--' const bundleType = currentContentBundle.bundleType || '--' const version = currentContentBundle.version || '--' return `${bundleId} / ${bundleType} / ${version}` } 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: '待加载', variantModeText: '--', variantSummaryText: '--', presentationText: '--', contentBundleText: '--', } 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: formatBackendPlayActionText(result.play.primaryAction, result.play.reason), statusText: formatBackendPlayStatusText(result.play.canLaunch, result.play.primaryAction, result.play.reason), variantModeText: formatAssignmentMode(result.play.assignmentMode), variantSummaryText: formatVariantSummary(result), presentationText: formatPresentationSummary(result), contentBundleText: formatContentBundleSummary(result), }) }, handleRefresh() { this.loadEventPlay() }, async handleLaunch() { wx.navigateTo({ url: `/pages/event-prepare/event-prepare?eventId=${encodeURIComponent(this.data.eventId)}`, }) }, })