arbritage/pages/Login.tsx
2026-01-26 11:20:25 -03:00

106 lines
5.5 KiB
TypeScript

import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { Hexagon, ArrowRight, Lock, Mail } from 'lucide-react';
import clsx from 'clsx';
import { useCRM } from '../context/CRMContext';
import Logo from '../components/Logo';
const Login: React.FC = () => {
const navigate = useNavigate();
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [loading, setLoading] = useState(false);
const { signIn } = useCRM();
const handleLogin = async (e: React.FormEvent) => {
e.preventDefault();
setLoading(true);
const { error } = await signIn(email, password);
if (error) {
alert("Erro ao entrar: " + error.message);
setLoading(false);
} else {
// Context logic handles redirect via Session state or we can force it here
navigate('/');
}
};
return (
<div className="min-h-screen w-full bg-background flex items-center justify-center p-4 relative overflow-hidden">
{/* Background Ambient Effects */}
<div className="absolute top-[-20%] left-[-10%] w-[600px] h-[600px] bg-indigo-500/10 rounded-full blur-[120px] animate-pulse duration-10000" />
<div className="absolute bottom-[-20%] right-[-10%] w-[600px] h-[600px] bg-emerald-500/5 rounded-full blur-[120px] animate-pulse duration-7000" />
{/* Login Card */}
<div className="w-full max-w-md animate-in fade-in zoom-in-95 duration-700">
<div className="glass-card p-10 rounded-[32px] border border-white/5 backdrop-blur-2xl shadow-2xl relative z-10">
{/* Header */}
<div className="text-center mb-10 flex flex-col items-center">
<Logo size="lg" />
</div>
{/* Form */}
<form onSubmit={handleLogin} className="space-y-5">
<div className="space-y-1.5">
<label className="text-[10px] font-bold text-muted-foreground uppercase tracking-widest ml-1">Email Corporativo</label>
<div className="relative group">
<div className="absolute left-4 top-1/2 -translate-y-1/2 text-muted-foreground group-focus-within:text-foreground transition-colors">
<Mail size={18} />
</div>
<input
type="email"
value={email}
onChange={e => setEmail(e.target.value)}
className="w-full bg-secondary/30 border border-white/5 hover:border-white/10 focus:border-white/20 rounded-2xl py-4 pl-12 pr-4 text-sm text-foreground placeholder:text-muted-foreground/50 outline-none transition-all"
placeholder="admin@arbitra.com"
/>
</div>
</div>
<div className="space-y-1.5">
<label className="text-[10px] font-bold text-muted-foreground uppercase tracking-widest ml-1">Senha de Acesso</label>
<div className="relative group">
<div className="absolute left-4 top-1/2 -translate-y-1/2 text-muted-foreground group-focus-within:text-foreground transition-colors">
<Lock size={18} />
</div>
<input
type="password"
value={password}
onChange={e => setPassword(e.target.value)}
className="w-full bg-secondary/30 border border-white/5 hover:border-white/10 focus:border-white/20 rounded-2xl py-4 pl-12 pr-4 text-sm text-foreground placeholder:text-muted-foreground/50 outline-none transition-all"
placeholder="••••••••"
/>
</div>
</div>
<button
type="submit"
disabled={loading}
className="w-full bg-foreground text-background hover:bg-white/90 py-4 rounded-2xl font-bold text-sm shadow-xl shadow-white/5 flex items-center justify-center gap-2 transition-all active:scale-[0.98] mt-4 group"
>
{loading ? (
<span className="w-5 h-5 border-2 border-background/30 border-t-background rounded-full animate-spin" />
) : (
<>
Acessar Sistema <ArrowRight size={16} className="group-hover:translate-x-0.5 transition-transform" />
</>
)}
</button>
</form>
{/* Footer */}
<div className="mt-8 text-center">
<p className="text-[10px] text-muted-foreground/60 font-medium">
Acesso Restrito &bull; Segurança Criptografada
</p>
</div>
</div>
</div>
</div>
);
};
export default Login;