event.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth'
  2. import { getEventPlay, type BackendEventPlayResult } from '../../utils/backendApi'
  3. type EventPageData = {
  4. eventId: string
  5. loading: boolean
  6. titleText: string
  7. summaryText: string
  8. releaseText: string
  9. actionText: string
  10. statusText: string
  11. variantModeText: string
  12. variantSummaryText: string
  13. }
  14. function formatAssignmentMode(mode?: string | null): string {
  15. if (mode === 'manual') {
  16. return '手动选择'
  17. }
  18. if (mode === 'random') {
  19. return '随机分配'
  20. }
  21. if (mode === 'server-assigned') {
  22. return '后台指定'
  23. }
  24. return '默认单赛道'
  25. }
  26. function formatVariantSummary(result: BackendEventPlayResult): string {
  27. const variants = result.play.courseVariants || []
  28. if (!variants.length) {
  29. return '当前未声明额外赛道版本'
  30. }
  31. const selectable = variants.filter((item) => item.selectable !== false)
  32. const preview = variants.slice(0, 3).map((item) => item.routeCode || item.name).join(' / ')
  33. const suffix = variants.length > 3 ? ' / ...' : ''
  34. return `${variants.length} 条赛道,可选 ${selectable.length} 条:${preview}${suffix}`
  35. }
  36. function getAccessToken(): string | null {
  37. const app = getApp<IAppOption>()
  38. const tokens = app.globalData && app.globalData.backendAuthTokens
  39. ? app.globalData.backendAuthTokens
  40. : loadBackendAuthTokens()
  41. return tokens && tokens.accessToken ? tokens.accessToken : null
  42. }
  43. Page({
  44. data: {
  45. eventId: '',
  46. loading: false,
  47. titleText: '活动详情',
  48. summaryText: '未加载',
  49. releaseText: '--',
  50. actionText: '--',
  51. statusText: '待加载',
  52. variantModeText: '--',
  53. variantSummaryText: '--',
  54. } as EventPageData,
  55. onLoad(query: { eventId?: string }) {
  56. const eventId = query && query.eventId ? decodeURIComponent(query.eventId) : ''
  57. if (!eventId) {
  58. this.setData({
  59. statusText: '缺少 eventId',
  60. })
  61. return
  62. }
  63. this.setData({ eventId })
  64. this.loadEventPlay(eventId)
  65. },
  66. async loadEventPlay(eventId?: string) {
  67. const targetEventId = eventId || this.data.eventId
  68. const accessToken = getAccessToken()
  69. if (!accessToken) {
  70. wx.redirectTo({ url: '/pages/login/login' })
  71. return
  72. }
  73. this.setData({
  74. loading: true,
  75. statusText: '正在加载活动上下文',
  76. })
  77. try {
  78. const result = await getEventPlay({
  79. baseUrl: loadBackendBaseUrl(),
  80. eventId: targetEventId,
  81. accessToken,
  82. })
  83. this.applyEventPlay(result)
  84. } catch (error) {
  85. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  86. this.setData({
  87. loading: false,
  88. statusText: `活动加载失败:${message}`,
  89. })
  90. }
  91. },
  92. applyEventPlay(result: BackendEventPlayResult) {
  93. this.setData({
  94. loading: false,
  95. titleText: result.event.displayName,
  96. summaryText: result.event.summary || '暂无活动简介',
  97. releaseText: result.resolvedRelease
  98. ? `${result.resolvedRelease.configLabel} / ${result.resolvedRelease.releaseId}`
  99. : '当前无可用 release',
  100. actionText: `${result.play.primaryAction} / ${result.play.reason}`,
  101. statusText: result.play.canLaunch ? '可启动' : '当前不可启动',
  102. variantModeText: formatAssignmentMode(result.play.assignmentMode),
  103. variantSummaryText: formatVariantSummary(result),
  104. })
  105. },
  106. handleRefresh() {
  107. this.loadEventPlay()
  108. },
  109. async handleLaunch() {
  110. wx.navigateTo({
  111. url: `/pages/event-prepare/event-prepare?eventId=${encodeURIComponent(this.data.eventId)}`,
  112. })
  113. },
  114. })