// ============================================ // Auth — login / account modal // Appears on page load (first visit). Mock auth via localStorage. // ============================================ const { useState: useSA, useEffect: useEA } = React; const Ia = window.MS_I; const AUTH_KEY = 'ms_user'; const SKIP_KEY = 'ms_auth_skipped'; function getStoredUser() { try { return JSON.parse(localStorage.getItem(AUTH_KEY)); } catch { return null; } } function AuthModal({ view: initView, onClose, onLogin }) { const [view, setView] = useSA(initView || 'home'); const [name, setName] = useSA(''); const [email, setEmail] = useSA(''); const [pass, setPass] = useSA(''); const [err, setErr] = useSA(''); useEA(() => { const onKey = e => { if (e.key === 'Escape') onClose(false); }; document.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, []); const skip = () => { localStorage.setItem(SKIP_KEY, '1'); onClose(false); }; // Derive a friendly first name from an email when one isn't provided // e.g. "ola.nordmann+marrakech@gmail.com" -> "Ola Nordmann" const nameFromEmail = (mail) => { if (!mail) return ''; const local = mail.split('@')[0].split('+')[0]; return local .replace(/[._\-]+/g, ' ') .split(' ').filter(Boolean) .map(w => w[0].toUpperCase() + w.slice(1).toLowerCase()) .join(' '); }; // Seed the profile from the auth event so the contact form is already filled const seedProfile = (user) => { try { const prev = JSON.parse(localStorage.getItem('ms_profile_data') || '{}'); localStorage.setItem('ms_profile_data', JSON.stringify({ ...prev, name: prev.name || user.name || '', email: prev.email || user.email || '', })); } catch {} }; const doLogin = () => { if (!email.trim()) { setErr('Skriv inn e-post'); return; } const user = { name: name || nameFromEmail(email) || email.split('@')[0], email: email.trim() }; localStorage.setItem(AUTH_KEY, JSON.stringify(user)); seedProfile(user); onLogin(user); onClose(true); }; const doRegister = () => { if (!name.trim() || !email.trim()) { setErr('Fyll inn navn og e-post'); return; } const user = { name: name.trim(), email: email.trim() }; localStorage.setItem(AUTH_KEY, JSON.stringify(user)); seedProfile(user); onLogin(user); onClose(true); }; const doGoogleMock = () => { // If the host page wants to inject a real Google email, it can set window.MS_Auth_Google_Email const gmail = window.MS_Auth_Google_Email || 'google@example.com'; const user = { name: nameFromEmail(gmail) || 'Google-bruker', email: gmail, google: true }; localStorage.setItem(AUTH_KEY, JSON.stringify(user)); seedProfile(user); onLogin(user); onClose(true); }; return (
Logg inn for å lagre reiseplanen din, se bestillinger og få personlig service.
{err}
}Ingen konto?
> )} {view === 'register' && ( <>Se reiseplanen din, bestillinger og mer.
{err}
}Har du konto?
> )}