import { useState, useEffect } from "react"; import { useApp } from "../state/store"; import { api } from "../lib/api"; import { Bot } from "../components/icons"; export default function Login() { const setScene = useApp((s) => s.setScene); const loginAs = useApp((s) => s.loginAs); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [rememberMe, setRememberMe] = useState(false); const [devLoginEnabled, setDevLoginEnabled] = useState(true); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { // The dev-login button is intentionally on by default on canvas // (the user explicitly asked for it as a documented exception until // we cut over fully to SSO). The endpoint config only flips it OFF. api.devLoginConfig() .then((cfg) => { if (cfg.enabled === false) setDevLoginEnabled(false); }) .catch(() => { /* endpoint not present — keep default ON */ }); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!email) return; setLoading(true); setError(null); try { await loginAs(email, password || undefined); setScene("landing"); } catch (err) { setError((err as Error).message); } finally { setLoading(false); } }; const handleDevLogin = async () => { if (!email) { setError("Email required for dev-login"); return; } setLoading(true); setError(null); try { await loginAs(email, undefined); setScene("landing"); } catch (err) { setError((err as Error).message); } finally { setLoading(false); } }; const handleSSO = () => { window.location.href = "/api/v1/auth/microsoft/login"; }; return (

FLOWMASTER AUTHENTICATION

MISSION CONTROL VERIFICATION REQUIRED
{error &&
{error}
}
setEmail(e.target.value)} disabled={loading} autoComplete="email" placeholder="e.g. j.doe@flow-master.ai" required />
setPassword(e.target.value)} disabled={loading} autoComplete="current-password" />
Recover access
OR
{devLoginEnabled && ( )}
); }