# Debug Challenge HARD - Antwoordenblad (ALLEEN VOOR TIM) **⚠️ NIET DELEN MET STUDENTEN** --- ## Overzicht Dit project is aanzienlijk complexer dan de easy versie. Het bevat: - Blog met dynamische routes - Dashboard met statistieken - API route voor quotes - Utility functions - TypeScript types **12 fouten verspreid over 4 categorieën:** - Blokkerende fouten (compile/runtime) - Logische fouten (code draait maar werkt verkeerd) - Pattern fouten (React anti-patterns) - Styling fouten (inline styles + custom CSS → Tailwind) **Geschatte tijd: 2-3 uur met AI** --- ## CATEGORIE 1: BLOKKERENDE FOUTEN ### Fout 1: Missing dependency — `clsx` **Bestand:** `lib/utils.ts` (regel 2) **Symptoom:** ``` Module not found: Can't resolve 'clsx' ``` **Oorzaak:** `clsx` wordt geïmporteerd maar staat niet in package.json. `formatDate()` wordt overal gebruikt, dus dit blokkeert ALLES. **Fix:** ```bash npm install clsx ``` **Moeilijkheid:** ⭐ (makkelijk, zelfde als easy versie) --- ### Fout 2: Verkeerde import path — NextResponse **Bestand:** `app/api/quotes/route.ts` (regel 2) **Symptoom:** ``` Module not found: Can't resolve 'next/servers' ``` **Oorzaak:** `"next/servers"` moet `"next/server"` zijn (zonder s). **Fix:** ```ts // FOUT: import { NextResponse } from "next/servers"; // CORRECT: import { NextResponse } from "next/server"; ``` **Moeilijkheid:** ⭐⭐ (subtiel — 1 letter verschil) --- ## CATEGORIE 2: LOGISCHE FOUTEN ### Fout 3: Array.slice() met verkeerde parameters **Bestand:** `components/BlogPreview.tsx` (regel 7) **Symptoom:** BlogPreview sectie op homepage toont GEEN posts (lege grid) **Oorzaak:** `blogPosts.slice(-2, 0)` retourneert een lege array. `slice(-2, 0)` betekent: start bij index -2 (2e van achteren), stop bij index 0 — dat is leeg! **Fix:** ```ts // FOUT: const recentPosts = blogPosts.slice(-2, 0); // CORRECT: const recentPosts = blogPosts.slice(0, 2); ``` **Moeilijkheid:** ⭐⭐⭐ (geen error, gewoon lege output — student moet debuggen WAAROM) --- ### Fout 4: Icon mapping mist "star" entry **Bestand:** `app/dashboard/page.tsx` (regel 25-30) **Symptoom:** De "Rating" stat card toont geen icon (undefined rendered als leeg) **Oorzaak:** `getIcon()` functie heeft entries voor "users", "eye", "clock" maar NIET voor "star". De stats array bevat wel `icon: "star"`. **Fix:** ```ts function getIcon(iconName: string) { const icons: Record = { users: , eye: , clock: , star: , // ← TOEVOEGEN }; return icons[iconName]; } ``` **Moeilijkheid:** ⭐⭐⭐ (geen crash, subtiel visueel verschil) --- ### Fout 5: Mobile menu altijd verborgen **Bestand:** `components/Header.tsx` (regel 62 + 73) **Symptoom:** Hamburger menu knop is onzichtbaar, en zelfs als je `display: none` verwijdert van de button, is het dropdown menu ALSOOK `display: none`. **Oorzaak:** Twee problemen: 1. De hamburger button heeft `display: 'none'` → onzichtbaar 2. Het mobile menu div heeft `display: 'none'` → zelfs als `menuOpen` true is **Fix:** Dit moet volledig naar responsive Tailwind met `md:hidden`/`md:flex`: ```tsx // Button: verberg op desktop, toon op mobiel