event.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth'
  2. import { getEventPlay, launchEvent, type BackendEventPlayResult } from '../../utils/backendApi'
  3. import { adaptBackendLaunchResultToEnvelope } from '../../utils/backendLaunchAdapter'
  4. import { prepareMapPageUrlForLaunch } from '../../utils/gameLaunch'
  5. type EventPageData = {
  6. eventId: string
  7. loading: boolean
  8. titleText: string
  9. summaryText: string
  10. releaseText: string
  11. actionText: string
  12. statusText: string
  13. }
  14. function getAccessToken(): string | null {
  15. const app = getApp<IAppOption>()
  16. const tokens = app.globalData && app.globalData.backendAuthTokens
  17. ? app.globalData.backendAuthTokens
  18. : loadBackendAuthTokens()
  19. return tokens && tokens.accessToken ? tokens.accessToken : null
  20. }
  21. Page({
  22. data: {
  23. eventId: '',
  24. loading: false,
  25. titleText: '活动详情',
  26. summaryText: '未加载',
  27. releaseText: '--',
  28. actionText: '--',
  29. statusText: '待加载',
  30. } as EventPageData,
  31. onLoad(query: { eventId?: string }) {
  32. const eventId = query && query.eventId ? decodeURIComponent(query.eventId) : ''
  33. if (!eventId) {
  34. this.setData({
  35. statusText: '缺少 eventId',
  36. })
  37. return
  38. }
  39. this.setData({ eventId })
  40. this.loadEventPlay(eventId)
  41. },
  42. async loadEventPlay(eventId?: string) {
  43. const targetEventId = eventId || this.data.eventId
  44. const accessToken = getAccessToken()
  45. if (!accessToken) {
  46. wx.redirectTo({ url: '/pages/login/login' })
  47. return
  48. }
  49. this.setData({
  50. loading: true,
  51. statusText: '正在加载活动上下文',
  52. })
  53. try {
  54. const result = await getEventPlay({
  55. baseUrl: loadBackendBaseUrl(),
  56. eventId: targetEventId,
  57. accessToken,
  58. })
  59. this.applyEventPlay(result)
  60. } catch (error) {
  61. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  62. this.setData({
  63. loading: false,
  64. statusText: `活动加载失败:${message}`,
  65. })
  66. }
  67. },
  68. applyEventPlay(result: BackendEventPlayResult) {
  69. this.setData({
  70. loading: false,
  71. titleText: result.event.displayName,
  72. summaryText: result.event.summary || '暂无活动简介',
  73. releaseText: result.resolvedRelease
  74. ? `${result.resolvedRelease.configLabel} / ${result.resolvedRelease.releaseId}`
  75. : '当前无可用 release',
  76. actionText: `${result.play.primaryAction} / ${result.play.reason}`,
  77. statusText: result.play.canLaunch ? '可启动' : '当前不可启动',
  78. })
  79. },
  80. handleRefresh() {
  81. this.loadEventPlay()
  82. },
  83. async handleLaunch() {
  84. const accessToken = getAccessToken()
  85. if (!accessToken) {
  86. wx.redirectTo({ url: '/pages/login/login' })
  87. return
  88. }
  89. this.setData({
  90. statusText: '正在创建 session 并进入地图',
  91. })
  92. try {
  93. const result = await launchEvent({
  94. baseUrl: loadBackendBaseUrl(),
  95. eventId: this.data.eventId,
  96. accessToken,
  97. clientType: 'wechat',
  98. deviceKey: 'mini-dev-device-001',
  99. })
  100. const envelope = adaptBackendLaunchResultToEnvelope(result)
  101. wx.navigateTo({
  102. url: prepareMapPageUrlForLaunch(envelope),
  103. })
  104. } catch (error) {
  105. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  106. this.setData({
  107. statusText: `launch 失败:${message}`,
  108. })
  109. }
  110. },
  111. })