"use client"; import { Suspense, useEffect, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; function AuthCallbackContent() { const router = useRouter(); const searchParams = useSearchParams(); const [status, setStatus] = useState<"processing" | "success" | "error">( "processing" ); const [errorMsg, setErrorMsg] = useState(""); useEffect(() => { const token = searchParams.get("token"); const code = searchParams.get("code"); const error = searchParams.get("error"); if (error) { setStatus("error"); setErrorMsg(decodeURIComponent(error)); return; } // --- Casdoor OIDC flow: exchange authorization code for tokens --- if (code) { fetch(`/api/auth/casdoor-callback?code=${encodeURIComponent(code)}`) .then((res) => res.json()) .then((data) => { if (data.error) { setStatus("error"); setErrorMsg(data.error); return; } // Store the access token localStorage.setItem("flh_token", data.access_token); if (data.id_token) { localStorage.setItem("flh_id_token", data.id_token); } if (data.refresh_token) { localStorage.setItem("flh_refresh_token", data.refresh_token); } if (data.user) { localStorage.setItem("flh_user", JSON.stringify(data.user)); } // Dispatch storage event so AuthContext picks it up window.dispatchEvent( new StorageEvent("storage", { key: "flh_token", newValue: data.access_token, oldValue: null, storageArea: localStorage, }) ); setStatus("success"); // Redirect to home setTimeout(() => router.push("/"), 500); }) .catch((err) => { console.error("[oidc-callback] Token exchange error:", err); setStatus("error"); setErrorMsg("Failed to complete authentication. Please try again."); }); return; } // --- Legacy UmmahID flow: token passed directly in URL --- if (!token) { setStatus("error"); setErrorMsg("No authentication code received."); return; } // Store token in localStorage localStorage.setItem("flh_token", token); window.dispatchEvent( new StorageEvent("storage", { key: "flh_token", newValue: token, oldValue: null, storageArea: localStorage, }) ); setStatus("success"); // If this is a popup window, close it after a brief delay if (window.opener) { setTimeout(() => window.close(), 500); } else { setTimeout(() => router.push("/"), 500); } }, [searchParams, router]); return (
Signing you in...
Signed in successfully!
{errorMsg}
Signing you in...