diff --git a/components/WinnersSection.tsx b/components/WinnersSection.tsx new file mode 100644 index 0000000..3c86aed --- /dev/null +++ b/components/WinnersSection.tsx @@ -0,0 +1,107 @@ +'use client' + +import { useMemo } from "react"; + +export interface Winner { + name: string; + challengeTitle: string; + projectTitle: string; + deadline: Date; + placement: number; +} + +const monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + +export default function WinnersSection({winners} : {winners: Array}) { + const mostRecentDate = useMemo(() => { + let mostRecentDateNow = new Date(0); + + for(const winner of winners) + if(winner.deadline > mostRecentDateNow) + mostRecentDateNow = winner.deadline; + return mostRecentDateNow; + + }, [winners]); + + const recentWinners = useMemo(() => { + const recentFilter = (winner: Winner) => { + if(winner.deadline >= mostRecentDate) + return winner; + } + return winners.filter(recentFilter); + + }, [winners, mostRecentDate]); + + const prevWinners = useMemo(() => { + const prevFilter = (winner: Winner) => { + if(winner.deadline < mostRecentDate) + return winner; + } + return winners.filter(prevFilter); + + }, [winners, mostRecentDate]); + + return
+

+ {monthNames[mostRecentDate.getMonth()]}'s Winners +

+ +
+ {recentWinners.map((winner) => + + )} +
+ +
+

+ 🕒 Previous Winners: +

+
+ {prevWinners.map((winner) => + + )} +
+
+ +
+} + +function WinnerCard({placement, name, projectTitle}: Winner){ + const placementColors = ["text-gold", "text-slate-400", "text-orange-800"]; + const placementColor = placement > 3 ? "" : placementColors[placement - 1]; + + // regex setup for initials + const clean = name.replace(/( |_|-|\/|\\|#|\.)/, " "); // remove common name seperators + const match = clean.match(/([a-z A-Z])\w+\s([a-z A-Z])\w*\s*([a-z A-Z])*(?=,*)/); // find and place initials in array + + // if match exists, it MUST have at least 3 elements in array + // 0 index of match is original string + const initials = ((match) ? match[1] + match[2] : name.charAt(0)).toUpperCase(); + + return
+
+
+ {initials} +
+
+ {name} +
+
+ {projectTitle} +
+
+ +
+ 🏆#{placement} +
+
; +} + +function PrevWinnerEntry({name, challengeTitle, deadline}: Winner){ + return
+

{monthNames[deadline.getMonth()]} {deadline.getFullYear()}

+

{name}

+

{challengeTitle}

+
; +} \ No newline at end of file