import { useState } from 'react'; import { Eye, EyeOff, LockKeyhole, Shield, User, } from 'lucide-react'; import { Button } from '@/components/ui/Button'; import { loginApi } from '@/services/loginApi'; import logoIcon from '@/assets/logo-icon.png'; type LoginScreenProps = { onLogin: (keepLoggedIn: boolean) => void; }; export function LoginScreen({ onLogin, }: LoginScreenProps) { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const [keepLoggedIn, setKeepLoggedIn] = useState(false); const [showPassword, setShowPassword] = useState(false); const [submitting, setSubmitting] = useState(false); async function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (submitting) { return; } setSubmitting(true); setError(''); try { console.log('LOGIN TRY', { username: username.trim(), passwordLength: password.length, }); const response = await loginApi.login( username.trim(), password, ); if (response.authenticated) { onLogin(keepLoggedIn); return; } setError('Credenciais inválidas.'); } catch (error) { setError(`Falha no login: ${String(error)}`); } finally { setSubmitting(false); } } return (
Litoral Regas

Litoral Regas

VPN Orchestrator

setUsername(event.target.value) } autoComplete="username" className="w-full rounded-2xl border border-white/10 bg-black/25 py-4 pl-11 pr-4 text-sm text-white outline-none transition placeholder:text-slate-600 focus:border-blue-400/60 focus:bg-black/35 focus:shadow-[0_0_0_4px_rgba(59,130,246,0.12)]" placeholder="Introduza o utilizador" />
setPassword(event.target.value) } autoComplete="current-password" className="w-full rounded-2xl border border-white/10 bg-black/25 py-4 pl-11 pr-12 text-sm text-white outline-none transition placeholder:text-slate-600 focus:border-blue-400/60 focus:bg-black/35 focus:shadow-[0_0_0_4px_rgba(59,130,246,0.12)]" placeholder="Introduza a palavra-passe" />
{error && (
{error}
)}
Acesso restrito a técnicos autorizados
); }