diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 968c27d..6a10d13 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,7 +3,6 @@ import { Inter } from "next/font/google"; import "@/styles/globals.css"; import { cn } from "@/lib/utils"; import ClientLayout from "@/components/layout/ClientLayout"; -import { NetworkProgressProvider } from "@/components/ui/network-progress"; const inter = Inter({ subsets: ["latin"] }); @@ -114,9 +113,7 @@ export default function RootLayout({ children }: { children: React.ReactNode }) /> - - {children} - + {children} ); diff --git a/src/components/home/HomeContent.tsx b/src/components/home/HomeContent.tsx index dca00d9..361aa2c 100644 --- a/src/components/home/HomeContent.tsx +++ b/src/components/home/HomeContent.tsx @@ -4,7 +4,6 @@ import { HeroSection } from "./HeroSection"; import { MediaRow } from "./MediaRow"; import { KomgaBook, KomgaSeries } from "@/types/komga"; import { useRouter } from "next/navigation"; -import { useNetworkRequest } from "@/lib/hooks/use-network-request"; interface HomeData { ongoing: KomgaSeries[]; @@ -18,14 +17,14 @@ interface HomeContentProps { export function HomeContent({ data }: HomeContentProps) { const router = useRouter(); - const { executeRequest } = useNetworkRequest(); const handleItemClick = async (item: KomgaSeries | KomgaBook) => { const path = "booksCount" in item ? `/series/${item.id}` : `/books/${item.id}`; + await router.push(path); + }; - await executeRequest(async () => { - router.push(path); - }); + const handleSeriesClick = (seriesId: string) => { + router.push(`/series/${seriesId}`); }; // Vérification des données pour le debug diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index 2d6642d..1b24e02 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -7,7 +7,6 @@ import { cn } from "@/lib/utils"; import { authService } from "@/lib/services/auth.service"; import { useEffect, useState, useCallback } from "react"; import { KomgaLibrary, KomgaSeries } from "@/types/komga"; -import { useNetworkRequest } from "@/lib/hooks/use-network-request"; interface SidebarProps { isOpen: boolean; @@ -17,7 +16,6 @@ interface SidebarProps { export function Sidebar({ isOpen, onClose }: SidebarProps) { const pathname = usePathname(); const router = useRouter(); - const { executeRequest } = useNetworkRequest(); const [libraries, setLibraries] = useState([]); const [favorites, setFavorites] = useState([]); const [isLoading, setIsLoading] = useState(true); @@ -112,11 +110,9 @@ export function Sidebar({ isOpen, onClose }: SidebarProps) { router.push("/login"); }; - const handleLinkClick = async (path: string) => { + const handleLinkClick = (path: string) => { onClose(); - await executeRequest(async () => { - router.push(path); - }); + router.push(path); }; const navigation = [ diff --git a/src/components/library/PaginatedSeriesGrid.tsx b/src/components/library/PaginatedSeriesGrid.tsx index 486b3c2..455d41c 100644 --- a/src/components/library/PaginatedSeriesGrid.tsx +++ b/src/components/library/PaginatedSeriesGrid.tsx @@ -6,7 +6,6 @@ import { useRouter, usePathname, useSearchParams } from "next/navigation"; import { useState, useEffect } from "react"; import { Loader2, Filter } from "lucide-react"; import { cn } from "@/lib/utils"; -import { useNetworkRequest } from "@/lib/hooks/use-network-request"; interface PaginatedSeriesGridProps { series: any[]; @@ -26,7 +25,6 @@ export function PaginatedSeriesGrid({ const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); - const { executeRequest } = useNetworkRequest(); const [isChangingPage, setIsChangingPage] = useState(false); const [showOnlyUnread, setShowOnlyUnread] = useState(searchParams.get("unread") === "true"); @@ -45,9 +43,7 @@ export function PaginatedSeriesGrid({ } // Rediriger vers la nouvelle URL avec les paramètres mis à jour - await executeRequest(async () => { - router.push(`${pathname}?${params.toString()}`); - }); + await router.push(`${pathname}?${params.toString()}`); }; const handleUnreadFilter = async () => { @@ -62,9 +58,11 @@ export function PaginatedSeriesGrid({ } setShowOnlyUnread(!showOnlyUnread); - await executeRequest(async () => { - router.push(`${pathname}?${params.toString()}`); - }); + await router.push(`${pathname}?${params.toString()}`); + }; + + const handleSeriesClick = (seriesId: string) => { + router.push(`/series/${seriesId}`); }; // Calcul des indices de début et de fin pour l'affichage diff --git a/src/components/series/PaginatedBookGrid.tsx b/src/components/series/PaginatedBookGrid.tsx index ea8fc17..1e1d333 100644 --- a/src/components/series/PaginatedBookGrid.tsx +++ b/src/components/series/PaginatedBookGrid.tsx @@ -7,7 +7,6 @@ import { useState, useEffect } from "react"; import { Loader2, Filter } from "lucide-react"; import { cn } from "@/lib/utils"; import { KomgaBook } from "@/types/komga"; -import { useNetworkRequest } from "@/lib/hooks/use-network-request"; interface PaginatedBookGridProps { books: KomgaBook[]; @@ -27,7 +26,6 @@ export function PaginatedBookGrid({ const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); - const { executeRequest } = useNetworkRequest(); const [isChangingPage, setIsChangingPage] = useState(false); const [showOnlyUnread, setShowOnlyUnread] = useState(searchParams.get("unread") === "true"); @@ -46,9 +44,7 @@ export function PaginatedBookGrid({ } // Rediriger vers la nouvelle URL avec les paramètres mis à jour - await executeRequest(async () => { - router.push(`${pathname}?${params.toString()}`); - }); + await router.push(`${pathname}?${params.toString()}`); }; const handleUnreadFilter = async () => { @@ -63,15 +59,11 @@ export function PaginatedBookGrid({ } setShowOnlyUnread(!showOnlyUnread); - await executeRequest(async () => { - router.push(`${pathname}?${params.toString()}`); - }); + await router.push(`${pathname}?${params.toString()}`); }; - const handleBookClick = async (book: KomgaBook) => { - await executeRequest(async () => { - router.push(`/books/${book.id}`); - }); + const handleBookClick = (book: KomgaBook) => { + router.push(`/books/${book.id}`); }; // Calcul des indices de début et de fin pour l'affichage diff --git a/src/components/ui/network-progress.tsx b/src/components/ui/network-progress.tsx deleted file mode 100644 index 07098c6..0000000 --- a/src/components/ui/network-progress.tsx +++ /dev/null @@ -1,83 +0,0 @@ -"use client"; - -import { createContext, useContext, useState, useCallback } from "react"; -import { Loader2 } from "lucide-react"; -import { cn } from "@/lib/utils"; - -interface NetworkProgressContextType { - startProgress: (requestId: string) => void; - updateProgress: (requestId: string, progress: number) => void; - completeProgress: (requestId: string) => void; -} - -const NetworkProgressContext = createContext(null); - -export function NetworkProgressProvider({ children }: { children: React.ReactNode }) { - const [activeRequests, setActiveRequests] = useState>({}); - - const startProgress = useCallback((requestId: string) => { - setActiveRequests((prev) => ({ ...prev, [requestId]: 0 })); - }, []); - - const updateProgress = useCallback((requestId: string, progress: number) => { - setActiveRequests((prev) => ({ ...prev, [requestId]: progress })); - }, []); - - const completeProgress = useCallback((requestId: string) => { - setActiveRequests((prev) => { - const newRequests = { ...prev }; - delete newRequests[requestId]; - return newRequests; - }); - }, []); - - const requestCount = Object.keys(activeRequests).length; - - return ( - - {children} - {requestCount > 0 && ( - <> - {/* Barre de progression en haut */} -
-
-
-
-
- - {/* Indicateur de chargement au centre */} -
-
- - Chargement -
-
- - )} - - ); -} - -export function useNetworkProgress() { - const context = useContext(NetworkProgressContext); - if (!context) { - throw new Error("useNetworkProgress must be used within a NetworkProgressProvider"); - } - return context; -} - -// Fonction utilitaire pour simuler une progression -export async function simulateProgress( - requestId: string, - updateFn: (requestId: string, progress: number) => void, - duration: number = 1000 -) { - const steps = 20; - const increment = 100 / steps; - const stepDuration = duration / steps; - - for (let i = 1; i <= steps; i++) { - await new Promise((resolve) => setTimeout(resolve, stepDuration)); - updateFn(requestId, Math.min(increment * i, 99)); - } -} diff --git a/src/lib/hooks/use-network-request.ts b/src/lib/hooks/use-network-request.ts deleted file mode 100644 index a63c9f0..0000000 --- a/src/lib/hooks/use-network-request.ts +++ /dev/null @@ -1,79 +0,0 @@ -"use client"; - -import { useNetworkProgress } from "@/components/ui/network-progress"; -import { useCallback, useRef, useEffect } from "react"; -import { usePathname, useSearchParams } from "next/navigation"; - -export function useNetworkRequest() { - const { startProgress, updateProgress, completeProgress } = useNetworkProgress(); - const pathname = usePathname(); - const searchParams = useSearchParams(); - const currentRequestId = useRef(null); - const abortControllerRef = useRef(null); - - useEffect(() => { - // Si on a un requestId en cours, c'est que la navigation est terminée - if (currentRequestId.current) { - updateProgress(currentRequestId.current, 100); - setTimeout(() => { - if (currentRequestId.current) { - completeProgress(currentRequestId.current); - currentRequestId.current = null; - } - }, 100); - } - - return () => { - if (abortControllerRef.current) { - abortControllerRef.current.abort(); - abortControllerRef.current = null; - } - }; - }, [pathname, searchParams, updateProgress, completeProgress]); - - const executeRequest = useCallback( - async (requestFn: () => Promise): Promise => { - if (!currentRequestId.current) { - currentRequestId.current = Math.random().toString(36).substring(7); - startProgress(currentRequestId.current); - abortControllerRef.current = new AbortController(); - } - - try { - const wrappedFn = async () => { - const originalFetch = window.fetch; - window.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { - if (!currentRequestId.current) return originalFetch(input, init); - - const response = await originalFetch(input, { - ...init, - signal: abortControllerRef.current?.signal, - }); - - return response; - }; - - try { - return await requestFn(); - } finally { - window.fetch = originalFetch; - } - }; - - return await wrappedFn(); - } catch (error) { - if (currentRequestId.current) { - completeProgress(currentRequestId.current); - currentRequestId.current = null; - } - if (abortControllerRef.current) { - abortControllerRef.current = null; - } - throw error; - } - }, - [startProgress, updateProgress, completeProgress] - ); - - return { executeRequest }; -}