From 24d80b8152d2f4f468f41c8eeaf805bb62245e7f Mon Sep 17 00:00:00 2001 From: Haylie Tan Date: Thu, 26 Feb 2026 16:35:28 -0800 Subject: [PATCH 01/20] Init judging finals from 2025 --- app/(pages)/(hackers)/(hub)/page.tsx | 3 +- .../_components/HomeJudging/HeroJudging.tsx | 34 +++++- .../_components/AssigningJudges.tsx | 26 +++++ .../HomeJudging/_components/DoneJudging.tsx | 47 ++++++++ .../_components/JudgeBannerIndividual.tsx | 40 +++++++ .../HomeJudging/_components/JudgeBanners.tsx | 105 ++++++++++++++++++ 6 files changed, 253 insertions(+), 2 deletions(-) create mode 100644 app/(pages)/(hackers)/_components/HomeJudging/_components/AssigningJudges.tsx create mode 100644 app/(pages)/(hackers)/_components/HomeJudging/_components/DoneJudging.tsx create mode 100644 app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBannerIndividual.tsx create mode 100644 app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBanners.tsx diff --git a/app/(pages)/(hackers)/(hub)/page.tsx b/app/(pages)/(hackers)/(hub)/page.tsx index d56d5755..7c0b804c 100644 --- a/app/(pages)/(hackers)/(hub)/page.tsx +++ b/app/(pages)/(hackers)/(hub)/page.tsx @@ -17,7 +17,8 @@ export default function Page() {
- + {/* */} + diff --git a/app/(pages)/(hackers)/_components/HomeJudging/HeroJudging.tsx b/app/(pages)/(hackers)/_components/HomeJudging/HeroJudging.tsx index 14e01fd0..9952d96f 100644 --- a/app/(pages)/(hackers)/_components/HomeJudging/HeroJudging.tsx +++ b/app/(pages)/(hackers)/_components/HomeJudging/HeroJudging.tsx @@ -1,3 +1,35 @@ +'use client'; + +import Image from 'next/image'; +import JudgeBanners from '../2025IndexHero/JudgeBanners'; + export default function HeroJudging() { - return
Hero Judging
; + return ( +
+
+ {/* background */} + Background + + {/* scene wrapper */} +
+ {/* stars */} + +
+
+
+ ); } + diff --git a/app/(pages)/(hackers)/_components/HomeJudging/_components/AssigningJudges.tsx b/app/(pages)/(hackers)/_components/HomeJudging/_components/AssigningJudges.tsx new file mode 100644 index 00000000..ca1f999c --- /dev/null +++ b/app/(pages)/(hackers)/_components/HomeJudging/_components/AssigningJudges.tsx @@ -0,0 +1,26 @@ +import styles from './AssigningJudges.module.scss'; +import sleeping_cow from 'public/hackers/hero/sleeping_cow.svg'; +import radio from 'public/hackers/hero/radio.svg'; +import Image from 'next/image'; + +export default function AssigningJudges() { + return ( +
+
+

PLEASE SIT TIGHT FOR JUDGING INFORMATION...

+
+

+ Hi hacker, we're assigning you your judges. Sit tight, practice + pitching your project, and submit your vote for{' '} + Hackers Choice Award! +

+
+ radio + sleeping cow +
+ ); +} diff --git a/app/(pages)/(hackers)/_components/HomeJudging/_components/DoneJudging.tsx b/app/(pages)/(hackers)/_components/HomeJudging/_components/DoneJudging.tsx new file mode 100644 index 00000000..aea60aaf --- /dev/null +++ b/app/(pages)/(hackers)/_components/HomeJudging/_components/DoneJudging.tsx @@ -0,0 +1,47 @@ +import styles from './DoneJudging.module.scss'; +import bunny_phone from 'public/hackers/hero/bunny_phone.svg'; +import stars from 'public/hackers/hero/stars.svg'; +import ducky from 'public/hackers/hero/ducky.svg'; +import Image from 'next/image'; + +export default function DoneJudging() { + return ( +
+
+
+

CONGRATS!

+
+

+ You're all done, thank you so much for your participation at + HackDavis 2025. Please wait until Closing Ceremony for + judging results! In the meantime, put in your vote for{' '} + + Hacker's Choice Award + {' '} + and check out our insta @hackdavis! +

+
+ stars + bunny phone +
+
+
+ bunny phone +

@hackdavis

+

Check out our instagram

+
+
+ ducky +
+
+
+ ); +} diff --git a/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBannerIndividual.tsx b/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBannerIndividual.tsx new file mode 100644 index 00000000..c3e05771 --- /dev/null +++ b/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBannerIndividual.tsx @@ -0,0 +1,40 @@ +import styles from './JudgeBannerIndividual.module.scss'; +import Image from 'next/image'; + +type JudgeBannerIndividualProps = { + icon: string; + name: string; + teamsAhead?: number; + description?: string; + completed: boolean; +}; + +export default function JudgeBannerIndividual({ + icon, + name, + teamsAhead, + description, + completed, +}: JudgeBannerIndividualProps) { + return ( +
+ {`${name} +
+

{name}

+ {teamsAhead && ( +

There are {teamsAhead} teams ahead of you for this judge.

+ )} + {description &&

{description}

} +
+

{teamsAhead}

+
+ ); +} diff --git a/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBanners.tsx b/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBanners.tsx new file mode 100644 index 00000000..4a3c9bee --- /dev/null +++ b/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBanners.tsx @@ -0,0 +1,105 @@ +'use client'; + +import { useEffect } from 'react'; +import JudgeBannerIndividual from './JudgeBannerIndividual'; +import User from '@typeDefs/user'; +import styles from './JudgeBannerIndividual.module.scss'; +import DoneJudging from './DoneJudging'; +import useTableNumberContext from '@pages/_hooks/useTableNumberContext'; +import { useTeamJudgesFromTableNumber } from '@pages/_hooks/useTeamJudgesFromTableNumber'; +import { nonHDTracks } from '@data/tracks'; +import AssigningJudges from './AssigningJudges'; + +const icons = [ + '/hackers/hero/PeekingCow.svg', + '/hackers/hero/PeekingBunny.svg', + '/hackers/hero/PeekingDuck.svg', + '/hackers/hero/PeekingCow.svg', + '/hackers/hero/PeekingBunny.svg', + '/hackers/hero/PeekingDuck.svg', +]; + +interface HydratedJudge extends User { + queuePosition: number; + isScored: boolean; +} + +export default function JudgeBanners() { + const { storedValue: tableNumber } = useTableNumberContext(); + const { team, judges, loading, error, fetchTeamJudges } = + useTeamJudgesFromTableNumber(tableNumber ?? -1); + + useEffect(() => { + if (tableNumber) { + fetchTeamJudges(); + } + + const pollingInterval = setInterval(() => { + if (tableNumber) { + fetchTeamJudges(); + } + }, 60 * 1000); + + return () => clearInterval(pollingInterval); + }, [fetchTeamJudges, tableNumber]); + + if (!tableNumber) { + return ; + } + + if (loading || error !== null) return error; + + if (judges.length === 0) { + return ; + } + + const allScored = judges.every((judge: HydratedJudge) => judge.isScored); + if (allScored) { + return ; + } + + const teamNonHDCategories: string[] = team.tracks + .filter((track: string) => track in nonHDTracks) + .map((track: string) => nonHDTracks[track].filter); + const hasNonprofitTrack = teamNonHDCategories.includes('Non-Profit'); + const hasSponsorTrack = teamNonHDCategories.includes('Sponsor'); + const hasMLHTrack = teamNonHDCategories.includes('MLH'); + + return ( +
+ {hasNonprofitTrack && ( + + )} + {hasSponsorTrack && ( + + )} + {hasMLHTrack && ( + + )} + {judges.map((judge: HydratedJudge, index: number) => ( + + ))} +
+ ); +} From c89e7397191ef5ba57001ecb9c6cfeb0b4a0a7db Mon Sep 17 00:00:00 2001 From: Haylie Tan Date: Thu, 5 Mar 2026 10:08:19 -0800 Subject: [PATCH 02/20] Added mock data for dev --- .../_components/HomeJudging/HeroJudging.tsx | 13 +--- .../_components/AssigningJudges.tsx | 2 +- .../HomeJudging/_components/DoneJudging.tsx | 2 +- .../_components/JudgeBannerIndividual.tsx | 2 +- .../HomeJudging/_components/JudgeBanners.tsx | 60 +++++++++++++++---- 5 files changed, 56 insertions(+), 23 deletions(-) diff --git a/app/(pages)/(hackers)/_components/HomeJudging/HeroJudging.tsx b/app/(pages)/(hackers)/_components/HomeJudging/HeroJudging.tsx index 9952d96f..405e0d8a 100644 --- a/app/(pages)/(hackers)/_components/HomeJudging/HeroJudging.tsx +++ b/app/(pages)/(hackers)/_components/HomeJudging/HeroJudging.tsx @@ -1,7 +1,5 @@ -'use client'; - import Image from 'next/image'; -import JudgeBanners from '../2025IndexHero/JudgeBanners'; +import JudgeBanners from './_components/JudgeBanners'; export default function HeroJudging() { return ( @@ -14,7 +12,6 @@ export default function HeroJudging() { 'linear-gradient(172deg, #46D8E9 43.03%, #76DEEB 63.28%, #FCFCD1 112.36%)', }} > - {/* background */} Background - - {/* scene wrapper */} -
- {/* stars */} +
); -} - +} \ No newline at end of file diff --git a/app/(pages)/(hackers)/_components/HomeJudging/_components/AssigningJudges.tsx b/app/(pages)/(hackers)/_components/HomeJudging/_components/AssigningJudges.tsx index ca1f999c..6f8f6801 100644 --- a/app/(pages)/(hackers)/_components/HomeJudging/_components/AssigningJudges.tsx +++ b/app/(pages)/(hackers)/_components/HomeJudging/_components/AssigningJudges.tsx @@ -1,4 +1,4 @@ -import styles from './AssigningJudges.module.scss'; +import styles from '../../2025IndexHero/AssigningJudges.module.scss'; import sleeping_cow from 'public/hackers/hero/sleeping_cow.svg'; import radio from 'public/hackers/hero/radio.svg'; import Image from 'next/image'; diff --git a/app/(pages)/(hackers)/_components/HomeJudging/_components/DoneJudging.tsx b/app/(pages)/(hackers)/_components/HomeJudging/_components/DoneJudging.tsx index aea60aaf..69b0032d 100644 --- a/app/(pages)/(hackers)/_components/HomeJudging/_components/DoneJudging.tsx +++ b/app/(pages)/(hackers)/_components/HomeJudging/_components/DoneJudging.tsx @@ -1,4 +1,4 @@ -import styles from './DoneJudging.module.scss'; +import styles from '../../2025IndexHero/DoneJudging.module.scss'; import bunny_phone from 'public/hackers/hero/bunny_phone.svg'; import stars from 'public/hackers/hero/stars.svg'; import ducky from 'public/hackers/hero/ducky.svg'; diff --git a/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBannerIndividual.tsx b/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBannerIndividual.tsx index c3e05771..446a453e 100644 --- a/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBannerIndividual.tsx +++ b/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBannerIndividual.tsx @@ -1,4 +1,4 @@ -import styles from './JudgeBannerIndividual.module.scss'; +import styles from '../../2025IndexHero/JudgeBannerIndividual.module.scss'; import Image from 'next/image'; type JudgeBannerIndividualProps = { diff --git a/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBanners.tsx b/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBanners.tsx index 4a3c9bee..82648d7f 100644 --- a/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBanners.tsx +++ b/app/(pages)/(hackers)/_components/HomeJudging/_components/JudgeBanners.tsx @@ -3,7 +3,7 @@ import { useEffect } from 'react'; import JudgeBannerIndividual from './JudgeBannerIndividual'; import User from '@typeDefs/user'; -import styles from './JudgeBannerIndividual.module.scss'; +import styles from '../../2025IndexHero/JudgeBannerIndividual.module.scss'; import DoneJudging from './DoneJudging'; import useTableNumberContext from '@pages/_hooks/useTableNumberContext'; import { useTeamJudgesFromTableNumber } from '@pages/_hooks/useTeamJudgesFromTableNumber'; @@ -24,6 +24,39 @@ interface HydratedJudge extends User { isScored: boolean; } +// Temporary mock data so JudgeBanners shows something +// even before the real judging backend / table number is wired up. +const mockTeam: any = { + tracks: ['Non-Profit', 'Sponsor'], +}; + +const mockJudges = [ + { + _id: 'mock-1', + name: 'Judge Alice', + queuePosition: 2, + isScored: false, + }, + { + _id: 'mock-2', + name: 'Judge Bob', + queuePosition: 9, + isScored: false, + }, + { + _id: 'mock-3', + name: 'Judge Alice', + queuePosition: 3, + isScored: false, + }, + { + _id: 'mock-4', + name: 'Judge David', + queuePosition: 4, + isScored: true, + }, +] as HydratedJudge[]; + export default function JudgeBanners() { const { storedValue: tableNumber } = useTableNumberContext(); const { team, judges, loading, error, fetchTeamJudges } = @@ -43,22 +76,29 @@ export default function JudgeBanners() { return () => clearInterval(pollingInterval); }, [fetchTeamJudges, tableNumber]); - if (!tableNumber) { - return ; - } + const usingMockData = !tableNumber; - if (loading || error !== null) return error; + if (!usingMockData) { + if (loading || error !== null) return error; - if (judges.length === 0) { - return ; + if (judges.length === 0) { + return ; + } } - const allScored = judges.every((judge: HydratedJudge) => judge.isScored); + const effectiveJudges: HydratedJudge[] = + usingMockData || judges.length === 0 ? mockJudges : (judges as HydratedJudge[]); + + const allScored = effectiveJudges.every( + (judge: HydratedJudge) => judge.isScored, + ); if (allScored) { return ; } - const teamNonHDCategories: string[] = team.tracks + const sourceTeam: any = usingMockData ? mockTeam : team; + + const teamNonHDCategories: string[] = (sourceTeam?.tracks ?? []) .filter((track: string) => track in nonHDTracks) .map((track: string) => nonHDTracks[track].filter); const hasNonprofitTrack = teamNonHDCategories.includes('Non-Profit'); @@ -91,7 +131,7 @@ export default function JudgeBanners() { completed={false} /> )} - {judges.map((judge: HydratedJudge, index: number) => ( + {effectiveJudges.map((judge: HydratedJudge, index: number) => ( Date: Thu, 5 Mar 2026 10:20:22 -0800 Subject: [PATCH 03/20] Added white text --- app/(pages)/(hackers)/(hub)/page.tsx | 27 +++++++++---------- .../_components/HomeJudging/HeroJudging.tsx | 16 ++++++++++- .../HomeJudging/_components/JudgeBanners.tsx | 3 +-- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/app/(pages)/(hackers)/(hub)/page.tsx b/app/(pages)/(hackers)/(hub)/page.tsx index 7c0b804c..5e7494f9 100644 --- a/app/(pages)/(hackers)/(hub)/page.tsx +++ b/app/(pages)/(hackers)/(hub)/page.tsx @@ -15,24 +15,21 @@ import HeroWaiting from '../_components/HomeJudging/HeroWaiting'; export default function Page() { return (
- - - {/* */} - + {/* */} + {/* */} + - - {/* temporarilty set featureId below to "hero-hacking" to test */} - - - - - - - - - + {/* */} + {/* Always show judging hero while developing */} + + + + {/* */} + {/* */} + {/* */} + {/* */}