import { useState, type FormEvent } from 'react'; import { useNavigate } from 'react-router-dom'; import { toast } from 'sonner'; import { useAuthStore } from '../../store/useAuthStore'; import { Button } from '../ui/Button'; export function LoginPage() { const navigate = useNavigate(); const { login } = useAuthStore(); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [loading, setLoading] = useState(false); async function handleSubmit(e: FormEvent) { e.preventDefault(); if (!username.trim() || !password) return; setLoading(true); try { await login(username.trim(), password); navigate('/rack', { replace: true }); } catch (err) { toast.error(err instanceof Error ? err.message : 'Login failed'); } finally { setLoading(false); } } return (
{/* Logo / wordmark */}
RACKMAPPER

Network infrastructure management

{/* Card */}
setUsername(e.target.value)} disabled={loading} className="w-full bg-slate-900 border border-slate-600 rounded-lg px-3 py-2 text-slate-100 text-sm placeholder:text-slate-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:opacity-50" placeholder="admin" />
setPassword(e.target.value)} disabled={loading} className="w-full bg-slate-900 border border-slate-600 rounded-lg px-3 py-2 text-slate-100 text-sm placeholder:text-slate-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:opacity-50" placeholder="••••••••" />

Credentials are set via Docker environment variables.

); }