"use client"; import Image from "next/image"; import Link from "next/link"; import { useEffect, useMemo, useState } from "react"; 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", ]; const GOOD_STATUSES = ["aapen", "aapner_snart", "stenger_snart", "aapen_med_vintergreener"]; const BAD_STATUSES = ["nedlagt", "under_utvikling"]; type CourseStatus = { status?: string; }; type Facility = { id: number; slug: string; name: string; image_url?: string | null; course_statuses?: CourseStatus[] | null; }; export default function HeroSlider({ facilities }: { facilities: Facility[] }) { const [currentIndex, setCurrentIndex] = useState(0); const sliderItems = useMemo(() => { if (!Array.isArray(facilities) || facilities.length === 0) return []; const validFacilities = facilities.filter((facility) => { if (MANUAL_EXCLUSION_LIST.includes(facility.slug)) return false; const image = String(facility.image_url || "").toLowerCase(); if (!image || image.includes("standard")) return false; const statuses = Array.isArray(facility.course_statuses) ? facility.course_statuses : []; const hasForbiddenStatus = statuses.some((status) => BAD_STATUSES.includes(String(status?.status || "").toLowerCase()) ); return !hasForbiddenStatus; }); const priority = validFacilities.filter((facility) => { const statuses = Array.isArray(facility.course_statuses) ? facility.course_statuses : []; return statuses.some((status) => GOOD_STATUSES.includes(String(status?.status || "").toLowerCase())); }); const fallback = validFacilities.filter((facility) => !priority.includes(facility)); const now = new Date(); const seed = Number(`${now.getFullYear()}${now.getMonth()}${now.getDate()}${now.getHours()}`); const seededShuffle = (items: Facility[]) => [...items].sort((a, b) => ((a.id * seed) % 101) - ((b.id * seed) % 101)); const selected = [...seededShuffle(priority), ...seededShuffle(fallback)].slice(0, 5); return selected; }, [facilities]); useEffect(() => { if (sliderItems.length <= 1) return; const interval = setInterval(() => { setCurrentIndex((previous) => (previous + 1) % sliderItems.length); }, 8000); return () => clearInterval(interval); }, [sliderItems.length]); if (sliderItems.length === 0) return null; return (
{sliderItems.map((facility, index) => (
{facility.name}
))}

TeeOff.no gir deg komplett oversikt over ALLE norske golfbaner!

{sliderItems[currentIndex].name}
{sliderItems.map((_, index) => (
); }