Skip to content

Commit c257640

Browse files
committed
Add pick the winner to daily prizes
1 parent ff6ff62 commit c257640

File tree

3 files changed

+55
-7
lines changed

3 files changed

+55
-7
lines changed

src/app/(authenticated)/prizes/DailyPrizesTable.tsx

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,25 @@
33
import EventDayButton from "@/components/EventDayButton";
44
import GridList from "@/components/GridList";
55
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";
910

1011
interface 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
))}

src/app/(authenticated)/prizes/page.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ export default async function Prizes() {
7272
Visit SINFO and get the chance to win
7373
</span>
7474
</div>
75-
<DailyPrizesTable prizes={dailyPrizes} />
75+
<DailyPrizesTable
76+
prizes={dailyPrizes}
77+
cannonToken={session!.cannonToken}
78+
user={user || undefined}
79+
/>
7680
</div>
7781

7882
{/* Sessions Prizes */}

src/components/GridCard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export default function GridCard({
4646
/>
4747
)}
4848
{label && (
49-
<span className="m-auto bg-sinfo-primary text-white rounded-md px-2 py-1 uppercase">
49+
<span className="m-auto bg-sinfo-secondary font-bold text-white rounded-md px-2 py-1 uppercase">
5050
{label}
5151
</span>
5252
)}

0 commit comments

Comments
 (0)