"use client"; import { BookGrid } from "./BookGrid"; import { Pagination } from "@/components/ui/Pagination"; import { useRouter, usePathname, useSearchParams } from "next/navigation"; import { useState, useEffect } from "react"; import { Loader2, Filter } from "lucide-react"; import { cn } from "@/lib/utils"; import { KomgaBook } from "@/types/komga"; interface PaginatedBookGridProps { books: KomgaBook[]; currentPage: number; totalPages: number; totalElements: number; pageSize: number; defaultShowOnlyUnread: boolean; showOnlyUnread: boolean; } export function PaginatedBookGrid({ books, currentPage, totalPages, totalElements, pageSize, defaultShowOnlyUnread, showOnlyUnread: initialShowOnlyUnread, }: PaginatedBookGridProps) { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const [isChangingPage, setIsChangingPage] = useState(false); const [showOnlyUnread, setShowOnlyUnread] = useState(initialShowOnlyUnread); // Réinitialiser l'état de chargement quand les tomes changent useEffect(() => { setIsChangingPage(false); }, [books]); // Mettre à jour l'état local quand la prop change useEffect(() => { setShowOnlyUnread(initialShowOnlyUnread); }, [initialShowOnlyUnread]); // Appliquer le filtre par défaut au chargement initial useEffect(() => { if (defaultShowOnlyUnread && !searchParams.has("unread")) { const params = new URLSearchParams(searchParams.toString()); params.set("page", "1"); params.set("unread", "true"); router.push(`${pathname}?${params.toString()}`); } }, [defaultShowOnlyUnread, pathname, router, searchParams]); const handlePageChange = async (page: number) => { setIsChangingPage(true); // Créer un nouvel objet URLSearchParams pour manipuler les paramètres const params = new URLSearchParams(searchParams.toString()); params.set("page", page.toString()); // Conserver l'état du filtre unread params.set("unread", showOnlyUnread.toString()); // Rediriger vers la nouvelle URL avec les paramètres mis à jour await router.push(`${pathname}?${params.toString()}`); }; const handleUnreadFilter = async () => { setIsChangingPage(true); const params = new URLSearchParams(searchParams.toString()); params.set("page", "1"); // Retourner à la première page lors du changement de filtre const newUnreadState = !showOnlyUnread; setShowOnlyUnread(newUnreadState); // Toujours définir explicitement le paramètre unread params.set("unread", newUnreadState.toString()); await router.push(`${pathname}?${params.toString()}`); }; const handleBookClick = (book: KomgaBook) => { router.push(`/books/${book.id}`); }; // Calcul des indices de début et de fin pour l'affichage const startIndex = (currentPage - 1) * pageSize + 1; const endIndex = Math.min(currentPage * pageSize, totalElements); return (

{totalElements > 0 ? ( <> Affichage des tomes {startIndex} à{" "} {endIndex} sur{" "} {totalElements} ) : ( "Aucun tome trouvé" )}

{/* Indicateur de chargement */} {isChangingPage && (
Chargement...
)} {/* Grille avec animation de transition */}

Page {currentPage} sur {totalPages}

); }