3
3
import EventDayButton from "@/components/EventDayButton" ;
4
4
import GridList from "@/components/GridList" ;
5
5
import List from "@/components/List" ;
6
- import { PrizeTile } from "@/components/prize" ;
7
- import { getEventFullDate } from "@/utils/utils" ;
8
- import { useEffect , useMemo , useState } from "react" ;
6
+ import { PrizeParticipant , PrizeTile } from "@/components/prize" ;
7
+ import { AchievementService } from "@/services/AchievementService" ;
8
+ import { getEventFullDate , isMember } from "@/utils/utils" ;
9
+ import { useEffect , useMemo , useRef , useState } from "react" ;
9
10
10
11
interface DailyPrizesTable {
12
+ user ?: User ;
13
+ cannonToken : string ;
11
14
prizes : Prize [ ] ;
12
15
}
13
16
14
- export default function DailyPrizesTable ( { prizes } : DailyPrizesTable ) {
17
+ export default function DailyPrizesTable ( {
18
+ user,
19
+ cannonToken,
20
+ prizes,
21
+ } : DailyPrizesTable ) {
15
22
const [ showingDay , setShowingDay ] = useState < string | null > ( null ) ;
23
+ const [ dailyParticipants , setDailyParticipants ] =
24
+ useState < PrizeParticipant [ ] > ( ) ;
16
25
17
26
const prizesByDay = useMemo ( ( ) => {
18
27
const sortedPrizes = prizes . sort ( ( a , b ) => a . name . localeCompare ( b . name ) ) ;
@@ -38,6 +47,35 @@ export default function DailyPrizesTable({ prizes }: DailyPrizesTable) {
38
47
setShowingDay ( sortedDays . find ( ( d ) => d === today ) || sortedDays [ 0 ] ) ;
39
48
} , [ sortedDays ] ) ;
40
49
50
+ useEffect ( ( ) => {
51
+ if ( showingDay ) getDailyPrizeParticipants ( showingDay ) ;
52
+ } , [ showingDay ] ) ;
53
+
54
+ async function getDailyPrizeParticipants ( day : string ) {
55
+ const achievements = await AchievementService . getAchievements ( ) ;
56
+ const startDate = new Date ( day ) ;
57
+ const endDate = new Date ( `${ day } T23:59:59Z` ) ;
58
+ const entries = achievements
59
+ ?. filter (
60
+ ( a ) =>
61
+ startDate <= new Date ( a . validity ?. from ?? "" ) &&
62
+ endDate >= new Date ( a . validity ?. to ?? "" ) ,
63
+ )
64
+ . reduce (
65
+ ( acc , a ) => {
66
+ a . users ?. forEach ( ( u ) => {
67
+ acc [ u ] = ( acc [ u ] ?? 0 ) + a . value ;
68
+ } ) ;
69
+ return acc ;
70
+ } ,
71
+ { } as Record < string , number > ,
72
+ ) ;
73
+ setDailyParticipants (
74
+ entries &&
75
+ Object . keys ( entries ) . map ( ( u ) => ( { userId : u , entries : entries [ u ] } ) ) ,
76
+ ) ;
77
+ }
78
+
41
79
return (
42
80
< >
43
81
< GridList >
@@ -55,7 +93,13 @@ export default function DailyPrizesTable({ prizes }: DailyPrizesTable) {
55
93
. map ( ( d ) => (
56
94
< List key = { d } description = { getEventFullDate ( d ) } >
57
95
{ prizesByDay [ d ] . map ( ( p ) => (
58
- < PrizeTile key = { p . id } prize = { p } />
96
+ < PrizeTile
97
+ key = { p . id }
98
+ participants = { dailyParticipants }
99
+ prize = { p }
100
+ cannonToken = { cannonToken }
101
+ pickWinner = { ! ! user && isMember ( user . role ) }
102
+ />
59
103
) ) }
60
104
</ List >
61
105
) ) }
0 commit comments