From d33feced1d3de0bb7df2afedd3aa8d94bc1ade07 Mon Sep 17 00:00:00 2001 From: belisards Date: Sun, 3 May 2026 17:02:45 -0300 Subject: [PATCH] fix(build): read URL params via window in guards (avoid useSearchParams prerender error) --- app/page.tsx | 6 +++--- components/admin-guard.tsx | 9 +++------ components/guest-guard.tsx | 7 ++----- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index 79577eb..1edbbbd 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -2,18 +2,18 @@ import { useEffect, useState } from 'react'; import Link from 'next/link'; -import { useRouter, useSearchParams } from 'next/navigation'; +import { useRouter } from 'next/navigation'; import { authApi, wishlistsApi, type Wishlist } from '@/lib/api'; export default function HomePage() { const router = useRouter(); - const params = useSearchParams(); const [state, setState] = useState<'checking' | 'guest' | 'none'>('checking'); const [wishlists, setWishlists] = useState([]); useEffect(() => { let cancelled = false; (async () => { + const params = new URL(window.location.href).searchParams; const adm = params.get('adm'); const usr = params.get('usr'); try { @@ -48,7 +48,7 @@ export default function HomePage() { } })(); return () => { cancelled = true; }; - }, [params, router]); + }, [router]); if (state === 'checking') { return
Carregando…
; diff --git a/components/admin-guard.tsx b/components/admin-guard.tsx index c853613..fcbfa9e 100644 --- a/components/admin-guard.tsx +++ b/components/admin-guard.tsx @@ -1,22 +1,19 @@ 'use client'; import { useEffect, useState } from 'react'; -import { useSearchParams } from 'next/navigation'; import { authApi } from '@/lib/api'; export default function AdminGuard({ children }: { children: React.ReactNode }) { - const params = useSearchParams(); const [state, setState] = useState<'checking' | 'ok' | 'denied'>('checking'); useEffect(() => { let cancelled = false; (async () => { - const adm = params.get('adm'); + const url = new URL(window.location.href); + const adm = url.searchParams.get('adm'); try { if (adm) { await authApi.session({ adm }); - // strip the param from URL but keep route - const url = new URL(window.location.href); url.searchParams.delete('adm'); window.history.replaceState({}, '', url.toString()); } @@ -29,7 +26,7 @@ export default function AdminGuard({ children }: { children: React.ReactNode }) } })(); return () => { cancelled = true; }; - }, [params]); + }, []); if (state === 'checking') return
Verificando…
; if (state === 'denied') return
diff --git a/components/guest-guard.tsx b/components/guest-guard.tsx index 243d571..0acd5f5 100644 --- a/components/guest-guard.tsx +++ b/components/guest-guard.tsx @@ -1,23 +1,20 @@ 'use client'; import { useEffect, useState } from 'react'; -import { useSearchParams } from 'next/navigation'; import { authApi } from '@/lib/api'; type Status = 'checking' | { kind: 'ok'; guestName: string } | 'denied'; export default function GuestGuard({ children }: { children: React.ReactNode }) { - const params = useSearchParams(); const [status, setStatus] = useState('checking'); useEffect(() => { let cancelled = false; (async () => { - const usr = params.get('usr'); + const usr = new URL(window.location.href).searchParams.get('usr'); try { if (usr) { await authApi.session({ usr }); - // user said leaving the token in URL is fine — do NOT strip } const who = await authApi.whoami(); if (cancelled) return; @@ -31,7 +28,7 @@ export default function GuestGuard({ children }: { children: React.ReactNode }) } })(); return () => { cancelled = true; }; - }, [params]); + }, []); if (status === 'checking') return
Verificando convite…
; if (status === 'denied') return