106 lines
3.1 KiB
TypeScript
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;
|
|
}
|