"use client" import type React from "react" import { useState, useEffect, useCallback } from "react" import { useRouter, usePathname } from "next/navigation" import Link from "next/link" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Shield, FileText, Folder, Users, Settings, Search, MessageCircle, Bell, User, LogOut, Menu, X, ChevronDown, ChevronRight, Home, Key, LayoutDashboard, TestTube, } from "@/lib/icons" import UserStore from "@/lib/4nk/UserStore" import { iframeUrl } from "../page" import EventBus from "@/lib/4nk/EventBus" export default function DashboardLayout({ children }: { children: React.ReactNode }) { const [processes, setProcesses] = useState(null) const [myProcesses, setMyProcesses] = useState([]) const [isConnected, setIsConnected] = useState(false) const [userPairingId, setUserPairingId] = useState(null) const [isAuthenticated, setIsAuthenticated] = useState(false) const [isAuthModalOpen, setIsAuthModalOpen] = useState(false) const [isLoading, setIsLoading] = useState(true) const [isMockMode, setIsMockMode] = useState(false) const [sidebarOpen, setSidebarOpen] = useState(false) const [userInfo, setUserInfo] = useState(null) const [showLogoutConfirm, setShowLogoutConfirm] = useState(false) const [isPrivateKeyFlash, setIsPrivateKeyFlash] = useState(false) const [currentFolderType, setCurrentFolderType] = useState(undefined) const router = useRouter() const pathname = usePathname() const navigation: Array<{ name: string; href: string; icon: any; type?: string }> = [ { name: "My work", href: "/dashboard", icon: LayoutDashboard }, { name: "Contrats", href: "/dashboard/folders?type=contracts", icon: Folder, type: "contracts" }, { name: "Rapports", href: "/dashboard/folders?type=reports", icon: Folder, type: "reports" }, { name: "Projets", href: "/dashboard/folders?type=projects", icon: Folder, type: "projects" }, { name: "Finance", href: "/dashboard/folders?type=finance", icon: Folder, type: "finance" }, { name: "RH", href: "/dashboard/folders?type=hr", icon: Folder, type: "hr" }, { name: "Marketing", href: "/dashboard/folders?type=marketing", icon: Folder, type: "marketing" }, { name: "Juridique", href: "/dashboard/folders?type=legal", icon: Folder, type: "legal" }, { name: "Général", href: "/dashboard/folders?type=general", icon: Folder, type: "general" }, ] // Appliquer le thème global dès le chargement (préférence stockée) useEffect(() => { try { const saved = typeof window !== 'undefined' ? localStorage.getItem('theme') : null const dark = saved ? saved === 'dark' : (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) if (typeof document !== 'undefined') { document.documentElement.classList.toggle('dark', !!dark) } } catch { } }, []) useEffect(() => { const connected = UserStore.getInstance().isConnected(); console.log('[Login] User connected:', connected); setIsConnected(connected); }, []); useEffect(() => { const pairingId = UserStore.getInstance().getUserPairingId(); console.log('[Login] User pairing ID:', pairingId); setUserPairingId(pairingId); }, []); useEffect(() => { const checkAuthentication = async () => { try { const userStore = UserStore.getInstance() const accessToken = userStore.getAccessToken() if (accessToken) { setIsAuthenticated(true) const pairingId = userStore.getUserPairingId() setUserInfo({ id: pairingId?.slice(0, 8) + "...", name: "Utilisateur 4NK", email: "user@4nk.io", role: "Utilisateur", company: "Organisation 4NK", }) } } catch (error) { console.error("Error checking authentication:", error) setIsAuthModalOpen(true) } finally { setIsLoading(false) } } checkAuthentication() }, [iframeUrl]) const handleAuthSuccess = () => { setIsAuthModalOpen(false) setIsAuthenticated(true) // Recharger la page pour récupérer les nouvelles données window.location.reload() } const handleLogout = useCallback(() => { UserStore.getInstance().disconnect(); setIsConnected(false); setProcesses(null); setMyProcesses([]); setUserPairingId(null); // Émettre un événement pour vider les messages locaux EventBus.getInstance().emit('CLEAR_CONSOLE'); setShowLogoutConfirm(true) }, []); // Stabilise la lecture de query params côté client pour éviter les décalages SSR/CSR useEffect(() => { if (typeof window !== "undefined") { const updateType = () => { const t = new URLSearchParams(window.location.search).get("type") || undefined setCurrentFolderType(t || undefined) } updateType() window.addEventListener("popstate", updateType) return () => window.removeEventListener("popstate", updateType) } }, [pathname]) useEffect(() => { const onPrivateKeyAccess = () => { setIsPrivateKeyFlash(true) setTimeout(() => setIsPrivateKeyFlash(false), 400) } if (typeof window !== "undefined") { window.addEventListener("private-key-access", onPrivateKeyAccess as EventListener) } return () => { if (typeof window !== "undefined") { window.removeEventListener("private-key-access", onPrivateKeyAccess as EventListener) } } }, []) // Suppression des retours conditionnels précoces pour stabiliser l'ordre des hooks return (
{/* Sidebar mobile overlay */} {sidebarOpen && (
setSidebarOpen(false)} />
)} {/* Sidebar */}
{/* Logo */}
DocV {isMockMode && ( Démo )}
{/* User info */} {userInfo && (
{userInfo.name.charAt(0)}

{userInfo.name}

{userInfo.company}

)} {/* Navigation */} {/* Footer */}
Sécurisé par 4NK
{isMockMode && (
Mode démonstration actif
)}
{/* Main content */}
{/* Top bar */}
{isMockMode && ( Mode Démo )}
{/* Page content */}
{children}
{/* Modal de confirmation de déconnexion */} {showLogoutConfirm && (

Déconnexion réussie

Vous avez été déconnecté de votre espace sécurisé DocV.

Vos données restent sécurisées par le chiffrement 4NK

)}
) }