// AUTH PAGE — mobile ready function AuthPage({ lang, onLogin, setPage }) { const [mode, setMode] = React.useState('login'); const [form, setForm] = React.useState({ name: '', email: '', password: '', confirm: '' }); const [error, setError] = React.useState(''); const [loading, setLoading] = React.useState(false); const t = lang === 'pt' ? { loginTitle: 'Bem-vindo de volta', registerTitle: 'Criar Conta', name: 'Nome completo', email: 'Email', password: 'Password', confirm: 'Confirmar Password', login: 'Entrar', register: 'Registar', errEmail: 'Email já registado.', errPass: 'Passwords não coincidem.', errFields: 'Preencha todos os campos.', errLogin: 'Email ou password incorretos.', adminHint: 'Admin: admin@dompapanca.pt / admin123' } : { loginTitle: 'Welcome back', registerTitle: 'Create Account', name: 'Full name', email: 'Email', password: 'Password', confirm: 'Confirm Password', login: 'Sign In', register: 'Register', errEmail: 'Email already registered.', errPass: 'Passwords do not match.', errFields: 'Please fill in all fields.', errLogin: 'Incorrect email or password.', adminHint: 'Admin: admin@dompapanca.pt / admin123' }; const set = (k, v) => { setForm(f => ({ ...f, [k]: v })); setError(''); }; const handleSubmit = (e) => { e.preventDefault(); setLoading(true); setTimeout(() => { const users = Store.getUsers(); if (mode === 'login') { const user = users.find(u => u.email === form.email && u.password === form.password); if (!user) { setError(t.errLogin); setLoading(false); return; } onLogin(user); setPage(user.role === 'admin' ? 'admin' : 'account'); } else { if (!form.name || !form.email || !form.password) { setError(t.errFields); setLoading(false); return; } if (form.password !== form.confirm) { setError(t.errPass); setLoading(false); return; } if (users.find(u => u.email === form.email)) { setError(t.errEmail); setLoading(false); return; } const newUser = { id: Store.nextId(users), name: form.name, email: form.email, password: form.password, role: 'user', createdAt: new Date().toISOString().split('T')[0] }; Store.saveUsers([...users, newUser]); onLogin(newUser); setPage('account'); } setLoading(false); }, 600); }; const lbl = { display: 'block', fontFamily: 'Lato, sans-serif', color: 'var(--muted)', fontSize: 10, letterSpacing: 2, textTransform: 'uppercase', marginBottom: 6 }; return (
Dom Papança
{/* Tab switcher */}
{[['login', t.login], ['register', t.register]].map(([k, v]) => ( ))}

{mode === 'login' ? t.loginTitle : t.registerTitle}

{mode === 'register' && (
set('name', e.target.value)} autoComplete="name" />
)}
set('email', e.target.value)} autoComplete="email" inputMode="email" />
set('password', e.target.value)} autoComplete={mode==='login'?'current-password':'new-password'} />
{mode === 'register' && (
set('confirm', e.target.value)} autoComplete="new-password" />
)} {error && (
{error}
)}
{loading ? '...' : (mode === 'login' ? t.login : t.register)}
{t.adminHint}
); } // ACCOUNT PAGE — mobile ready function AccountPage({ lang, session, setPage }) { const [tab, setTab] = React.useState('orders'); const orders = Store.getOrders().filter(o => o.userId === session.id).reverse(); const t = lang === 'pt' ? { title: 'A Minha Conta', orders: 'Encomendas', profile: 'Perfil', noOrders: 'Ainda não tem encomendas.', shopNow: 'Ir às Compras', statuses: { pending: 'Pendente', processing: 'Em Preparação', delivered: 'Entregue', cancelled: 'Cancelado' }, } : { title: 'My Account', orders: 'Orders', profile: 'Profile', noOrders: 'You have no orders yet.', shopNow: 'Go Shopping', statuses: { pending: 'Pending', processing: 'Processing', delivered: 'Delivered', cancelled: 'Cancelled' }, }; const statusColors = { pending: '#d4993a', processing: '#4a90d9', delivered: '#4a9a30', cancelled: '#c84040' }; return (
{/* Header */}
{session.name.charAt(0)}

{session.name}

{session.email}
{/* Tabs */}
{[['orders', t.orders], ['profile', t.profile]].map(([k, v]) => ( ))}
{tab === 'orders' && ( orders.length === 0 ? (
📦

{t.noOrders}

setPage('shop')}>{t.shopNow}
) : (
{orders.map(order => (
{lang==='pt'?'Encomenda':'Order'} #{order.id} {new Date(order.createdAt).toLocaleDateString(lang==='pt'?'pt-PT':'en-GB')}
{t.statuses[order.status]}
{order.items.map(item => ( {item.name} ×{item.qty} ))}
Total: {order.total.toFixed(2)}€
))}
) )} {tab === 'profile' && (
{[ [lang==='pt'?'Nome':'Name', session.name], ['Email', session.email], [lang==='pt'?'Membro desde':'Member since', session.createdAt], ['Role', session.role] ].map(([k, v]) => (
{k}
{v}
))}
)}
); } Object.assign(window, { AuthPage, AccountPage });