/* Login screen — shown before App renders if no valid token. */ /* Del presis GPS-posisjon etter innlogging HVIS brukeren gir tillatelse. Rent best-effort: token er allerede satt, så dette blokkerer aldri login, og avslag/feil ignoreres (serveren faller tilbake til IP-basert posisjon). */ function shareLoginLocation(eventId) { if (!navigator.geolocation) return; navigator.geolocation.getCurrentPosition( (pos) => { window.api.loginGeo({ latitude: pos.coords.latitude, longitude: pos.coords.longitude, accuracy: pos.coords.accuracy, event_id: eventId ?? null, }).catch(() => {}); }, () => {}, // avslått/feilet → IP-fallback { enableHighAccuracy: false, timeout: 8000, maximumAge: 300000 }, ); } const LoginScreen = ({ onSuccess }) => { const [email, setEmail] = React.useState(''); const [password, setPassword] = React.useState(''); const [error, setError] = React.useState(null); const [loading, setLoading] = React.useState(false); // «Husk meg» (2026-09-05): AV som standard — på delte nettbrett skal tokenet // dø med fanen (sessionStorage). PÅ → localStorage (overlever restart). const [remember, setRemember] = React.useState(false); const submit = async (e) => { e.preventDefault(); setError(null); setLoading(true); try { const r = await window.api.login(email, password); window.AUTH.setSession(r.token, r.user, remember); shareLoginLocation(r.login_event_id); // best-effort, blokkerer ikke await window.AUTH.loadAllData(); onSuccess(); } catch (err) { setError(err.message); } finally { setLoading(false); } }; return (
G
Gassautomat
Admin · {window.APP_VERSION || ''}

Logg inn

{error && (
{error}
)}
setEmail(e.target.value)} />
setPassword(e.target.value)} />
Ikke på delte nettbrett. Uten «Husk meg» logges du ut når fanen lukkes — og alltid etter 8 timer uten aktivitet.
); }; Object.assign(window, { LoginScreen });