// Holder styr på gjeldende side for navigasjonslogikk let currentPage = 'products'; // Lokal kopi av handlekurvantall for rask oppdatering uten model-kall let cartCount = 0; /** * Sentral renderingsfunksjon - alle UI-oppdateringer går gjennom denne * Bruker switch-pattern for å håndtere forskjellige visningstyper * data-parameter bruker default empty object for å unngå undefined errors */ function updateView(viewType, data = {}) { const app = document.getElementById('app'); switch (viewType) { case 'products': currentPage = 'products'; // Fallback til tom array hvis products er undefined - forhindrer krasj app.innerHTML = generateProductsPage(data.products || []); // Fester event listeners etter hver render fordi innerHTML erstatter alt attachEventListeners(); break; case 'product-detail': currentPage = 'product-detail'; app.innerHTML = generateProductDetailPage(data.product); attachEventListeners(); break; case 'cart': currentPage = 'cart'; // Flere fallbacks fordi handlekurvdata kan være incomplete app.innerHTML = generateCartPage(data.cartItems || [], data.total || 0, data.itemCount || 0); attachEventListeners(); break; case 'cart-count': // Spesiell case - oppdaterer kun handlekurvteller uten full re-render // Mer effektivt enn å regenerere hele siden cartCount = data.count; updateCartCountInNav(); break; case 'notification': // Brukernotifikasjoner håndteres separat fra hovedrendering showNotification(data.message); break; } } // Genererer navigasjonsbar som inkluderes på alle sider // Returnerer HTML-string istedenfor DOM-manipulering for konsistens function generateNavbar() { return `
`; } // Genererer komplett produktlisteside med navbar og produktrutenett // Bruker template literals for lesbar HTML-struktur function generateProductsPage(products) { return ` ${generateNavbar()}

Våre Produkter

${/* Mapper hvert produkt til HTML-kort og slår sammen til string */ products.map(product => createProductCard(product)).join('')}
`; } // Genererer produktdetaljside med error handling for ugyldig produkt // Håndterer both null/undefined produkter gracefully function generateProductDetailPage(product) { // Kritisk sjekk - håndterer tilfeller hvor bruker navigerer til ugyldig produkt-ID // Viser feilmelding istedenfor å krasje if (!product) { return ` ${generateNavbar()}

Produktet ble ikke funnet

`; } // Normal rendering med fullstendige produktdetaljer // Bruker semantic HTML og ARIA for tilgjengelighet return ` ${generateNavbar()}

${product.name}

kr ${product.price.toFixed(2)}

${product.description}

Kategori: ${product.category}

`; } // Genererer handlekurvside med kondisjonell rendering basert på innhold // Håndterer både tom og fylt handlekurv med forskjellige UI-elementer function generateCartPage(cartItems, total, itemCount) { // Ternary operator for å vise forskjellig innhold basert på handlekurvstatus // Tom handlekurv får eget design med oppfordring til handling const cartContent = cartItems.length === 0 ? `

Handlekurven din er tom

Legg til noen produkter for å komme i gang!

` : // Mapper hver handlekurvvare til HTML og slår sammen cartItems.map(item => createCartItem(item)).join(''); // Viser kun total og handlingsknapper hvis handlekurven har varer // Unngår forvirrende UI-elementer når handlekurven er tom const cartTotal = itemCount === 0 ? '' : ``; return ` ${generateNavbar()}

Handlekurv

${/* Viser kun sammendrag hvis det finnes varer - bedre UX */ itemCount > 0 ? `

${itemCount} ${itemCount === 1 ? 'vare' : 'varer'} i handlekurven

` : ''}
${cartContent}
${cartTotal}
`; } // Fester event listeners til navigasjonselementer etter hver rendering // Må kalles etter innerHTML fordi det erstatter alle eksisterende listeners function attachEventListeners() { const productsLink = document.querySelector('[data-page="products"]'); const cartLink = document.querySelector('[data-page="cart"]'); // Defensiv programming - sjekker at elementer eksisterer før listener-tilkobling // Forhindrer feil hvis HTML-struktur endres if (productsLink) { productsLink.addEventListener('click', function(e) { e.preventDefault(); // Forhindrer standard link-navigasjon navigateToProducts(); }); } if (cartLink) { cartLink.addEventListener('click', function(e) { e.preventDefault(); // Forhindrer standard link-navigasjon navigateToCart(); }); } } // Oppdaterer kun handlekurvtelleren uten full side-regenerering // Mer effektivt for hyppige oppdateringer som quantity-endringer function updateCartCountInNav() { const cartCountElement = document.getElementById('cart-count'); // Sikkerhetsjekk - elementet kan mangle hvis navbar ikke er rendret ennå if (cartCountElement) { cartCountElement.textContent = cartCount; } } // Removed dead code: showPage() and renderProducts() functions // These were remnants from old multi-page architecture function createProductCard(product) { return `

${product.name}

kr ${product.price.toFixed(2)}

${product.description}

`; } // Removed dead code: renderProductDetail() function // Replaced by generateProductDetailPage() in modern architecture // Removed dead code: renderCart() function // Replaced by generateCartPage() in modern architecture function createCartItem(item) { return `

${item.product.name}

${item.product.price.toFixed(2)} kr per stk

${item.quantity} ${item.quantity <= 1 ? 'Minimum antall er 1' : ''}
${(item.product.price * item.quantity).toFixed(2)} kr
`; } // Removed dead code: renderCartTotal() and updateCartCount() functions // Replaced by generateCartPage() and updateCartCountInNav() in modern architecture // Viser brukernotifikasjoner - bruker alert() for enkelhet i prototypefasen // I produksjon ville dette vært en toast-notifikasjon eller modal function showNotification(message) { alert(message); }