index.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import React, { useState, useEffect } from "react";
  2. import styles from "./index.module.scss";
  3. import { useNavigate } from "react-router-dom";
  4. import { getRankList, RankItem, RankDescItem, saveScore } from "../../../utils/API";
  5. interface ResultProps {
  6. timeLeft: number;
  7. rightCount: number;
  8. }
  9. // 对数据进行排序
  10. const getRankDesc = (rankList: RankItem[], rightCount: number, exhauseTime: number) => {
  11. const rankArr: RankDescItem[] = rankList.map(item => {
  12. return { score: item.score, time: item.time, rank: -1, isCurrentUser: false }
  13. })
  14. rankArr.push({ score: rightCount, time: exhauseTime, rank: -1, isCurrentUser: true })
  15. rankArr.sort((a, b) => {
  16. if (a.score !== b.score) {
  17. // 得分不同时,得分高的排在前面
  18. return b.score - a.score;
  19. } else {
  20. // 得分相同时,花费时间少的排在前面
  21. return a.time - b.time;
  22. }
  23. });
  24. // 为排序后的数据添加排名信息
  25. rankArr.forEach((item, index) => {
  26. item.rank = index + 1;
  27. });
  28. return rankArr
  29. }
  30. const Result = ({ timeLeft, rightCount }: ResultProps) => {
  31. const navigate = useNavigate()
  32. const [nickname, setNickname] = useState("")
  33. const [phone, setPhone] = useState("")
  34. const [isShowTips, setIsShowTips] = useState(true)
  35. const exhausetime = 180 - timeLeft
  36. const [rankDesc, setRankDesc] = useState<RankDescItem[]>([])
  37. const handleInputChange = () => {
  38. if ((nickname.length > 5 || nickname.length === 0) || (phone.length > 20 || phone.length === 0)) {
  39. setIsShowTips(true)
  40. } else {
  41. setIsShowTips(false)
  42. }
  43. }
  44. const handleRank = () => {
  45. if (!isShowTips) {
  46. saveScore({
  47. name: nickname,
  48. phone: phone,
  49. score: rightCount * 10,
  50. time: exhausetime
  51. }).then(() => {
  52. navigate("/rank", { state: { noRank: false } })
  53. })
  54. return
  55. }
  56. if (isShowRank) {
  57. navigate("/rank", { state: { noRank: true } })
  58. return
  59. }
  60. }
  61. const [isShowRank, setIsShowRank] = useState(true)
  62. useEffect(() => {
  63. getRankList().then(res => {
  64. setRankDesc(res.data.data)
  65. let rankData = res.data.data
  66. setIsShowRank((rankData[rankData.length - 1].score > rightCount * 10) || (rankData[rankData.length - 1].score === rightCount * 10 && rankData[rankData.length - 1].time < exhausetime) ? true
  67. : false)
  68. })
  69. }, [exhausetime, rightCount])
  70. console.log(rankDesc)
  71. return (
  72. <div className={styles.infomation}>
  73. <div className="title">恭喜您!
  74. </div>
  75. <div className="content">
  76. 共答对 <span>{rightCount}</span> 道题,耗时 <span>{exhausetime}</span> 秒。{isShowRank ? "未进入排行榜" : "恭喜您进入当前答题排行榜前十名!"}
  77. </div>
  78. <div className="from" style={{ display: isShowRank ? "none" : "flex" }}>
  79. <input value={nickname} onChange={(e) => setNickname(e.target.value)} onBlur={handleInputChange} type="text" placeholder="请输入昵称,不超过5个字" />
  80. <input value={phone} onChange={(e) => setPhone(e.target.value)} onBlur={handleInputChange} type="text" placeholder="请输入联系方式,不超过20个字" />
  81. </div>
  82. <div className="content2">
  83. 游戏规则:答对更多题目耗时更少的前五名 将在展览结束后赠送文创书签纪念品。
  84. </div>
  85. <div className="tips" style={{ display: isShowTips && !isShowRank ? "block" : "none" }}>您未填写昵称和联系方式,无法参与此次活动</div>
  86. <div className="tips" style={{ display: !isShowTips && !isShowRank ? "block" : "none" }}>点击查看排行榜参与排名</div>
  87. <div className="btn-group">
  88. <div className={isShowRank ? "item" : "backHome"} onClick={() => navigate("/")}>返回首页</div>
  89. <div className="item" onClick={handleRank}>查看排行榜</div>
  90. </div>
  91. <div className="back" onClick={() => navigate("/")}><img src={require("../../../assets/img/back.png")} alt="" /></div>
  92. </div >
  93. );
  94. };
  95. export default Result;