import React, { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { useAuth } from '../contexts/AuthContext' import { Shield } from 'lucide-react' import axios from 'axios' export default function Login() { const { login } = useAuth() const navigate = useNavigate() const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [error, setError] = useState('') const [loading, setLoading] = useState(false) const [version, setVersion] = useState(null) useEffect(() => { axios.get('/api/health', { timeout: 5_000 }) .then(r => setVersion(r.data.version ?? null)) .catch(() => {}) }, []) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError('') setLoading(true) try { await login(username, password) navigate('/') } catch (err: unknown) { const msg = err instanceof Error ? err.message : 'Login failed' setError((err as { response?: { data?: { error?: string } } })?.response?.data?.error ?? msg) } finally { setLoading(false) } } return (
{/* Logo */}

NixServer

Admin Panel

{/* Form */}
{error && (
{error}
)}
setUsername(e.target.value)} required autoFocus className="w-full bg-[#0f1117] border border-[#2a2d3e] text-white text-sm rounded-lg px-3 py-2.5 focus:outline-none focus:border-indigo-500 transition-colors" placeholder="root" />
setPassword(e.target.value)} required className="w-full bg-[#0f1117] border border-[#2a2d3e] text-white text-sm rounded-lg px-3 py-2.5 focus:outline-none focus:border-indigo-500 transition-colors" placeholder="••••••••" />

NixServer{version ? ` v${version}` : ''} · Port 2087

) }