import { useState, useEffect } from 'react' import { Monitor, Fingerprint } from 'lucide-react' import { login, register, loginWithPasskey } from '../api/client' import { inputClass, PasswordInput } from './ui/controls' export default function LoginPage({ isFirstUser, passkeyEnabled, onAuthenticated }) { const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [password2, setPassword2] = useState('') const [error, setError] = useState(null) const [loading, setLoading] = useState(false) const [passkeyLoading, setPasskeyLoading] = useState(false) const [browserSupportsPasskey, setBrowserSupportsPasskey] = useState(false) const isRegister = isFirstUser useEffect(() => { if (window.PublicKeyCredential) { window.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() .then(available => setBrowserSupportsPasskey(available)) .catch(() => setBrowserSupportsPasskey(false)) } }, []) const handleSubmit = async (e) => { e.preventDefault() setError(null) if (isRegister) { if (password !== password2) { setError('Les mots de passe ne correspondent pas.') return } if (password.length < 6) { setError('Le mot de passe doit contenir au moins 6 caractères.') return } } setLoading(true) try { const data = isRegister ? await register(username.trim(), password) : await login(username.trim(), password) onAuthenticated(data.access_token, data.role) } catch (err) { setError(err.message) } finally { setLoading(false) } } const handlePasskeyLogin = async () => { setError(null) setPasskeyLoading(true) try { const data = await loginWithPasskey(username.trim() || null) onAuthenticated(data.access_token, data.role) } catch (err) { if (err.name === 'NotAllowedError' || err.message?.includes('NotAllowedError')) { setError('Authentification annulée.') } else { setError(err.message) } } finally { setPasskeyLoading(false) } } const showPasskeyButton = !isRegister && passkeyEnabled && browserSupportsPasskey return (
{/* Logo */}

VPS Monitor

{isRegister ? 'Créer le compte administrateur' : 'Connexion'}

{isRegister && (
Aucun utilisateur n'existe encore. Le premier compte créé sera admin.
)} {error && (
{error}
)}
setUsername(e.target.value)} className={inputClass} />
setPassword(e.target.value)} />
{isRegister && (
setPassword2(e.target.value)} />
)}
{showPasskeyButton && ( <>
ou
)}
) }