results.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth'
  2. import { getMyResults, type BackendSessionResultView } from '../../utils/backendApi'
  3. type ResultsPageData = {
  4. loading: boolean
  5. statusText: string
  6. results: Array<{
  7. sessionId: string
  8. titleText: string
  9. statusText: string
  10. scoreText: string
  11. routeText: string
  12. }>
  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. function formatRouteSummary(result: BackendSessionResultView): string {
  22. const session = result.session
  23. if (session.variantName && session.routeCode) {
  24. return `${session.variantName} / ${session.routeCode}`
  25. }
  26. if (session.variantName) {
  27. return session.variantName
  28. }
  29. if (session.routeCode) {
  30. return session.routeCode
  31. }
  32. return '默认赛道'
  33. }
  34. function buildResultCardView(result: BackendSessionResultView) {
  35. return {
  36. sessionId: result.session.id,
  37. titleText: result.session.eventName || result.session.id,
  38. statusText: `${result.result.status} / ${result.session.status}`,
  39. scoreText: `得分 ${result.result.finalScore || '--'} / 用时 ${result.result.finalDurationSec || '--'}s`,
  40. routeText: `赛道 ${formatRouteSummary(result)}`,
  41. }
  42. }
  43. Page({
  44. data: {
  45. loading: false,
  46. statusText: '准备加载历史结果',
  47. results: [],
  48. } as ResultsPageData,
  49. onLoad() {
  50. this.loadResults()
  51. },
  52. onShow() {
  53. this.loadResults()
  54. },
  55. async loadResults() {
  56. const accessToken = getAccessToken()
  57. if (!accessToken) {
  58. wx.redirectTo({ url: '/pages/login/login' })
  59. return
  60. }
  61. this.setData({
  62. loading: true,
  63. statusText: '正在加载历史结果',
  64. })
  65. try {
  66. const results = await getMyResults({
  67. baseUrl: loadBackendBaseUrl(),
  68. accessToken,
  69. limit: 20,
  70. })
  71. this.setData({
  72. loading: false,
  73. statusText: `历史结果加载完成,共 ${results.length} 条`,
  74. results: results.map(buildResultCardView),
  75. })
  76. } catch (error) {
  77. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  78. this.setData({
  79. loading: false,
  80. statusText: `历史结果加载失败:${message}`,
  81. })
  82. }
  83. },
  84. handleOpenResult(event: WechatMiniprogram.TouchEvent) {
  85. const sessionId = event.currentTarget.dataset.sessionId as string | undefined
  86. if (!sessionId) {
  87. return
  88. }
  89. wx.navigateTo({
  90. url: `/pages/result/result?sessionId=${encodeURIComponent(sessionId)}`,
  91. })
  92. },
  93. })