/* App shell — routing + footer + global providers */ const { useState: useStateA, useEffect: useEffectA } = React; const APP_ROUTES = ['home', 'eventos', 'marketplace', 'conteudos', 'pricing', 'sobre', 'entrar', 'criar-experiencia', 'dashboard']; const getRouteFromLocation = () => { if (typeof window === 'undefined') return 'home'; const params = new URLSearchParams(window.location.search); const fromQuery = params.get('page'); const fromHash = window.location.hash.replace(/^#\/?/, ''); const candidate = fromQuery || fromHash || 'home'; return APP_ROUTES.includes(candidate) ? candidate : 'home'; }; const syncRouteToUrl = (page) => { if (typeof window === 'undefined' || !window.history?.pushState) return; const url = new URL(window.location.href); if (page === 'home') url.searchParams.delete('page'); else url.searchParams.set('page', page); url.hash = ''; window.history.pushState({ page }, '', url.toString()); }; const Footer = ({ onNav }) => ( ); const AuthGuard = ({ onNav, children }) => { const auth = window.useAuth ? window.useAuth() : null; const user = auth?.user || null; useEffectA(() => { if (!user) onNav('entrar'); }, [user]); if (!user) return null; return children; }; const PageRouter = ({ page, onNav }) => { const HP = window.HomePage; const EP = window.EventsPage; const CP = window.ContentPage; const PP = window.PricingPage; const AP = window.AboutPage; const DP = window.DashboardPage; const MKP = window.MarketplacePage; const CEP = window.CriarExperienciaPage; const ENT = window.EntrarPage; const IB = window.HexisInsightBar; const pageEl = (() => { if (page === 'home' && HP) return ; if (page === 'eventos' && EP) return ; if (page === 'marketplace' && MKP) return ; if (page === 'conteudos' && CP) return ; if (page === 'pricing' && PP) return ; if (page === 'sobre' && AP) return ; if (page === 'entrar' && ENT) return ; if (page === 'criar-experiencia' && CEP) return ; if (page === 'dashboard' && DP) return ( ); return null; })(); return ( <> {IB && page !== 'entrar' && React.createElement(IB, { page })} {pageEl} ); }; const App = () => { const [page, setPage] = useStateA(getRouteFromLocation); const onNav = (p, opts = {}) => { const next = APP_ROUTES.includes(p) ? p : 'home'; setPage(next); if (!opts.replaceUrl) syncRouteToUrl(next); if (window.HexisEngine) HexisEngine.trackClick(`nav_${next}`); }; window._appNav = onNav; // exposed for HexisPopup suggestion routing useEffectA(() => { const handler = () => setPage(getRouteFromLocation()); window.addEventListener('popstate', handler); return () => window.removeEventListener('popstate', handler); }, []); useEffectA(() => { window.scrollTo({ top: 0, behavior: 'instant' }); }, [page]); /* Track page changes in HexisEngine */ useEffectA(() => { if (window.HexisEngine) HexisEngine.trackPage(page); if (window.MarcianusAPI) MarcianusAPI.track({ action: 'page_view', category: 'navigation', label: page }); }, [page]); /* Keyboard shortcut Ctrl+K */ useEffectA(() => { const handler = (e) => { if ((e.metaKey || e.ctrlKey) && e.key === 'k') { e.preventDefault(); HexisStore.open(); } }; window.addEventListener('keydown', handler); return () => window.removeEventListener('keydown', handler); }, []); const showFooter = !['entrar', 'criar-experiencia'].includes(page); const showHexis = page !== 'entrar'; const AP = window.AuthProvider; if (!AP) return
A carregar…
; return (
{showFooter &&