home.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import { clearBackendAuthTokens, loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth'
  2. import { getEntryHome, type BackendCardResult, type BackendEntryHomeResult } from '../../utils/backendApi'
  3. import { reportBackendClientLog } from '../../utils/backendClientLogs'
  4. import { setGlobalMockDebugBridgeEnabled } from '../../utils/globalMockDebugBridge'
  5. const DEFAULT_CHANNEL_CODE = 'mini-demo'
  6. const DEFAULT_CHANNEL_TYPE = 'wechat_mini'
  7. type HomePageData = {
  8. loading: boolean
  9. statusText: string
  10. userNameText: string
  11. tenantText: string
  12. channelText: string
  13. ongoingSessionText: string
  14. recentSessionText: string
  15. ongoingRuntimeText: string
  16. recentRuntimeText: string
  17. cards: BackendCardResult[]
  18. }
  19. function formatSessionSummary(session?: BackendEntryHomeResult['ongoingSession'] | null): string {
  20. if (!session) {
  21. return '无'
  22. }
  23. const title = session.eventName || session.eventDisplayName || session.eventId || session.id || session.sessionId
  24. const status = session.status || session.sessionStatus || '--'
  25. const route = session.routeCode || session.variantName || '默认赛道'
  26. return `${title} / ${status} / ${route}`
  27. }
  28. function formatRuntimeSummary(session?: BackendEntryHomeResult['ongoingSession'] | null): string {
  29. if (!session || !session.runtime) {
  30. return '运行对象 --'
  31. }
  32. const runtime = session.runtime
  33. const placeText = runtime.placeName || runtime.placeId || '--'
  34. const mapText = runtime.mapName || runtime.mapId || '--'
  35. const variantText = runtime.courseVariantId || session.variantName || session.variantId || '--'
  36. return `地点 ${placeText} / 地图 ${mapText} / 赛道 ${variantText}`
  37. }
  38. function requireAuthToken(): string | null {
  39. const app = getApp<IAppOption>()
  40. const tokens = app.globalData && app.globalData.backendAuthTokens
  41. ? app.globalData.backendAuthTokens
  42. : loadBackendAuthTokens()
  43. return tokens && tokens.accessToken ? tokens.accessToken : null
  44. }
  45. Page({
  46. data: {
  47. loading: false,
  48. statusText: '准备加载首页',
  49. userNameText: '--',
  50. tenantText: '--',
  51. channelText: '--',
  52. ongoingSessionText: '无',
  53. recentSessionText: '无',
  54. ongoingRuntimeText: '运行对象 --',
  55. recentRuntimeText: '运行对象 --',
  56. cards: [],
  57. } as HomePageData,
  58. onLoad() {
  59. this.loadEntryHome()
  60. },
  61. onShow() {
  62. this.loadEntryHome()
  63. },
  64. async loadEntryHome() {
  65. const accessToken = requireAuthToken()
  66. if (!accessToken) {
  67. wx.redirectTo({ url: '/pages/login/login' })
  68. return
  69. }
  70. this.setData({
  71. loading: true,
  72. statusText: '正在加载首页聚合',
  73. })
  74. try {
  75. const result = await getEntryHome({
  76. baseUrl: loadBackendBaseUrl(),
  77. accessToken,
  78. channelCode: DEFAULT_CHANNEL_CODE,
  79. channelType: DEFAULT_CHANNEL_TYPE,
  80. })
  81. this.applyEntryHomeResult(result)
  82. } catch (error) {
  83. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  84. this.setData({
  85. loading: false,
  86. statusText: `首页加载失败:${message}`,
  87. })
  88. }
  89. },
  90. applyEntryHomeResult(result: BackendEntryHomeResult) {
  91. reportBackendClientLog({
  92. level: 'info',
  93. category: 'entry-home',
  94. message: 'entry home loaded',
  95. details: {
  96. ongoingSessionId: result.ongoingSession && result.ongoingSession.id ? result.ongoingSession.id : '',
  97. ongoingEventId: result.ongoingSession && result.ongoingSession.eventId ? result.ongoingSession.eventId : '',
  98. recentSessionId: result.recentSession && result.recentSession.id ? result.recentSession.id : '',
  99. recentEventId: result.recentSession && result.recentSession.eventId ? result.recentSession.eventId : '',
  100. cardEventIds: (result.cards || []).map((item) => (item.event && item.event.id ? item.event.id : '')),
  101. },
  102. })
  103. this.setData({
  104. loading: false,
  105. statusText: '首页加载完成',
  106. userNameText: result.user.nickname || result.user.publicId || result.user.id,
  107. tenantText: `${result.tenant.name} (${result.tenant.code})`,
  108. channelText: `${result.channel.displayName} / ${result.channel.code}`,
  109. ongoingSessionText: formatSessionSummary(result.ongoingSession),
  110. recentSessionText: formatSessionSummary(result.recentSession),
  111. ongoingRuntimeText: formatRuntimeSummary(result.ongoingSession),
  112. recentRuntimeText: formatRuntimeSummary(result.recentSession),
  113. cards: result.cards || [],
  114. })
  115. },
  116. handleRefresh() {
  117. this.loadEntryHome()
  118. },
  119. handleOpenCard(event: WechatMiniprogram.TouchEvent) {
  120. const eventId = event.currentTarget.dataset.eventId as string | undefined
  121. if (!eventId) {
  122. wx.showToast({
  123. title: '该卡片暂无活动入口',
  124. icon: 'none',
  125. })
  126. return
  127. }
  128. wx.navigateTo({
  129. url: `/pages/event/event?eventId=${encodeURIComponent(eventId)}`,
  130. })
  131. },
  132. handleOpenRecentResult() {
  133. wx.navigateTo({
  134. url: '/pages/results/results',
  135. })
  136. },
  137. handleOpenEventList() {
  138. wx.navigateTo({
  139. url: '/pages/events/events',
  140. })
  141. },
  142. handleLogout() {
  143. clearBackendAuthTokens()
  144. setGlobalMockDebugBridgeEnabled(false)
  145. const app = getApp<IAppOption>()
  146. if (app.globalData) {
  147. app.globalData.backendAuthTokens = null
  148. }
  149. wx.redirectTo({
  150. url: '/pages/login/login',
  151. })
  152. },
  153. })