import { useEffect, useRef } from 'react'; import { Navigate, useNavigate } from 'react-router'; import { useAuthStore } from './auth-store'; import { Card, Spinner, Alert, Button } from '@cameleer/design-system'; import { config } from '../config'; export function OidcCallback() { const { isAuthenticated, loading, error, loginWithOidcCode } = useAuthStore(); const navigate = useNavigate(); const exchanged = useRef(false); useEffect(() => { if (exchanged.current) return; exchanged.current = true; const params = new URLSearchParams(window.location.search); const code = params.get('code'); const errorParam = params.get('error'); if (errorParam) { // prompt=none SSO attempt failed (no active session) — fall back to login form if (errorParam === 'login_required' || errorParam === 'interaction_required') { window.location.replace(`${config.basePath}login?local`); return; } useAuthStore.setState({ error: params.get('error_description') || errorParam, loading: false, }); return; } if (!code) { useAuthStore.setState({ error: 'No authorization code received', loading: false }); return; } const redirectUri = `${window.location.origin}${config.basePath}oidc/callback`; loginWithOidcCode(code, redirectUri); }, [loginWithOidcCode]); if (isAuthenticated) return ; return (

cameleer3

{loading && } {error && ( <> {error} )}
); }