|
1 | 1 | 'use client'; |
2 | 2 |
|
3 | | -import { useState, useEffect, useMemo } from 'react'; |
| 3 | +import { useState, useEffect, useMemo, Suspense } from 'react'; |
4 | 4 | import { useRouter, useSearchParams } from 'next/navigation'; |
5 | 5 | import Link from 'next/link'; |
6 | 6 | import { listJobs, getJobDetails, JobDetails } from '@/lib/api'; |
@@ -45,7 +45,25 @@ function getBestValue(jobs: JobDetails[], metricKey: MetricKey): number | undefi |
45 | 45 | return Math.max(...values); |
46 | 46 | } |
47 | 47 |
|
48 | | -export default function ComparePage() { |
| 48 | +// Loading component for Suspense fallback |
| 49 | +function ComparePageSkeleton() { |
| 50 | + return ( |
| 51 | + <div className="min-h-screen bg-gray-50 dark:bg-zinc-900 transition-colors"> |
| 52 | + <Header title="Compare Models" showBackToUpload /> |
| 53 | + <main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"> |
| 54 | + <div className="bg-white dark:bg-zinc-800 rounded-lg shadow dark:shadow-zinc-900/50 p-6 mb-6 transition-colors"> |
| 55 | + <div className="text-center py-12"> |
| 56 | + <div className="animate-spin rounded-full h-12 w-12 border-b-2 border-indigo-600 dark:border-indigo-400 mx-auto mb-4"></div> |
| 57 | + <p className="text-gray-600 dark:text-gray-400">Loading jobs for comparison...</p> |
| 58 | + </div> |
| 59 | + </div> |
| 60 | + </main> |
| 61 | + </div> |
| 62 | + ); |
| 63 | +} |
| 64 | + |
| 65 | +// Main compare page content (uses useSearchParams) |
| 66 | +function ComparePageContent() { |
49 | 67 | const router = useRouter(); |
50 | 68 | const searchParams = useSearchParams(); |
51 | 69 |
|
@@ -156,8 +174,9 @@ export default function ComparePage() { |
156 | 174 | </div> |
157 | 175 |
|
158 | 176 | {isLoading ? ( |
159 | | - <div className="flex items-center justify-center py-8"> |
160 | | - <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-indigo-600 dark:border-indigo-400"></div> |
| 177 | + <div className="text-center py-12"> |
| 178 | + <div className="animate-spin rounded-full h-12 w-12 border-b-2 border-indigo-600 dark:border-indigo-400 mx-auto mb-4"></div> |
| 179 | + <p className="text-gray-600 dark:text-gray-400">Loading jobs for comparison...</p> |
161 | 180 | </div> |
162 | 181 | ) : allJobs.length === 0 ? ( |
163 | 182 | <div className="text-center py-8"> |
@@ -373,3 +392,12 @@ export default function ComparePage() { |
373 | 392 | </div> |
374 | 393 | ); |
375 | 394 | } |
| 395 | + |
| 396 | +// Wrap with Suspense to handle useSearchParams() in Next.js 16 client components |
| 397 | +export default function ComparePage() { |
| 398 | + return ( |
| 399 | + <Suspense fallback={<ComparePageSkeleton />}> |
| 400 | + <ComparePageContent /> |
| 401 | + </Suspense> |
| 402 | + ); |
| 403 | +} |
0 commit comments