Ferramente-projeto/src/app/auth/callback/page.tsx

106 lines
3.1 KiB
TypeScript

'use client';
import { authClient } from '@/lib/auth-client';
import { useRouter } from 'next/navigation';
import { useEffect, useState } from 'react';
export default function AuthCallback() {
const [isValidating, setIsValidating] = useState(true);
const [error, setError] = useState('');
const router = useRouter();
useEffect(() => {
const validateUser = async () => {
try {
// Aguardar um pouco para garantir que a sessão foi criada
await new Promise((resolve) => setTimeout(resolve, 1000));
const session = await authClient.getSession();
if (!session?.data?.user?.email) {
setError('Erro ao obter dados do usuário');
setIsValidating(false);
return;
}
// Validar se o email é permitido
const response = await fetch('/api/validate-email', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: session.data.user.email,
}),
});
const data = await response.json();
if (!data.isAllowed) {
// Se o email não for permitido, fazer logout e mostrar erro
await authClient.signOut();
setError(data.message);
setIsValidating(false);
return;
}
// Se o email for permitido, redirecionar para o dashboard
router.push('/dashboard');
} catch (error) {
console.error('Erro na validação:', error);
setError('Erro interno do servidor');
setIsValidating(false);
}
};
validateUser();
}, [router]);
if (isValidating) {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="text-center">
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto mb-4"></div>
<p className="text-muted-foreground">Validando acesso...</p>
</div>
</div>
);
}
if (error) {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="text-center max-w-md mx-auto p-6">
<div className="text-red-500 mb-4">
<svg
className="w-16 h-16 mx-auto"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"
/>
</svg>
</div>
<h1 className="text-2xl font-bold text-red-600 mb-2">
Acesso Negado
</h1>
<p className="text-muted-foreground mb-6">{error}</p>
<button
onClick={() => router.push('/login')}
className="bg-primary text-primary-foreground px-4 py-2 rounded-md hover:bg-primary/90"
>
Voltar ao Login
</button>
</div>
</div>
);
}
return null;
}