107 lines
5.5 KiB
TypeScript
107 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 • Segurança Criptografada
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
};
|
||
|
|
|
||
|
|
export default Login;
|