diff --git a/susconecta/app/auth/callback/page.tsx b/susconecta/app/auth/callback/page.tsx new file mode 100644 index 0000000..7f4e611 --- /dev/null +++ b/susconecta/app/auth/callback/page.tsx @@ -0,0 +1,73 @@ +"use client" +import { useEffect, useState } from 'react' +import { useRouter } from 'next/navigation' +import { getCurrentUser, AuthenticationError } from '@/lib/auth' +import { AUTH_STORAGE_KEYS, USER_TYPE_ROUTES } from '@/types/auth' + +function parseHashOrQuery() { + // Try fragment first (#access_token=...&refresh_token=...) + const hash = typeof window !== 'undefined' ? window.location.hash.replace(/^#/, '') : '' + const query = typeof window !== 'undefined' ? window.location.search.replace(/^\?/, '') : '' + + const params = new URLSearchParams(hash || query) + const access_token = params.get('access_token') + const refresh_token = params.get('refresh_token') + const expires_in = params.get('expires_in') + return { access_token, refresh_token, expires_in } +} + +export default function AuthCallbackPage() { + const router = useRouter() + const [message, setMessage] = useState('Processando autenticação...') + + useEffect(() => { + async function run() { + try { + const { access_token, refresh_token } = parseHashOrQuery() + if (!access_token) { + setMessage('Não foi possível detectar o token de acesso. Verifique o link enviado por email.'); + return + } + + setMessage('Validando token e obtendo dados do usuário...') + + // Buscar dados do usuário com o token recebido + const user = await getCurrentUser(access_token) + + // Persistir no localStorage com as chaves esperadas + if (typeof window !== 'undefined') { + localStorage.setItem(AUTH_STORAGE_KEYS.TOKEN, access_token) + if (refresh_token) localStorage.setItem(AUTH_STORAGE_KEYS.REFRESH_TOKEN, refresh_token) + try { localStorage.setItem(AUTH_STORAGE_KEYS.USER, JSON.stringify(user)) } catch {} + try { localStorage.setItem(AUTH_STORAGE_KEYS.USER_TYPE, user.userType || 'paciente') } catch {} + } + + setMessage('Autenticação concluída! Redirecionando...') + + // Determinar rota com base no tipo do usuário + const target = (user?.userType && USER_TYPE_ROUTES[user.userType]) || '/paciente' + + // Pequeno delay para UX + setTimeout(() => router.replace(target), 600) + } catch (err) { + console.error('[AUTH CALLBACK] Erro ao processar callback:', err) + if (err instanceof AuthenticationError) { + setMessage(err.message) + } else { + setMessage('Erro ao processar o link de autenticação. Tente novamente.') + } + } + } + + run() + }, [router]) + + return ( +
{message}
+{magicSent}
} +{magicSent}
} +{magicSent}
} +