feat: close sidebar on item clik

This commit is contained in:
Julien Froidefond
2025-02-14 13:37:19 +01:00
parent a3f8b011f3
commit 08f6e6a264
2 changed files with 22 additions and 4 deletions

View File

@@ -27,6 +27,14 @@ export default function ClientLayout({ children }: { children: React.ReactNode }
} }
}, [pathname, router]); }, [pathname, router]);
const handleCloseSidebar = () => {
setIsSidebarOpen(false);
};
const handleToggleSidebar = () => {
setIsSidebarOpen(!isSidebarOpen);
};
// Gestionnaire pour fermer la barre latérale lors d'un clic en dehors // Gestionnaire pour fermer la barre latérale lors d'un clic en dehors
useEffect(() => { useEffect(() => {
const handleClickOutside = (event: MouseEvent) => { const handleClickOutside = (event: MouseEvent) => {
@@ -39,7 +47,7 @@ export default function ClientLayout({ children }: { children: React.ReactNode }
toggleButton && toggleButton &&
!toggleButton.contains(event.target as Node) !toggleButton.contains(event.target as Node)
) { ) {
setIsSidebarOpen(false); handleCloseSidebar();
} }
}; };
@@ -72,8 +80,8 @@ export default function ClientLayout({ children }: { children: React.ReactNode }
return ( return (
<ThemeProvider attribute="class" defaultTheme="system" enableSystem> <ThemeProvider attribute="class" defaultTheme="system" enableSystem>
<div className="relative min-h-screen"> <div className="relative min-h-screen">
{!isPublicRoute && <Header onToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)} />} {!isPublicRoute && <Header onToggleSidebar={handleToggleSidebar} />}
{!isPublicRoute && <Sidebar isOpen={isSidebarOpen} />} {!isPublicRoute && <Sidebar isOpen={isSidebarOpen} onClose={handleCloseSidebar} />}
<main className={`${!isPublicRoute ? "container pt-4 md:pt-8" : ""}`}>{children}</main> <main className={`${!isPublicRoute ? "container pt-4 md:pt-8" : ""}`}>{children}</main>
<InstallPWA /> <InstallPWA />
<Toaster /> <Toaster />

View File

@@ -10,9 +10,10 @@ import { FavoriteService } from "@/lib/services/favorite.service";
interface SidebarProps { interface SidebarProps {
isOpen: boolean; isOpen: boolean;
onClose: () => void;
} }
export function Sidebar({ isOpen }: SidebarProps) { export function Sidebar({ isOpen, onClose }: SidebarProps) {
const pathname = usePathname(); const pathname = usePathname();
const router = useRouter(); const router = useRouter();
const [libraries, setLibraries] = useState<KomgaLibrary[]>([]); const [libraries, setLibraries] = useState<KomgaLibrary[]>([]);
@@ -101,9 +102,14 @@ export function Sidebar({ isOpen }: SidebarProps) {
storageService.clearAll(); storageService.clearAll();
setLibraries([]); setLibraries([]);
setFavorites([]); setFavorites([]);
onClose();
router.push("/login"); router.push("/login");
}; };
const handleLinkClick = () => {
onClose();
};
const navigation = [ const navigation = [
{ {
name: "Accueil", name: "Accueil",
@@ -130,6 +136,7 @@ export function Sidebar({ isOpen }: SidebarProps) {
<Link <Link
key={item.href} key={item.href}
href={item.href} href={item.href}
onClick={handleLinkClick}
className={cn( className={cn(
"flex items-center rounded-lg px-3 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground", "flex items-center rounded-lg px-3 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground",
pathname === item.href ? "bg-accent" : "transparent" pathname === item.href ? "bg-accent" : "transparent"
@@ -157,6 +164,7 @@ export function Sidebar({ isOpen }: SidebarProps) {
<Link <Link
key={series.id} key={series.id}
href={`/series/${series.id}`} href={`/series/${series.id}`}
onClick={handleLinkClick}
className={cn( className={cn(
"flex items-center rounded-lg px-3 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground", "flex items-center rounded-lg px-3 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground",
pathname === `/series/${series.id}` ? "bg-accent" : "transparent" pathname === `/series/${series.id}` ? "bg-accent" : "transparent"
@@ -192,6 +200,7 @@ export function Sidebar({ isOpen }: SidebarProps) {
<Link <Link
key={library.id} key={library.id}
href={`/libraries/${library.id}`} href={`/libraries/${library.id}`}
onClick={handleLinkClick}
className={cn( className={cn(
"flex items-center rounded-lg px-3 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground", "flex items-center rounded-lg px-3 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground",
pathname === `/libraries/${library.id}` ? "bg-accent" : "transparent" pathname === `/libraries/${library.id}` ? "bg-accent" : "transparent"
@@ -210,6 +219,7 @@ export function Sidebar({ isOpen }: SidebarProps) {
<h2 className="mb-2 px-4 text-lg font-semibold tracking-tight">Configuration</h2> <h2 className="mb-2 px-4 text-lg font-semibold tracking-tight">Configuration</h2>
<Link <Link
href="/settings" href="/settings"
onClick={handleLinkClick}
className={cn( className={cn(
"flex items-center rounded-lg px-3 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground", "flex items-center rounded-lg px-3 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground",
pathname === "/settings" ? "bg-accent" : "transparent" pathname === "/settings" ? "bg-accent" : "transparent"