@@ -20,7 +20,11 @@ import {
20
20
NavItem ,
21
21
NavLink ,
22
22
} from "reactstrap" ;
23
- import { useMergedProblemMap } from "../../../../api/APIClient" ;
23
+ import { FcCancel , FcCheckmark } from "react-icons/all" ;
24
+ import {
25
+ useMergedProblemMap ,
26
+ useVirtualContestSubmissions ,
27
+ } from "../../../../api/APIClient" ;
24
28
import {
25
29
useLoginState ,
26
30
useVirtualContest ,
@@ -45,19 +49,57 @@ import { generatePathWithParams } from "../../../../utils/QueryString";
45
49
import { ProblemLink } from "../../../../components/ProblemLink" ;
46
50
import { joinContest , leaveContest } from "../ApiClient" ;
47
51
import { GoogleCalendarButton } from "../../../../components/GoogleCalendarButton" ;
48
- import { ContestTable } from "./ContestTable" ;
52
+ import { ProblemId , UserId } from "../../../../interfaces/Status" ;
53
+ import { constructPointOverrideMap , ContestTable } from "./ContestTable" ;
49
54
import { LockoutContestTable } from "./LockoutContestTable" ;
50
55
import { TrainingContestTable } from "./TrainingContestTable" ;
51
56
import { compareProblem } from "./util" ;
57
+ import {
58
+ ReducedProblemResult ,
59
+ reduceUserContestResult ,
60
+ } from "./ResultCalcUtil" ;
61
+
62
+ const Problems = ( props : {
63
+ readonly problems : VirtualContestProblem [ ] ;
64
+ readonly atCoderUserId : UserId ;
65
+ readonly start : number ;
66
+ readonly end : number ;
67
+ } ) => {
68
+ const submissions = useVirtualContestSubmissions (
69
+ [ props . atCoderUserId ] ,
70
+ props . problems . map ( ( p ) => p . item . id ) ,
71
+ props . start ,
72
+ props . end ,
73
+ false
74
+ ) ;
75
+ const pointOverrideMap = constructPointOverrideMap ( props . problems ) ;
76
+ const showUserResults =
77
+ props . atCoderUserId !== "" &&
78
+ submissions . data !== null &&
79
+ submissions . data !== undefined ;
80
+ const results = submissions . data
81
+ ? reduceUserContestResult ( submissions . data , ( id ) =>
82
+ pointOverrideMap . get ( id )
83
+ )
84
+ : new Map < UserId , ReducedProblemResult > ( ) ;
85
+ const ResultIcon = ( props : { id : ProblemId } ) => {
86
+ const result = results . get ( props . id ) ;
87
+ if ( ! result ) return null ;
88
+ if ( result . accepted ) {
89
+ return < FcCheckmark /> ;
90
+ } else {
91
+ return < FcCancel /> ;
92
+ }
93
+ } ;
52
94
53
- const Problems = ( props : { problems : VirtualContestProblem [ ] } ) => {
54
95
const sortedItems = props . problems
55
96
. map ( ( p ) => ( {
56
97
contestId : p . contestId ,
57
98
title : p . title ,
58
99
...p . item ,
59
100
} ) )
60
101
. sort ( compareProblem ) ;
102
+
61
103
return (
62
104
< div className = "my-2" >
63
105
< Row >
@@ -75,12 +117,13 @@ const Problems = (props: { problems: VirtualContestProblem[] }) => {
75
117
</ Row >
76
118
< Row >
77
119
< Col >
78
- < Table striped size = "sm" >
120
+ < Table striped bordered size = "sm" >
79
121
< thead >
80
122
< tr >
81
123
< th > </ th >
82
124
< th > Problem Name</ th >
83
125
< th className = "text-center" > Score</ th >
126
+ { showUserResults && < th > </ th > }
84
127
</ tr >
85
128
</ thead >
86
129
< tbody >
@@ -109,6 +152,11 @@ const Problems = (props: { problems: VirtualContestProblem[] }) => {
109
152
) }
110
153
</ td >
111
154
< td className = "text-center" > { p . point !== null && p . point } </ td >
155
+ { showUserResults && (
156
+ < td className = "text-center" >
157
+ < ResultIcon id = { p . id } />
158
+ </ td >
159
+ ) }
112
160
</ tr >
113
161
) ) }
114
162
</ tbody >
@@ -218,7 +266,7 @@ const TAB_PARAM = "activeTab";
218
266
219
267
const NormalContestPage = ( props : StandingsProps ) => {
220
268
const location = useLocation ( ) ;
221
- const { showProblems, problems } = props ;
269
+ const { showProblems } = props ;
222
270
const tabs : NormalContestTabType [ ] = showProblems
223
271
? [ "Problems" , "Standings" ]
224
272
: [ "Standings" ] ;
@@ -253,7 +301,7 @@ const NormalContestPage = (props: StandingsProps) => {
253
301
</ Col >
254
302
</ Row >
255
303
256
- { activeTab === "Problems" && < Problems problems = { problems } /> }
304
+ { activeTab === "Problems" && < Problems { ... props } /> }
257
305
{ activeTab === "Standings" && < Standings { ...props } /> }
258
306
</ >
259
307
) ;
0 commit comments