"use client"; /** * TEE OFF SYSTEM INSTRUCTIONS - HERO SLIDER v2.4 * --------------------------------------------------------------------------- * REGEL 1: Kun baner med status 'aapen', 'aapner_snart', 'stenger_snart' * eller 'aapen_med_vintergreener' skal prioriteres. * REGEL 2: Baner med status 'nedlagt' eller 'under_utvikling' skal ALDRI vises. * REGEL 3: Baner med generiske bilder (inneholder 'standard') skal ALDRI vises. * REGEL 4: MANUELL EKSKLUDERING: Slugs i MANUAL_EXCLUSION_LIST skal aldri vises. * REGEL 5: Slideren skal vise nøyaktig 5 baner. * REGEL 6: Maks høyde er låst til 624px. Ingen badges. * REGEL 7: Typografi: Nedjustert fontstørrelse (4xl mobil / 7xl desktop) for eleganse. * REGEL 8: Utvalget skal være stabilt i én time (Hourly Seed) før det refreshes. * --------------------------------------------------------------------------- */ import { useState, useEffect, useMemo } from 'react'; import Link from 'next/link'; const MANUAL_EXCLUSION_LIST = [ 'alsten-golfklubb', 'askim-golfklubb', 'bergen-golfklubb', 'eidskog-golfklubb', 'eiker-golfklubb', 'floro-golfklubb', 'garder-golfklubb', 'hafjell-golfklubb', 'halden-golfklubb', 'haugesund-golfklubb', 'hinnoy-golfklubb', 'hitra-golfklubb', 'hurum-golfklubb', 'imjelt-pitch-putt', 'karmoy-golfklubb', 'kristiansund-og-omegn-golfklubb', 'lommedalen-golfklubb', 'laerdal-golfklubb', 'moa-golfsenter', 'modum-golfklubb', 'nes-golfklubb-09', 'nittedal-golfklubb', 'selbu-golfklubb', 'stryn-golfklubb', 'sunnfjord-golfklubb', 'tysnes-golfklubb', 'vanylven-golfklubb', 'vesteralen-golfklubb', 'vestlia-golf' ]; export default function HeroSlider({ facilities }: { facilities: any[] }) { const [currentIndex, setCurrentSlide] = useState(0); const sliderItems = useMemo(() => { if (!Array.isArray(facilities) || facilities.length === 0) return []; const preferredStatuses = ['aapen', 'aapner_snart', 'stenger_snart', 'aapen_med_vintergreener']; const forbiddenStatuses = ['nedlagt', 'under_utvikling']; const validCandidates = facilities.filter(f => { if (MANUAL_EXCLUSION_LIST.includes(f.slug)) return false; const img = f.image_url || ""; if (!img || img.toLowerCase().includes('standard') || img.length < 5) return false; const statuses = Array.isArray(f.course_statuses) ? f.course_statuses : []; const isForbidden = statuses.some((s: any) => forbiddenStatuses.includes((s.status || "").toLowerCase()) ); return !isForbidden; }); const highPriority = validCandidates.filter(f => { const statuses = Array.isArray(f.course_statuses) ? f.course_statuses : []; return statuses.some((s: any) => preferredStatuses.includes((s.status || "").toLowerCase())); }); const fallbackPool = validCandidates.filter(f => !highPriority.includes(f)); const now = new Date(); const hourlySeed = parseInt(`${now.getFullYear()}${now.getMonth()}${now.getDate()}${now.getHours()}`); const seededShuffle = (arr: any[]) => { return [...arr].sort((a, b) => ((a.id * hourlySeed) % 100) - ((b.id * hourlySeed) % 100)); }; let selection = seededShuffle(highPriority); if (selection.length < 5) { selection = [...selection, ...seededShuffle(fallbackPool)].slice(0, 5); } else { selection = selection.slice(0, 5); } return selection; }, [facilities]); useEffect(() => { if (sliderItems.length <= 1) return; const interval = setInterval(() => setCurrentSlide((p) => (p + 1) % sliderItems.length), 8000); return () => clearInterval(interval); }, [sliderItems.length]); if (sliderItems.length === 0) return null; return (
{sliderItems.map((f, i) => (
{f.name}
{/* FONT NEDJUSTERT FRA text-6xl md:text-9xl TIL text-4xl md:text-7xl */}

{f.name}

{f.county} {f.city}

))}
{sliderItems.map((_, i) => (
); }