home.ts 4.3 KB

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