// App-skall: hash-ruting (fungerer på ren statisk hosting uten rewrites), // lys header (Kirby-tvilling) og handlevogn-skuff. Rot-ruten redirigerer til // #/domener – domenesøket er butikkens inngang (forsiden bor i domains.jsx). // Monterer først når alle globals fra de andre filene finnes. import React, { useState, useEffect } from 'react'; import { createRoot } from 'react-dom/client'; const NS = window.STWORDER; function useHashRoute() { const [route, setRoute] = useState(() => location.hash.replace(/^#\/?/, '')); useEffect(() => { const onChange = () => { setRoute(location.hash.replace(/^#\/?/, '')); window.scrollTo(0, 0); }; window.addEventListener('hashchange', onChange); return () => window.removeEventListener('hashchange', onChange); }, []); return route; } function App() { const route = useHashRoute(); const [cartOpen, setCartOpen] = useState(false); const { StagingBanner, Header, CartDrawer, CheckoutToast } = NS.ui; useEffect(() => NS.bus.on('cart:open', () => setCartOpen(true)), []); // Lukk skuffen ved navigasjon – ellers blokkerer overlayet den nye siden. useEffect(() => { setCartOpen(false); }, [route]); // Rot-ruten er domenesøket: normaliser #/ til #/domener (replace, ikke push, // så tilbakeknappen ikke havner i en redirect-løkke) – delbare lenker og // header-markeringen peker dermed på den faktiske ruten. useEffect(() => { if (route === '' || route === '/') location.replace('#/domener'); }, [route]); let page; if (route === '' || route === '/' || route.startsWith('domener')) page = ; else if (route.startsWith('hosting')) page = ; else if (route.startsWith('vps')) page = ; else if (route.startsWith('kasse')) page = ; else if (route.startsWith('kvittering')) page = ; else page = ; const routeKey = route.split('/')[0] || 'domener'; return ( <>
setCartOpen(true)} />
{page}
setCartOpen(false)} /> ); } // Vent til alle filer har registrert seg på window.STWORDER før montering. function ready() { return !!( NS.ui && NS.data && NS.api && NS.store && NS.i18n && NS.flows && NS.flows.Domains && NS.flows.Hosting && NS.flows.Vps && NS.flows.LiveSearch && NS.pages && NS.pages.Checkout && NS.pages.Receipt ); } function mountWhenReady() { if (ready()) { createRoot(document.getElementById('root')).render(); } else { setTimeout(mountWhenReady, 25); } } mountWhenReady();