From bfe2c5b7ff90656d2c5ab25424bcbeec47ae34ef Mon Sep 17 00:00:00 2001 From: Sadrinho27 Date: Wed, 5 Nov 2025 18:23:18 +0100 Subject: [PATCH] Imporved the dashboard to add the chat --- app/dashboard/layout.tsx | 298 +++++--------- app/dashboard/page.tsx | 682 ++++++++++++-------------------- components/4nk/FolderChat.tsx | 442 +++++++-------------- components/4nk/FolderModal.tsx | 8 +- components/ui/dropdown-menu.tsx | 214 ++++++++++ lib/contexts/FourNKContext.tsx | 208 ++++++++++ 6 files changed, 909 insertions(+), 943 deletions(-) create mode 100644 components/ui/dropdown-menu.tsx create mode 100644 lib/contexts/FourNKContext.tsx diff --git a/app/dashboard/layout.tsx b/app/dashboard/layout.tsx index da9856f..a1160de 100644 --- a/app/dashboard/layout.tsx +++ b/app/dashboard/layout.tsx @@ -1,58 +1,51 @@ "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 { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu" import { Shield, - FileText, - Folder, - Users, Settings, - Search, - MessageCircle, Bell, - User, LogOut, - Menu, - X, ChevronDown, - ChevronRight, Home, Key, - LayoutDashboard, TestTube, + User } from "@/lib/icons" import UserStore from "@/lib/4nk/UserStore" -import { iframeUrl } from "../page" import EventBus from "@/lib/4nk/EventBus" +import AuthModal from "@/components/4nk/AuthModal" +import Iframe from "@/components/4nk/Iframe" +import { iframeUrl } from "../page" +import { FourNKProvider } from "@/lib/contexts/FourNKContext"; 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 [show4nkAuthModal, setShow4nkAuthModal] = 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: "Dossier", href: "/dashboard/folders", icon: Folder }, - ] - // 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 @@ -65,13 +58,14 @@ export default function DashboardLayout({ children }: { children: React.ReactNod useEffect(() => { const connected = UserStore.getInstance().isConnected(); - console.log('[Login] User connected:', connected); setIsConnected(connected); + if (!connected) { + setShow4nkAuthModal(true); + } }, []); useEffect(() => { const pairingId = UserStore.getInstance().getUserPairingId(); - console.log('[Login] User pairing ID:', pairingId); setUserPairingId(pairingId); }, []); @@ -99,44 +93,27 @@ export default function DashboardLayout({ children }: { children: React.ReactNod 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 handle4nkConnect = useCallback(() => { + setIsConnected(true); + setShow4nkAuthModal(false); + }, []); + + const handle4nkClose = useCallback(() => { + if (!isConnected) return; + setShow4nkAuthModal(false); + }, [isConnected]); 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) @@ -152,28 +129,17 @@ export default function DashboardLayout({ children }: { children: React.ReactNod } }, []) - // Suppression des retours conditionnels précoces pour stabiliser l'ordre des hooks - return (
- {/* Sidebar mobile overlay */} - {sidebarOpen && ( -
-
setSidebarOpen(false)} - /> -
- )} - {/* Sidebar */} -
-
- {/* Logo */} -
+ {/* Main content (prend tout l'écran) */} +
+ + {/* --- TOP BAR (MODIFIÉE) --- */} +
+
+ + {/* Partie Gauche: Logo */}
DocV @@ -187,151 +153,68 @@ export default function DashboardLayout({ children }: { children: React.ReactNod )}
- -
- - {/* 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 */} -
-
-
- - -
- -
-
+ {/* Partie Droite: Icônes + Profil Utilisateur */}
- {isMockMode && ( - - - Mode Démo - - )} - - - - + + + + + + +

{userInfo?.name}

+

{userInfo?.company}

+
+ + + + Profil + + + + + Paramètres + + + + + + Déconnexion + +
+
-
- -
{/* Page content */} -
-
{children}
+
+ + {children} +
- {/* Modal de confirmation de déconnexion */} + {/* --- Modal de déconnexion --- */} {showLogoutConfirm && (
@@ -341,14 +224,12 @@ export default function DashboardLayout({ children }: { children: React.ReactNod

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

-
-

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

@@ -356,7 +237,18 @@ export default function DashboardLayout({ children }: { children: React.ReactNod
)} -
+ {/* --- Modals 4NK --- */} + {show4nkAuthModal && ( + + )} + + {isConnected &&