// ============================================ // 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 (
skip()}>
e.stopPropagation()}> {view === 'home' && ( <>
Marrakech Story

{window.MS_CTX?.useMS?.()?.lang === 'no' ? 'Velkommen til MarrakechStory' : window.MS_CTX?.useMS?.()?.lang === 'fr' ? 'Bienvenue chez MarrakechStory' : 'Welcome to MarrakechStory'}

Logg inn for å lagre reiseplanen din, se bestillinger og få personlig service.

eller
)} {view === 'login' && ( <>

Logg inn

setEmail(e.target.value)} placeholder="du@example.com" />
setPass(e.target.value)} placeholder="••••••••" />
{err &&

{err}

}

Ingen konto?

)} {view === 'register' && ( <>

Opprett konto

Se reiseplanen din, bestillinger og mer.

setName(e.target.value)} placeholder="Ditt navn" />
setEmail(e.target.value)} placeholder="du@example.com" />
setPass(e.target.value)} placeholder="Minst 8 tegn" />
{err &&

{err}

}

Har du konto?

)}
); } function AuthWidget({ user, onShowModal, onLogout, onOpenProfile }) { const [open, setOpen] = useSA(false); if (!user) { return ( ); } return (
{open && (
{user.name[0].toUpperCase()}
{user.name}
{user.email}
setOpen(false)} className="auth-menu-item"> Min reiseplan
)}
); } // Need to reference icons — use window.MS_I like other components const If2 = window.MS_I; function AuthSystem() { const [user, setUser] = useSA(getStoredUser); const [showModal, setShowModal] = useSA(false); const [modalView, setModalView] = useSA('home'); const [showProfile, setShowProfile] = useSA(false); useEA(() => { if (!user && !localStorage.getItem(SKIP_KEY)) { setShowModal(true); } }, []); const handleLogin = (u) => { setUser(u); setShowProfile(true); }; const handleLogout = () => { localStorage.removeItem(AUTH_KEY); setUser(null); setShowProfile(false); }; const openModal = (view = 'home') => { setModalView(view); setShowModal(true); }; // Expose prompt for form "Send min reise" window.MS_Auth_Prompt = (view) => openModal(view || 'register'); window.MS_Auth_User = user; window.MS_OpenProfile = () => user && setShowProfile(true); const ProfilePanel = window.MS_ProfilePanel; return ( <> openModal()} onLogout={handleLogout} onOpenProfile={() => setShowProfile(true)} /> {showModal && ( setShowModal(false)} /> )} {showProfile && user && ProfilePanel && ( setShowProfile(false)} /> )} ); } window.MS_AuthSystem = AuthSystem;