@@ -47,6 +47,10 @@ interface LeaderboardSummaries {
4747 now : string ;
4848}
4949
50+ function isBeginnerProblem ( name : string ) : boolean {
51+ return / p m p p / i. test ( name ) ;
52+ }
53+
5054export default function Home ( ) {
5155 const [ searchParams ] = useSearchParams ( ) ;
5256 const navigate = useNavigate ( ) ;
@@ -73,6 +77,16 @@ export default function Home() {
7377 ( lb ) => ! isExpired ( lb . deadline )
7478 ) ;
7579
80+ const activeCompetitions = leaderboards . filter (
81+ ( lb ) => ! isExpired ( lb . deadline ) && ! isBeginnerProblem ( lb . name )
82+ ) ;
83+ const beginnerProblems = leaderboards . filter (
84+ ( lb ) => ! isExpired ( lb . deadline ) && isBeginnerProblem ( lb . name )
85+ ) ;
86+ const closedCompetitions = leaderboards . filter ( ( lb ) =>
87+ isExpired ( lb . deadline )
88+ ) ;
89+
7690 const handleLeaderboardSelect = ( id : number ) => {
7791 setIsLeaderboardSelectOpen ( false ) ;
7892 navigate ( `/leaderboard/${ id } /editor` ) ;
@@ -215,13 +229,58 @@ export default function Home() {
215229 ) : loading ? (
216230 < Loading />
217231 ) : leaderboards . length > 0 ? (
218- < Grid container spacing = { 3 } >
219- { leaderboards . map ( ( leaderboard ) => (
220- < Grid size = { { xs : 12 , sm : 6 , md : 4 , lg : 4 } } key = { leaderboard . id } >
221- < LeaderboardTile leaderboard = { leaderboard } />
222- </ Grid >
223- ) ) }
224- </ Grid >
232+ < Box >
233+ { /* Active Competitions */ }
234+ { activeCompetitions . length > 0 && (
235+ < Box sx = { { mb : 5 } } >
236+ < Typography variant = "h5" component = "h2" sx = { { mb : 2 } } >
237+ Active Competitions
238+ </ Typography >
239+ < Grid container spacing = { 3 } >
240+ { activeCompetitions . map ( ( leaderboard ) => (
241+ < Grid size = { { xs : 12 , sm : 6 , md : 4 , lg : 4 } } key = { leaderboard . id } >
242+ < LeaderboardTile leaderboard = { leaderboard } />
243+ </ Grid >
244+ ) ) }
245+ </ Grid >
246+ </ Box >
247+ ) }
248+
249+ { /* Getting Started */ }
250+ { beginnerProblems . length > 0 && (
251+ < Box sx = { { mb : 5 } } >
252+ < Typography variant = "h5" component = "h2" sx = { { mb : 0.5 } } >
253+ Getting Started
254+ </ Typography >
255+ < Typography variant = "body2" color = "text.secondary" sx = { { mb : 2 } } >
256+ New to GPU programming? Start here.
257+ </ Typography >
258+ < Grid container spacing = { 3 } >
259+ { beginnerProblems . map ( ( leaderboard ) => (
260+ < Grid size = { { xs : 12 , sm : 6 , md : 4 , lg : 4 } } key = { leaderboard . id } >
261+ < LeaderboardTile leaderboard = { leaderboard } />
262+ </ Grid >
263+ ) ) }
264+ </ Grid >
265+ </ Box >
266+ ) }
267+
268+ { /* Closed Competitions */ }
269+ { closedCompetitions . length > 0 && (
270+ < Box >
271+ < Typography variant = "h5" component = "h2" sx = { { mb : 2 , color : "text.secondary" } } >
272+ Closed Competitions
273+ </ Typography >
274+ < Grid container spacing = { 3 } >
275+ { closedCompetitions . map ( ( leaderboard ) => (
276+ < Grid size = { { xs : 12 , sm : 6 , md : 4 , lg : 4 } } key = { leaderboard . id } >
277+ < LeaderboardTile leaderboard = { leaderboard } expired />
278+ </ Grid >
279+ ) ) }
280+ </ Grid >
281+ </ Box >
282+ ) }
283+ </ Box >
225284 ) : (
226285 < Typography variant = "body1" color = "text.secondary" >
227286 No active leaderboards found.
0 commit comments