"use client"; import { useSearchParams, useRouter } from "next/navigation"; import { useEffect, useState, Suspense } from "react"; import { libraryService } from "@/services/library"; import Link from "next/link"; import CoverImage from "@/components/CoverImage"; import { Play, ArrowLeft } from "lucide-react"; import Skeleton from "@/components/Skeleton"; function SectionContent() { const searchParams = useSearchParams(); const category = searchParams.get("category"); const router = useRouter(); // Full fetched items from backend const [allItems, setAllItems] = useState([]); // Items currently displayed (subset for infinite scroll) const [visibleItems, setVisibleItems] = useState([]); const [loading, setLoading] = useState(true); const [hasMore, setHasMore] = useState(true); const [page, setPage] = useState(1); const ITEMS_PER_PAGE = 20; useEffect(() => { if (!category) { setLoading(false); return; } setLoading(true); setPage(1); // Reset page when category changes setHasMore(true); // Reset hasMore when category changes setVisibleItems([]); // Clear visible items setAllItems([]); // Clear all items // Fetch live data from new endpoint fetch(`/api/browse/category?name=${encodeURIComponent(category)}`) .then(res => res.json()) .then(data => { if (Array.isArray(data)) { setAllItems(data); setVisibleItems(data.slice(0, ITEMS_PER_PAGE)); setHasMore(data.length > ITEMS_PER_PAGE); } else { setAllItems([]); setVisibleItems([]); setHasMore(false); } setLoading(false); }) .catch(err => { console.error("Error fetching section:", err); setLoading(false); setAllItems([]); setVisibleItems([]); setHasMore(false); }); }, [category]); // Load more function const loadMore = () => { if (!hasMore || loading) return; const nextLimit = (page + 1) * ITEMS_PER_PAGE; const nextItems = allItems.slice(0, nextLimit); setVisibleItems(nextItems); setPage(prev => prev + 1); if (nextLimit >= allItems.length) { setHasMore(false); } }; // Intersection Observer for infinite scroll trigger useEffect(() => { if (!hasMore || loading || allItems.length === 0) return; const observer = new IntersectionObserver((entries) => { if (entries[0].isIntersecting) { loadMore(); } }, { threshold: 0.1 }); const trigger = document.getElementById('scroll-trigger'); if (trigger) observer.observe(trigger); return () => observer.disconnect(); }, [hasMore, loading, page, allItems]); // Re-run when pagination state updates if (!category) { return (

No category specified.

); } return (
{/* Header */}

{category}

{loading && visibleItems.length === 0 ? (
{[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(i => (
))}
) : visibleItems.length > 0 ? ( <>
{visibleItems.map((playlist: any) => (

{playlist.title}

{playlist.description}

))}
{/* Scroll Trigger / Loading More Indicator */} {hasMore && (
)} ) : (

No items found in this category.

)}
); } export default function SectionPage() { return ( Loading...}> ); }