diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index ae4f62a..5d004e4 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -21,6 +21,8 @@ export default function App() { const [health, setHealth] = useState(null) const [healthError, setHealthError] = useState(null) const [setup, setSetup] = useState(null) + const [setupLoading, setSetupLoading] = useState(true) + const [setupError, setSetupError] = useState(null) const [authMode, setAuthMode] = useState('login') const [token, setToken] = useState(() => localStorage.getItem(TOKEN_KEY) || '') const [email, setEmail] = useState('') @@ -42,13 +44,33 @@ export default function App() { .then(setHealth) .catch((err) => setHealthError(err.message)) - fetch('/api/auth/setup-status') - .then((res) => res.json()) - .then((data) => { - setSetup(data) - if (data.registration_open) setAuthMode('register') - }) - .catch(() => setSetup({ registration_open: false, has_users: true })) + async function loadSetupStatus() { + setSetupLoading(true) + setSetupError(null) + try { + const res = await fetch('/api/auth/setup-status') + const body = await res.json().catch(() => ({})) + if (!res.ok) { + throw new Error( + res.status === 404 + ? 'Endpoint /api/auth/setup-status nicht gefunden — Backend neu deployen?' + : parseError(body, `Setup-Status fehlgeschlagen (HTTP ${res.status})`), + ) + } + if (typeof body.registration_open !== 'boolean') { + throw new Error('Ungültige Antwort vom Setup-Status — Backend-Version prüfen') + } + setSetup(body) + if (body.registration_open) setAuthMode('register') + } catch (err) { + setSetup(null) + setSetupError(err.message) + } finally { + setSetupLoading(false) + } + } + + loadSetupStatus() }, []) const loadSession = useCallback(async (activeToken) => { @@ -155,6 +177,7 @@ export default function App() { } const registrationOpen = setup?.registration_open === true + const registrationClosedBecauseUsersExist = setup?.has_users === true && !registrationOpen return (
@@ -174,7 +197,24 @@ export default function App() {

)} - {!token && ( + {!token && setupLoading && ( +

Prüfe Ersteinrichtung …

+ )} + + {!token && setupError && ( +

{setupError}

+ )} + + {!token && registrationClosedBecauseUsersExist && ( +

+ Es existiert bereits mindestens ein Benutzer ({setup.user_count ?? '≥1'}). + Registrierung ist nur für die Ersteinrichtung vorgesehen — bitte anmelden. + Falls der Admin per KAIRO_BOOTSTRAP_* in der .env angelegt + wurde, nutzen Sie diese Zugangsdaten. +

+ )} + + {!token && !setupLoading && !setupError && ( <>