/* ============================================================ APP · raíz (público + admin) y navegación ============================================================ */ function TopBar({ brand, cartas, activeCarta, onCarta, onHome, onInfo, onReserve }) { const [open, setOpen] = useState(false); const pick = (fn) => { fn(); setOpen(false); window.scrollTo({top:0}); }; return (
{brand.name}
{brand.tagline}
{brand.reservationsOn && }
{open && ( <>
setOpen(false)} />
Cartas
{cartas.map(c => ( ))}
{brand.reservationsOn && }
)}
); } function PublicShell({ onAdmin }) { const { data } = useStore(); const { brand, cartas } = data; const [cartaId, setCartaId] = useState(null); // null = portada const [info, setInfo] = useState(false); const [reserva, setReserva] = useState(false); const [legal, setLegal] = useState(null); const carta = cartas.find(c => c.id === cartaId); return (
{setCartaId(id);window.scrollTo({top:0});}} onHome={()=>{setCartaId(null);window.scrollTo({top:0});}} onInfo={()=>setInfo(true)} onReserve={()=>setReserva(true)} /> {carta ? : {setCartaId(id);window.scrollTo({top:0});}} />}
{brand.website} · 2007 - 2026 · 19 años en Chile
{info && setInfo(false)} onReserve={()=>{setInfo(false);setReserva(true);}} />} {reserva && setReserva(false)} />} {legal && setLegal(null)} />}
); } function AdminShell({ onExit }) { const store = useStore(); const newRsv = (store.data.reservations||[]).filter(r=>r.status==='nueva').length; const ALLNAV = [ {k:'contenido', l:'Contenido', icon:'book'}, {k:'reservas', l:'Reservas', icon:'calendar', badge:newRsv}, {k:'dashboard', l:'Dashboard', icon:'chart'}, {k:'usuarios', l:'Usuarios', icon:'users'}, {k:'restaurante', l:'Restaurante', icon:'gear'}, ]; const NAV = ALLNAV.filter(n => store.can(n.k)); const [view, setView] = useState(NAV[0]?.k || 'contenido'); const roleLabel = store.currentUser ? (store.ROLES[store.currentUser.role]||{}).label : ''; return (
{store.data.brand.name} Admin
{store.syncing ? <> Guardando… : (store.online===true ? '● En línea' : '○ Local')} {store.currentUser?.name}{roleLabel}
{view==='contenido' && store.can('contenido') && } {view==='reservas' && store.can('reservas') && } {view==='dashboard' && store.can('dashboard') && } {view==='usuarios' && store.can('usuarios') && } {view==='restaurante' && store.can('restaurante') && }
); } function App() { const store = useStore(); const [mode, setMode] = useState('public'); // public | login | admin if (store.admin && mode !== 'public') return setMode('public')} />; if (mode === 'login') return setMode('public')} />; return setMode(store.admin ? 'admin' : 'login')} />; } function Root() { return ( ); } ReactDOM.createRoot(document.getElementById('root')).render();