// ===== RIVAMAR Group — App raíz (v4, store persistente + edición inline) ===== const { useState, useEffect } = React; function App() { const state = useStore(); // estado global persistente const [view, setView] = useState('home'); const [prefill, setPrefill] = useState({}); const [adminAuthed, setAdminAuthed] = useState(false); const [editMode, setEditMode] = useState(false); useEffect(() => { try { trackVisit(); } catch (e) {} }, []); useReveal(view + (editMode ? '-e' : '')); // re-escanear reveals al navegar const go = (v, opts) => { setPrefill(opts || {}); setView(v); window.scrollTo({ top: 0, behavior: 'auto' }); }; // Setters al store const setReservas = (u) => storeSetKey('reservas', u); const setUsers = (u) => storeSetKey('users', u); const setGaleria = (u) => storeSetKey('galeria', u); const setCotizaciones = (u) => storeSetKey('cotizaciones', u); const onConfirm = (data) => { setReservas((prev) => [data, ...prev]); try { avisarTelefono(data); } catch (e) {} // Devolver la promesa de entrega al panel para que el formulario avise si falla. try { return pushToInbox('reserva', data); } catch (e) { return Promise.resolve({ ok: false }); } }; const onCotizar = (cot) => { setCotizaciones((prev) => [cot, ...(prev || [])]); try { pushToInbox('cotizacion', cot); } catch (e) {} }; // El panel admin recibe solicitudes de cualquier dispositivo (bandeja del servidor) useEffect(() => { if (!adminAuthed) return undefined; let stop = false; const tick = () => { if (!stop) { try { loadInbox(); } catch (e) {} } }; tick(); const iv = setInterval(tick, 20000); return () => { stop = true; clearInterval(iv); }; }, [adminAuthed]); // Edición inline: escribe una ruta del store ('site.hero_titulo', 'locales.0.nombre', …) const onEdit = (path, value) => storeSet((s) => { const seg = path.split('.')[0]; return { [seg]: setPath(s[seg], path.split('.').slice(1).join('.'), value) }; }); const edit = editMode && adminAuthed && view !== 'admin'; const ep = { edit, onEdit }; // props de edición para páginas públicas const logout = () => { setAdminAuthed(false); setEditMode(false); go('home'); }; const isAdmin = view === 'admin'; return (
{!isAdmin && } {!isAdmin && adminAuthed && }
{view === 'home' && } {view === 'galeria' && } {view === 'local' && } {view === 'nosotros' && } {view === 'exponor' && } {view === 'reservas' && } {view === 'convenios' && } {view === 'privacidad' && } {view === 'terminos' && } {view === 'admin' && ( setAdminAuthed(true)} onLogout={logout} reservas={state.reservas} setReservas={setReservas} users={state.users} setUsers={setUsers} galeria={state.galeria} setGaleria={setGaleria} cotizaciones={state.cotizaciones || []} setCotizaciones={setCotizaciones} content={state} setContent={storeSet} resetContent={storeReset} go={go} /> )}
{!isAdmin &&
); } ReactDOM.createRoot(document.getElementById('root')).render();