Spaces:
Running
Running
| import React, { useState } from 'react'; | |
| import { useAuth } from '../context/AuthContext'; | |
| import { useNavigate } from 'react-router-dom'; | |
| import { User, ShieldCheck, Utensils, ArrowRightCircle } from 'lucide-react'; | |
| export default function Login() { | |
| const [email, setEmail] = useState('admin@rest-os.com'); | |
| const [password, setPassword] = useState('admin-password123'); | |
| const [loading, setLoading] = useState(false); | |
| const [error, setError] = useState(''); | |
| const [loginMode, setLoginMode] = useState('admin'); // 'admin' or 'mesero' | |
| const { login, currentUser } = useAuth(); | |
| const navigate = useNavigate(); | |
| const handleSubmit = async (e) => { | |
| e.preventDefault(); | |
| setLoading(true); | |
| setError(''); | |
| // Si ya hay una sesión activa, simplemente navegar | |
| if (currentUser && currentUser.email === email) { | |
| const targetRole = email.includes('admin') ? 'admin' : 'mesero'; | |
| navigate(targetRole === 'admin' ? '/admin' : '/pos'); | |
| setLoading(false); | |
| return; | |
| } | |
| try { | |
| await login(email, password); | |
| // navigation is handled by RootRedirect in App.jsx | |
| } catch (err) { | |
| setError('Credenciales inválidas. Por favor intente de nuevo.'); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }; | |
| const setDemo = (role) => { | |
| if (role === 'admin') { | |
| setEmail('admin@rest-os.com'); | |
| setPassword('admin-password123'); | |
| setLoginMode('admin'); | |
| } else { | |
| setEmail('mesero@rest-os.com'); | |
| setPassword('mesero-password123'); | |
| setLoginMode('mesero'); | |
| } | |
| }; | |
| return ( | |
| <div className="app-container" style={{ | |
| background: 'radial-gradient(circle at top right, #1a1a1a, #0a0a0a)', | |
| justifyContent: 'center', alignItems: 'center', minHeight: '100vh', padding: '20px' | |
| }}> | |
| {/* Icono de Ver Menú Público */} | |
| <button | |
| onClick={() => navigate('/menu')} | |
| className="glass-card animate-fade-in" | |
| style={{ | |
| position: 'absolute', top: '30px', right: '30px', padding: '12px 24px', | |
| display: 'flex', alignItems: 'center', gap: '10px', color: 'var(--primary)', | |
| cursor: 'pointer', border: '1px solid rgba(255,107,107,0.3)', | |
| zIndex: 10 | |
| }} | |
| > | |
| <Utensils size={20} /> | |
| <span style={{ fontWeight: '600' }}>Ver Carta Digital</span> | |
| <ArrowRightCircle size={18} /> | |
| </button> | |
| <div className="glass-panel animate-slide-up" style={{ | |
| maxWidth: '900px', width: '100%', padding: '0', display: 'flex', | |
| overflow: 'hidden', boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5)' | |
| }}> | |
| {/* Lado Izquierdo: Selección de Rol */} | |
| <div style={{ | |
| width: '35%', background: 'rgba(255,255,255,0.03)', | |
| borderRight: '1px solid var(--border-subtle)', padding: '40px 30px', | |
| display: 'flex', flexDirection: 'column', gap: '20px' | |
| }}> | |
| <h2 style={{ fontSize: '1.4rem', fontWeight: '800', marginBottom: '10px' }}>Bienvenido</h2> | |
| <p style={{ color: 'var(--text-muted)', fontSize: '0.9rem', marginBottom: '20px' }}>Seleccione su rol para ingresar al sistema</p> | |
| <button | |
| onClick={() => { setDemo('admin'); setError(''); }} | |
| style={{ | |
| padding: '20px', borderRadius: 'var(--radius-sm)', border: '1px solid', | |
| borderColor: 'var(--primary)', | |
| background: 'rgba(255,107,107,0.1)', | |
| display: 'flex', alignItems: 'center', gap: '15px', textAlign: 'left', | |
| transition: 'all 0.3s ease', cursor: 'pointer' | |
| }} | |
| > | |
| <div style={{ | |
| padding: '10px', borderRadius: '10px', | |
| background: 'var(--primary)', | |
| color: '#fff' | |
| }}> | |
| <ShieldCheck size={24} /> | |
| </div> | |
| <div> | |
| <div style={{ fontWeight: '700', color: 'var(--text-main)' }}>Administrador</div> | |
| <div style={{ fontSize: '0.75rem', color: 'var(--text-muted)' }}>Gestión y Reportes</div> | |
| </div> | |
| </button> | |
| </div> | |
| {/* Lado Derecho: Formulario de Login */} | |
| <div style={{ flex: 1, padding: '60px' }}> | |
| <div style={{ marginBottom: '40px' }}> | |
| <h1 className="text-gradient" style={{ fontSize: '2.5rem', fontWeight: '900', marginBottom: '10px' }}> | |
| Dashboard Admin | |
| </h1> | |
| <p style={{ color: 'var(--text-muted)' }}>Ingrese sus credenciales para continuar</p> | |
| </div> | |
| {error && ( | |
| <div className="glass-card" style={{ padding: '10px 20px', background: 'rgba(255,90,95,0.1)', border: '1px solid var(--primary)', borderRadius: 'var(--radius-sm)', marginBottom: '20px', color: 'var(--primary)', fontSize: '0.9rem' }}> | |
| {error} | |
| </div> | |
| )} | |
| <form onSubmit={handleSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '1.5rem' }}> | |
| <div> | |
| <label style={{ display: 'block', marginBottom: '8px', fontSize: '0.9rem', color: 'var(--text-muted)' }}>Correo Electrónico</label> | |
| <input | |
| type="email" required value={email} onChange={(e) => setEmail(e.target.value)} | |
| style={{ width: '100%', padding: '14px', borderRadius: '10px', background: 'rgba(255,255,255,0.05)', border: '1px solid var(--border-subtle)', color: '#fff' }} | |
| /> | |
| </div> | |
| <div> | |
| <label style={{ display: 'block', marginBottom: '8px', fontSize: '0.9rem', color: 'var(--text-muted)' }}>Contraseña</label> | |
| <input | |
| type="password" required value={password} onChange={(e) => setPassword(e.target.value)} | |
| style={{ width: '100%', padding: '14px', borderRadius: '10px', background: 'rgba(255,255,255,0.05)', border: '1px solid var(--border-subtle)', color: '#fff' }} | |
| /> | |
| </div> | |
| <button type="submit" className="btn-primary" style={{ height: '55px', fontSize: '1.1rem', marginTop: '10px' }} disabled={loading}> | |
| {loading ? 'Validando...' : 'Iniciar Sesión'} | |
| </button> | |
| </form> | |
| {/* Botón Demo rápido */} | |
| <div style={{ marginTop: '30px', textAlign: 'center' }}> | |
| <button | |
| onClick={() => setDemo('admin')} | |
| style={{ background: 'none', border: 'none', color: 'var(--text-muted)', cursor: 'pointer', textDecoration: 'underline', fontSize: '0.85rem' }} | |
| > | |
| Usar credenciales de prueba | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |