95 lines
3.0 KiB
TypeScript
95 lines
3.0 KiB
TypeScript
"use client";
|
|
|
|
import { ThemeProvider } from "next-themes";
|
|
import { useState, useEffect } from "react";
|
|
import { Header } from "@/components/layout/Header";
|
|
import { Sidebar } from "@/components/layout/Sidebar";
|
|
import { InstallPWA } from "../ui/InstallPWA";
|
|
import { Toaster } from "@/components/ui/toaster";
|
|
import { usePathname } from "next/navigation";
|
|
import { registerServiceWorker } from "@/lib/registerSW";
|
|
import { NetworkStatus } from "../ui/NetworkStatus";
|
|
import { DebugWrapper } from "@/components/debug/DebugWrapper";
|
|
import { DebugProvider } from "@/contexts/DebugContext";
|
|
import type { KomgaLibrary, KomgaSeries } from "@/types/komga";
|
|
|
|
// Routes qui ne nécessitent pas d'authentification
|
|
const publicRoutes = ["/login", "/register"];
|
|
|
|
interface ClientLayoutProps {
|
|
children: React.ReactNode;
|
|
initialLibraries: KomgaLibrary[];
|
|
initialFavorites: KomgaSeries[];
|
|
userIsAdmin?: boolean;
|
|
}
|
|
|
|
export default function ClientLayout({ children, initialLibraries = [], initialFavorites = [], userIsAdmin = false }: ClientLayoutProps) {
|
|
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
|
|
const pathname = usePathname();
|
|
|
|
const handleCloseSidebar = () => {
|
|
setIsSidebarOpen(false);
|
|
};
|
|
|
|
const handleToggleSidebar = () => {
|
|
setIsSidebarOpen(!isSidebarOpen);
|
|
};
|
|
|
|
// Gestionnaire pour fermer la barre latérale lors d'un clic en dehors
|
|
useEffect(() => {
|
|
const handleClickOutside = (event: MouseEvent) => {
|
|
const sidebar = document.getElementById("sidebar");
|
|
const toggleButton = document.getElementById("sidebar-toggle");
|
|
|
|
if (
|
|
sidebar &&
|
|
!sidebar.contains(event.target as Node) &&
|
|
toggleButton &&
|
|
!toggleButton.contains(event.target as Node)
|
|
) {
|
|
handleCloseSidebar();
|
|
}
|
|
};
|
|
|
|
if (isSidebarOpen) {
|
|
document.addEventListener("mousedown", handleClickOutside);
|
|
}
|
|
|
|
return () => {
|
|
document.removeEventListener("mousedown", handleClickOutside);
|
|
};
|
|
}, [isSidebarOpen]);
|
|
|
|
useEffect(() => {
|
|
// Enregistrer le service worker
|
|
registerServiceWorker();
|
|
}, []);
|
|
|
|
// Ne pas afficher le header et la sidebar sur les routes publiques
|
|
const isPublicRoute = publicRoutes.includes(pathname);
|
|
|
|
return (
|
|
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
|
|
<DebugProvider>
|
|
<div className="relative min-h-screen h-full">
|
|
{!isPublicRoute && <Header onToggleSidebar={handleToggleSidebar} />}
|
|
{!isPublicRoute && (
|
|
<Sidebar
|
|
isOpen={isSidebarOpen}
|
|
onClose={handleCloseSidebar}
|
|
initialLibraries={initialLibraries}
|
|
initialFavorites={initialFavorites}
|
|
userIsAdmin={userIsAdmin}
|
|
/>
|
|
)}
|
|
<main className={`${!isPublicRoute ? "container pt-safe" : ""}`}>{children}</main>
|
|
<InstallPWA />
|
|
<Toaster />
|
|
<NetworkStatus />
|
|
<DebugWrapper />
|
|
</div>
|
|
</DebugProvider>
|
|
</ThemeProvider>
|
|
);
|
|
}
|