home.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. cards: BackendCardResult[]
  14. }
  15. function formatSessionSummary(session?: BackendEntryHomeResult['ongoingSession'] | null): string {
  16. if (!session) {
  17. return '无'
  18. }
  19. const title = session.eventName || session.eventDisplayName || session.eventId || session.id || session.sessionId
  20. const status = session.status || session.sessionStatus || '--'
  21. const route = session.routeCode || session.variantName || '默认赛道'
  22. return `${title} / ${status} / ${route}`
  23. }
  24. function requireAuthToken(): string | null {
  25. const app = getApp<IAppOption>()
  26. const tokens = app.globalData && app.globalData.backendAuthTokens
  27. ? app.globalData.backendAuthTokens
  28. : loadBackendAuthTokens()
  29. return tokens && tokens.accessToken ? tokens.accessToken : null
  30. }
  31. Page({
  32. data: {
  33. loading: false,
  34. statusText: '准备加载首页',
  35. userNameText: '--',
  36. tenantText: '--',
  37. channelText: '--',
  38. ongoingSessionText: '无',
  39. recentSessionText: '无',
  40. cards: [],
  41. } as HomePageData,
  42. onLoad() {
  43. this.loadEntryHome()
  44. },
  45. onShow() {
  46. this.loadEntryHome()
  47. },
  48. async loadEntryHome() {
  49. const accessToken = requireAuthToken()
  50. if (!accessToken) {
  51. wx.redirectTo({ url: '/pages/login/login' })
  52. return
  53. }
  54. this.setData({
  55. loading: true,
  56. statusText: '正在加载首页聚合',
  57. })
  58. try {
  59. const result = await getEntryHome({
  60. baseUrl: loadBackendBaseUrl(),
  61. accessToken,
  62. channelCode: DEFAULT_CHANNEL_CODE,
  63. channelType: DEFAULT_CHANNEL_TYPE,
  64. })
  65. this.applyEntryHomeResult(result)
  66. } catch (error) {
  67. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  68. this.setData({
  69. loading: false,
  70. statusText: `首页加载失败:${message}`,
  71. })
  72. }
  73. },
  74. applyEntryHomeResult(result: BackendEntryHomeResult) {
  75. this.setData({
  76. loading: false,
  77. statusText: '首页加载完成',
  78. userNameText: result.user.nickname || result.user.publicId || result.user.id,
  79. tenantText: `${result.tenant.name} (${result.tenant.code})`,
  80. channelText: `${result.channel.displayName} / ${result.channel.code}`,
  81. ongoingSessionText: formatSessionSummary(result.ongoingSession),
  82. recentSessionText: formatSessionSummary(result.recentSession),
  83. cards: result.cards || [],
  84. })
  85. },
  86. handleRefresh() {
  87. this.loadEntryHome()
  88. },
  89. handleOpenCard(event: WechatMiniprogram.TouchEvent) {
  90. const eventId = event.currentTarget.dataset.eventId as string | undefined
  91. if (!eventId) {
  92. wx.showToast({
  93. title: '该卡片暂无活动入口',
  94. icon: 'none',
  95. })
  96. return
  97. }
  98. wx.navigateTo({
  99. url: `/pages/event/event?eventId=${encodeURIComponent(eventId)}`,
  100. })
  101. },
  102. handleOpenRecentResult() {
  103. wx.navigateTo({
  104. url: '/pages/results/results',
  105. })
  106. },
  107. handleLogout() {
  108. clearBackendAuthTokens()
  109. const app = getApp<IAppOption>()
  110. if (app.globalData) {
  111. app.globalData.backendAuthTokens = null
  112. }
  113. wx.redirectTo({
  114. url: '/pages/login/login',
  115. })
  116. },
  117. })