result.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth'
  2. import { getMyResults, getSessionResult, type BackendSessionResultView } from '../../utils/backendApi'
  3. type ResultPageData = {
  4. sessionId: string
  5. statusText: string
  6. sessionTitleText: string
  7. sessionSubtitleText: string
  8. rows: Array<{ label: string; value: string }>
  9. recentResults: BackendSessionResultView[]
  10. }
  11. function getAccessToken(): string | null {
  12. const app = getApp<IAppOption>()
  13. const tokens = app.globalData && app.globalData.backendAuthTokens
  14. ? app.globalData.backendAuthTokens
  15. : loadBackendAuthTokens()
  16. return tokens && tokens.accessToken ? tokens.accessToken : null
  17. }
  18. function formatValue(value: unknown): string {
  19. if (value === null || value === undefined || value === '') {
  20. return '--'
  21. }
  22. return String(value)
  23. }
  24. Page({
  25. data: {
  26. sessionId: '',
  27. statusText: '准备加载结果',
  28. sessionTitleText: '结果页',
  29. sessionSubtitleText: '未加载',
  30. rows: [],
  31. recentResults: [],
  32. } as ResultPageData,
  33. onLoad(query: { sessionId?: string }) {
  34. const sessionId = query && query.sessionId ? decodeURIComponent(query.sessionId) : ''
  35. this.setData({ sessionId })
  36. if (sessionId) {
  37. this.loadSingleResult(sessionId)
  38. return
  39. }
  40. this.loadRecentResults()
  41. },
  42. async loadSingleResult(sessionId: string) {
  43. const accessToken = getAccessToken()
  44. if (!accessToken) {
  45. wx.redirectTo({ url: '/pages/login/login' })
  46. return
  47. }
  48. this.setData({
  49. statusText: '正在加载单局结果',
  50. })
  51. try {
  52. const result = await getSessionResult({
  53. baseUrl: loadBackendBaseUrl(),
  54. accessToken,
  55. sessionId,
  56. })
  57. this.setData({
  58. statusText: '单局结果加载完成',
  59. sessionTitleText: result.session.eventName || result.session.eventDisplayName || result.session.eventId || result.session.id || result.session.sessionId,
  60. sessionSubtitleText: `${result.session.status || result.session.sessionStatus} / ${result.result.status}`,
  61. rows: [
  62. { label: '最终得分', value: formatValue(result.result.finalScore) },
  63. { label: '最终用时(秒)', value: formatValue(result.result.finalDurationSec) },
  64. { label: '完成点数', value: formatValue(result.result.completedControls) },
  65. { label: '总点数', value: formatValue(result.result.totalControls) },
  66. { label: '累计里程(m)', value: formatValue(result.result.distanceMeters) },
  67. { label: '平均速度(km/h)', value: formatValue(result.result.averageSpeedKmh) },
  68. { label: '最大心率', value: formatValue(result.result.maxHeartRateBpm) },
  69. ],
  70. })
  71. } catch (error) {
  72. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  73. this.setData({
  74. statusText: `结果加载失败:${message}`,
  75. })
  76. }
  77. },
  78. async loadRecentResults() {
  79. const accessToken = getAccessToken()
  80. if (!accessToken) {
  81. wx.redirectTo({ url: '/pages/login/login' })
  82. return
  83. }
  84. this.setData({
  85. statusText: '正在加载最近结果',
  86. })
  87. try {
  88. const results = await getMyResults({
  89. baseUrl: loadBackendBaseUrl(),
  90. accessToken,
  91. limit: 20,
  92. })
  93. this.setData({
  94. statusText: '最近结果加载完成',
  95. sessionSubtitleText: '最近结果列表',
  96. recentResults: results,
  97. })
  98. } catch (error) {
  99. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  100. this.setData({
  101. statusText: `结果加载失败:${message}`,
  102. })
  103. }
  104. },
  105. handleOpenResult(event: WechatMiniprogram.TouchEvent) {
  106. const sessionId = event.currentTarget.dataset.sessionId as string | undefined
  107. if (!sessionId) {
  108. return
  109. }
  110. wx.redirectTo({
  111. url: `/pages/result/result?sessionId=${encodeURIComponent(sessionId)}`,
  112. })
  113. },
  114. handleBackToList() {
  115. this.setData({
  116. sessionId: '',
  117. rows: [],
  118. })
  119. this.loadRecentResults()
  120. },
  121. })