/* global React, ReactDOM, Header, Hero, Home, Taller, Catalog, Modelo, Ficha, Clientes, Cursos, Showroom, Wishlist, Modal, useUI, TweaksPanel, useTweaks, TweakSection, TweakRadio, TweakToggle, TweakColor, TweakSelect */ const { useState, useEffect } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "hero": "A", "accent": "#C13B1F", "density": "normal", "card": "minimal", "prices": true, "view": "desktop" }/*EDITMODE-END*/; function App() { // route: { page, params } const [route, setRouteRaw] = useState({ page: "home", params: {} }); const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const ui = useUI(); // Cada cambio de ruta pushea estado al historial del navegador const setRoute = (newRoute, replace = false) => { setRouteRaw(newRoute); if (replace) { window.history.replaceState(newRoute, ""); } else { window.history.pushState(newRoute, ""); } }; // Escucha el botón atrás del navegador useEffect(() => { // Reemplaza el estado inicial para que el primer atrás no saque del sitio window.history.replaceState({ page: "home", params: {} }, ""); const onPop = (e) => { if (e.state && e.state.page) { setRouteRaw(e.state); } else { setRouteRaw({ page: "home", params: {} }); } }; window.addEventListener("popstate", onPop); return () => window.removeEventListener("popstate", onPop); }, []); const setPage = (page, params = {}) => setRoute({ page, params }); const openCatalog = (initialFilter = {}) => setRoute({ page: "catalog", params: { filter: initialFilter } }); const openCategoria = (cat) => openCatalog({ cat }); const openModelo = (modeloName) => setRoute({ page: "modelo", params: { modelo: modeloName } }); const openFicha = (productOrId) => { const id = typeof productOrId === "string" ? productOrId : (productOrId && productOrId.id); if (!id) return; setRoute({ page: "ficha", params: { productId: id } }); }; useEffect(() => { document.documentElement.style.setProperty("--accent", t.accent); }, [t.accent]); useEffect(() => { if (t.view === "mobile") { const el = document.querySelector(".phone-scroll"); if (el) el.scrollTo({ top: 0, behavior: "instant" }); } else { window.scrollTo({ top: 0, behavior: "instant" }); } }, [route.page, route.params, t.view]); // Hero variant determines if header should be dark over the home page const headerDark = (route.page === "home" && t.hero === "A") || route.page === "taller" || route.page === "modelo" || route.page === "showroom"; const densityCls = t.density === "compact" ? "dens-compact" : t.density === "airy" ? "dens-airy" : ""; const viewMobile = t.view === "mobile"; const openProductModal = (p) => ui.openModal(p); // Expose route handlers globally so Home cards, Modal "Ver ficha", etc. can call them useEffect(() => { window.__davasRoute = { openCatalog, openCategoria, openModelo, openFicha, setPage }; }, [route]); const renderPage = () => { switch (route.page) { case "home": return ( <> setPage(p === "home" ? "catalog" : p)} openProduct={openProductModal} /> setPage(p)} showPrices={t.prices} cardStyle={t.card} /> ); case "taller": return ; case "catalog": return ; case "modelo": return setPage("catalog")} />; case "ficha": return setPage("catalog")} />; case "clientes": return setPage("catalog")} />; case "cursos": return ; case "showroom": return ; default: return null; } }; const PageContent = ( <>
setPage(p)} dark={headerDark} mobile={viewMobile} /> {renderPage()} ); return (
{viewMobile ? ( <>
DAVA'S · MOBILE PREVIEW · {route.page.toUpperCase()}
{PageContent}
) : ( PageContent )} { if (v === "modelo") openModelo("Pavo Real"); else if (v === "ficha") openFicha("ME-003"); else setPage(v); }} /> setTweak("hero", v)} /> setTweak("accent", v)} /> setTweak("density", v)} /> setTweak("view", v)} /> setTweak("card", v)} /> setTweak("prices", v)} />
); } const root = ReactDOM.createRoot(document.getElementById("root")); root.render();