// 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 (
{/* Tab switcher */}
{[['login', t.login], ['register', t.register]].map(([k, v]) => (
))}
{mode === 'login' ? t.loginTitle : t.registerTitle}
{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]) => (
))}
)}
);
}
Object.assign(window, { AuthPage, AccountPage });