/* 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 && }
{window.BottomNav && React.createElement(window.BottomNav, { page, onNav })}
{showHexis && <>>}
);
};
ReactDOM.createRoot(document.getElementById('root')).render();