import { useEffect, useState, type ReactNode } from 'react'; import { getStoredAuth, setStoredAuth } from '../api/auth'; export default function SessionGate({ children }: { children: ReactNode }) { const [ready, setReady] = useState(false); const [authed, setAuthed] = useState(!!getStoredAuth()); const [user, setUser] = useState('drjones'); const [pass, setPass] = useState(''); const [err, setErr] = useState(''); useEffect(() => { const token = getStoredAuth(); if (!token) { setAuthed(false); setReady(true); return; } fetch('/api/v1/config', { headers: { Authorization: `Basic ${token}` } }) .then((r) => { setAuthed(r.ok); setReady(true); }) .catch(() => { setAuthed(false); setReady(true); }); }, []); const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); setErr(''); const token = btoa(`${user}:${pass}`); try { const res = await fetch('/api/v1/config', { headers: { Authorization: `Basic ${token}` } }); if (!res.ok) { setErr('Login failed — check username and password.'); return; } setStoredAuth(user, pass); setAuthed(true); } catch { setErr('Cannot reach server — check that miner-server is running.'); } }; if (!ready) { return (

Starting AetherForge…

); } if (!authed) { return (

AetherForge

Sign in to open the command deck.

setUser(e.target.value)} autoComplete="username" /> setPass(e.target.value)} autoComplete="current-password" /> {err &&

{err}

}

Default: drjones / czapiewski (change under Calibrate → Users)

); } return <>{children}; }