"use client" import { useRouter, useSearchParams } from "next/navigation" import { Suspense, useEffect, useRef } from "react" import { toast } from "sonner" import { exchangeOIDCTicket } from "@/lib/api/auth" import { useI18n } from "@/i18n/provider" export default function OIDCLoginCallbackPage() { return ( }> ) } function OIDCLoginCallbackContent() { const t = useI18n() const router = useRouter() const searchParams = useSearchParams() const ranRef = useRef(false) useEffect(() => { if (ranRef.current) { return } ranRef.current = true const ticket = searchParams.get("ticket")?.trim() ?? "" const next = searchParams.get("next") const nextPath = next && next.startsWith("/") ? next : "/dashboard" if (!ticket) { toast.error(t("auth.oidcMissingTicket")) router.replace("/dashboard/login") return } void exchangeOIDCTicket(ticket) .then(() => { toast.success(t("auth.loginSuccess")) router.replace(nextPath) }) .catch((error) => { toast.error(error instanceof Error ? error.message : t("auth.oidcFailed")) router.replace("/dashboard/login") }) }, [router, searchParams, t]) return } function OIDCLoginCallbackFallback() { const t = useI18n() return (

{t("auth.oidcSigningIn")}

{t("auth.checkingTicket")}

) }