diff --git a/app/(auth)/verify-email/page.tsx b/app/(auth)/verify-email/page.tsx index b755732..9ee2802 100644 --- a/app/(auth)/verify-email/page.tsx +++ b/app/(auth)/verify-email/page.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useState } from "react"; -import { useRouter, useSearchParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; import { MailCheck, XCircle } from "lucide-react"; import { useAuth } from "@/context/auth-context"; import { resendVerificationEmail, verifyEmail } from "@/lib/auth/api"; @@ -9,9 +9,10 @@ import { getApiErrorMessage } from "@/lib/api-error"; import { Spinner } from "@/components/ui/spinner"; import { Button } from "@/components/ui/button"; +const SESSION_SYNC_RETRY_DELAYS_MS = [150, 300, 600]; + export default function VerifyEmailPage() { const params = useSearchParams(); - const router = useRouter(); const { refetchUser } = useAuth(); const token = params.get("token"); @@ -33,10 +34,19 @@ export default function VerifyEmailPage() { void (async () => { try { await verifyEmail(token); - await refetchUser(); if (!isMounted) return; setStatus("success"); - redirectTimeout = setTimeout(() => router.replace("/explore"), 2500); + + for (const delay of SESSION_SYNC_RETRY_DELAYS_MS) { + try { + await refetchUser(); + break; + } catch { + await new Promise((resolve) => setTimeout(resolve, delay)); + } + } + + redirectTimeout = setTimeout(() => window.location.replace("/explore"), 1200); } catch (error) { if (!isMounted) return; setStatus("error"); @@ -48,7 +58,7 @@ export default function VerifyEmailPage() { isMounted = false; if (redirectTimeout) clearTimeout(redirectTimeout); }; - }, [refetchUser, router, token]); + }, [refetchUser, token]); const handleResend = async () => { if (!resendEmail || resendStatus === "sending" || resendStatus === "sent") return; diff --git a/app/(feed)/explore/explore-page-client.tsx b/app/(feed)/explore/explore-page-client.tsx index cd490e8..b4fb75b 100644 --- a/app/(feed)/explore/explore-page-client.tsx +++ b/app/(feed)/explore/explore-page-client.tsx @@ -1,7 +1,7 @@ "use client"; import { useCallback, useEffect, useState } from "react"; -import { useSearchParams } from "next/navigation"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { VideoCard } from "@/components/app/video/video-card"; import { getVideos, type VideoDetails } from "@/lib/video"; import { Spinner } from "@/components/ui/spinner"; @@ -45,6 +45,8 @@ export default function ExplorePageClient({ initialTotalPages, initialError, }: ExplorePageClientProps) { + const router = useRouter(); + const pathname = usePathname(); const params = useSearchParams(); const shouldFetchInit = Boolean(initialError); @@ -111,8 +113,14 @@ export default function ExplorePageClient({ }, [fetchVideos, shouldFetchInit]); useEffect(() => { - setIsPopupOpen(params.has("popup")); - }, [params]); + if (!params.has("popup")) return; + + const nextParams = new URLSearchParams(params.toString()); + nextParams.delete("popup"); + + const nextUrl = nextParams.toString() ? `${pathname}?${nextParams.toString()}` : pathname; + router.replace(nextUrl, { scroll: false }); + }, [params, pathname, router]); const loadMore = useCallback(() => { if (isLoading || isLoadingMore || !hasMore) return; @@ -151,6 +159,7 @@ export default function ExplorePageClient({

- {errorMessage ?? "Authentication is temporarily unavailable, so posting comments is disabled."} + {errorMessage ?? + "Authentication is temporarily unavailable, so posting comments is disabled."}