Skip to content

Commit 3a0c0cd

Browse files
authored
Merge pull request #17 from cristofima/dev - fix(frontend/compare): wrap useSearchParams in Suspense boundary for Next.js 16 compatibility
- Extracted main page logic into ComparePageContent component that uses useSearchParams - Added ComparePageSkeleton fallback component with loading spinner - Wrapped content in Suspense boundary in the default export ComparePage
2 parents 643e256 + fbbfe1d commit 3a0c0cd

1 file changed

Lines changed: 32 additions & 4 deletions

File tree

frontend/app/compare/page.tsx

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
import { useState, useEffect, useMemo } from 'react';
3+
import { useState, useEffect, useMemo, Suspense } from 'react';
44
import { useRouter, useSearchParams } from 'next/navigation';
55
import Link from 'next/link';
66
import { listJobs, getJobDetails, JobDetails } from '@/lib/api';
@@ -45,7 +45,25 @@ function getBestValue(jobs: JobDetails[], metricKey: MetricKey): number | undefi
4545
return Math.max(...values);
4646
}
4747

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() {
4967
const router = useRouter();
5068
const searchParams = useSearchParams();
5169

@@ -156,8 +174,9 @@ export default function ComparePage() {
156174
</div>
157175

158176
{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>
161180
</div>
162181
) : allJobs.length === 0 ? (
163182
<div className="text-center py-8">
@@ -373,3 +392,12 @@ export default function ComparePage() {
373392
</div>
374393
);
375394
}
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

Comments
 (0)