fix(Sidebar): not shown on public route

This commit is contained in:
Julien Froidefond
2025-02-13 13:15:39 +01:00
parent 358aad06a1
commit 7a79da017a
2 changed files with 78 additions and 81 deletions

View File

@@ -6,9 +6,26 @@ import { Header } from "@/components/layout/Header";
import { Sidebar } from "@/components/layout/Sidebar"; import { Sidebar } from "@/components/layout/Sidebar";
import { InstallPWA } from "../ui/InstallPWA"; import { InstallPWA } from "../ui/InstallPWA";
import { Toaster } from "@/components/ui/toaster"; import { Toaster } from "@/components/ui/toaster";
import { usePathname, useRouter } from "next/navigation";
import { authService } from "@/lib/services/auth.service";
// Routes qui ne nécessitent pas d'authentification
const publicRoutes = ["/login", "/register"];
export default function ClientLayout({ children }: { children: React.ReactNode }) { export default function ClientLayout({ children }: { children: React.ReactNode }) {
const [isSidebarOpen, setIsSidebarOpen] = useState(false); const [isSidebarOpen, setIsSidebarOpen] = useState(false);
const router = useRouter();
const pathname = usePathname();
// Vérification de l'authentification
useEffect(() => {
const isPublicRoute = publicRoutes.includes(pathname);
const isAuthenticated = authService.isAuthenticated();
if (!isAuthenticated && !isPublicRoute) {
router.push(`/login?from=${encodeURIComponent(pathname)}`);
}
}, [pathname, router]);
// 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(() => {
@@ -49,12 +66,15 @@ export default function ClientLayout({ children }: { children: React.ReactNode }
} }
}, []); }, []);
// Ne pas afficher le header et la sidebar sur les routes publiques
const isPublicRoute = publicRoutes.includes(pathname);
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">
<Header onToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)} /> {!isPublicRoute && <Header onToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)} />}
<Sidebar isOpen={isSidebarOpen} /> {!isPublicRoute && <Sidebar isOpen={isSidebarOpen} />}
<main className="container pt-4 md:pt-8">{children}</main> <main className={`${!isPublicRoute ? "container pt-4 md:pt-8" : ""}`}>{children}</main>
<InstallPWA /> <InstallPWA />
<Toaster /> <Toaster />
</div> </div>

View File

@@ -17,26 +17,10 @@ export function Sidebar({ isOpen }: SidebarProps) {
const [libraries, setLibraries] = useState<KomgaLibrary[]>([]); const [libraries, setLibraries] = useState<KomgaLibrary[]>([]);
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
const [isRefreshing, setIsRefreshing] = useState(false); const [isRefreshing, setIsRefreshing] = useState(false);
const [isAuthenticated, setIsAuthenticated] = useState(false);
// Initialiser l'authentification au montage du composant // Initialiser l'authentification au montage du composant
useEffect(() => {
const initAuth = () => {
const credentials = storageService.getCredentials();
const user = storageService.getUser();
console.log("Sidebar - Init Auth:", { hasCredentials: !!credentials, hasUser: !!user });
if (credentials && user) {
setIsAuthenticated(true);
return true;
}
return false;
};
initAuth();
}, []);
const fetchLibraries = useCallback(async () => { const fetchLibraries = useCallback(async () => {
if (!isAuthenticated) return;
setIsLoading(true); setIsLoading(true);
console.log("Sidebar - Fetching libraries..."); console.log("Sidebar - Fetching libraries...");
try { try {
@@ -54,11 +38,11 @@ export function Sidebar({ isOpen }: SidebarProps) {
setIsLoading(false); setIsLoading(false);
setIsRefreshing(false); setIsRefreshing(false);
} }
}, [isAuthenticated]); }, []);
useEffect(() => { useEffect(() => {
fetchLibraries(); fetchLibraries();
}, [isAuthenticated, pathname, fetchLibraries]); }, [pathname, fetchLibraries]);
const handleRefresh = async () => { const handleRefresh = async () => {
setIsRefreshing(true); setIsRefreshing(true);
@@ -68,8 +52,7 @@ export function Sidebar({ isOpen }: SidebarProps) {
const handleLogout = () => { const handleLogout = () => {
console.log("Sidebar - Logging out"); console.log("Sidebar - Logging out");
authService.logout(); authService.logout();
storageService.clearAll(); // Nettoyer tout le stockage storageService.clearAll();
setIsAuthenticated(false);
setLibraries([]); setLibraries([]);
router.push("/login"); router.push("/login");
}; };
@@ -112,8 +95,6 @@ export function Sidebar({ isOpen }: SidebarProps) {
</div> </div>
</div> </div>
{isAuthenticated && (
<>
<div className="px-3 py-2"> <div className="px-3 py-2">
<div className="space-y-1"> <div className="space-y-1">
<div className="mb-2 px-4 flex items-center justify-between"> <div className="mb-2 px-4 flex items-center justify-between">
@@ -164,11 +145,8 @@ export function Sidebar({ isOpen }: SidebarProps) {
</Link> </Link>
</div> </div>
</div> </div>
</>
)}
</div> </div>
{isAuthenticated && (
<div className="p-3 border-t border-border/40"> <div className="p-3 border-t border-border/40">
<button <button
onClick={handleLogout} onClick={handleLogout}
@@ -178,7 +156,6 @@ export function Sidebar({ isOpen }: SidebarProps) {
Se déconnecter Se déconnecter
</button> </button>
</div> </div>
)}
</aside> </aside>
); );
} }