33import EventDayButton from "@/components/EventDayButton" ;
44import GridList from "@/components/GridList" ;
55import 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" ;
910
1011interface DailyPrizesTable {
12+ user ?: User ;
13+ cannonToken : string ;
1114 prizes : Prize [ ] ;
1215}
1316
14- export default function DailyPrizesTable ( { prizes } : DailyPrizesTable ) {
17+ export default function DailyPrizesTable ( {
18+ user,
19+ cannonToken,
20+ prizes,
21+ } : DailyPrizesTable ) {
1522 const [ showingDay , setShowingDay ] = useState < string | null > ( null ) ;
23+ const [ dailyParticipants , setDailyParticipants ] =
24+ useState < PrizeParticipant [ ] > ( ) ;
1625
1726 const prizesByDay = useMemo ( ( ) => {
1827 const sortedPrizes = prizes . sort ( ( a , b ) => a . name . localeCompare ( b . name ) ) ;
@@ -38,6 +47,35 @@ export default function DailyPrizesTable({ prizes }: DailyPrizesTable) {
3847 setShowingDay ( sortedDays . find ( ( d ) => d === today ) || sortedDays [ 0 ] ) ;
3948 } , [ sortedDays ] ) ;
4049
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+
4179 return (
4280 < >
4381 < GridList >
@@ -55,7 +93,13 @@ export default function DailyPrizesTable({ prizes }: DailyPrizesTable) {
5593 . map ( ( d ) => (
5694 < List key = { d } description = { getEventFullDate ( d ) } >
5795 { 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+ />
59103 ) ) }
60104 </ List >
61105 ) ) }
0 commit comments