"use client" import { useState, useMemo, useCallback } from "react" // <-- useCallback ajouté import { useRouter } from "next/navigation" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Skeleton } from "@/components/ui/skeleton" import { MessageSquare } from "lucide-react" import { Folder, Search, FolderPlus, Clock, StickyNote, FileText, UploadCloud, X // <-- Ajout de X pour la notification } from "lucide-react" import { FolderData, FolderCreated, FolderPrivateFields, setDefaultFolderRoles } from "@/lib/4nk/models/FolderData" import MessageBus from "@/lib/4nk/MessageBus" import { iframeUrl } from "@/app/page" import FolderModal from "@/components/4nk/FolderModal" import FolderChat from "@/components/4nk/FolderChat" import { use4NK, EnrichedFolderData } from "@/lib/contexts/FourNKContext" // Fonction simple pour formater la taille des fichiers const formatBytes = (bytes: number, decimals = 2) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const dm = decimals < 0 ? 0 : decimals; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; } type FolderType = 'contrat' | 'projet' | 'rapport' | 'finance' | 'rh' | 'marketing' | 'autre'; function DashboardLoadingSkeleton() { return (
{/* Colonne 1: Squelette Liste */}
{[...Array(8)].map((_, i) => (
))}
{/* Colonne 2: Squelette Résumé */}

Chargement des données...

{/* Colonne 3: Squelette Chat */}

Chargement du chat...

) } export default function DashboardPage() { const [searchTerm, setSearchTerm] = useState("") const [folderType, setFolderType] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [notification, setNotification] = useState<{ type: "success" | "error" | "info"; message: string } | null>(null) const [selectedFolder, setSelectedFolder] = useState(null); const { isConnected, userPairingId, folders, loadingFolders, setFolderProcesses, setMyFolderProcesses, setFolderPrivateData } = use4NK(); const filteredFolders = folders.filter(folder => { const matchesSearch = folder.name.toLowerCase().includes(searchTerm.toLowerCase()) || folder.description.toLowerCase().includes(searchTerm.toLowerCase()) || folder.folderNumber.toLowerCase().includes(searchTerm.toLowerCase()) // On garde la recherche par ID return matchesSearch }) const showNotification = (type: "success" | "error" | "info", message: string) => { setNotification({ type, message }) setTimeout(() => setNotification(null), 5000) } const handleOpenModal = (type: FolderType) => { setFolderType(type); setIsModalOpen(true); }; const handleCloseModal = () => { setIsModalOpen(false); setFolderType(null); }; const handleSaveNewFolder = useCallback( (folderData: FolderData) => { if (!isConnected || !userPairingId) { showNotification("error", "Vous devez être connecté à 4NK pour créer un dossier"); return; } const roles = setDefaultFolderRoles(userPairingId); const folderPrivateFields = FolderPrivateFields; MessageBus.getInstance(iframeUrl) .createFolder(folderData, folderPrivateFields, roles) .then((_folderCreated: FolderCreated) => { const firstStateId = _folderCreated.process.states[0].state_id; MessageBus.getInstance(iframeUrl) .notifyProcessUpdate(_folderCreated.processId, firstStateId) .then(() => { const { processId, process } = _folderCreated; setFolderProcesses((prevProcesses: any) => ({ ...prevProcesses, [processId]: process })); setMyFolderProcesses((prevMyProcesses: string[]) => { if (prevMyProcesses.includes(processId)) return prevMyProcesses; return [...prevMyProcesses, processId]; }); setFolderPrivateData((prevData) => ({ ...prevData, [firstStateId]: folderData })); showNotification("success", "Dossier créé avec succès !"); handleCloseModal(); }); }) .catch((error: any) => { console.error('Erreur lors de la création du dossier:', error); showNotification("error", "Erreur lors de la création du dossier"); }); }, [isConnected, userPairingId, setFolderProcesses, setMyFolderProcesses, setFolderPrivateData] ); if (loadingFolders) { return ; } return (
{/* --- COLONNE 1: LISTE DES DOSSIERS (Largeur fixe) --- */}
{/* Header Colonne 1 */}

Dossiers

setSearchTerm(e.target.value)} className="pl-10 bg-gray-800 border-gray-700" />
{/* Liste scrollable */}
{loadingFolders ? (

Chargement...

) : filteredFolders.length === 0 ? (

Aucun dossier trouvé.

) : (
{filteredFolders.map((folder) => ( setSelectedFolder(folder)} >

{folder.name}

{/* ID du dossier supprimé */}
))}
)}
{/* --- COLONNE 2: RÉSUMÉ DU DOSSIER (Largeur fixe) --- */}
{!selectedFolder ? (

Sélectionnez un dossier pour voir le résumé

) : ( <> {/* Header Colonne 2 */}

{selectedFolder.name}

{selectedFolder.description}

{/* Badge ID supprimé */}
{/* Contenu Colonne 2 */}
Notes du dossier {selectedFolder.notes && selectedFolder.notes.length > 0 ? (
    {selectedFolder.notes.map((note, index) => (
  • {note}
  • ))}
) : (

Aucune note pour ce dossier.

)}
Fichiers {selectedFolder.files && selectedFolder.files.length > 0 ? (
{selectedFolder.files.map((file, index) => (

{file.name || 'Fichier'}

{formatBytes(file.size || 0)}

))}
) : (

Aucun fichier dans ce dossier.

)}
)}
{/* --- COLONNE 3: CHAT (flex-1) --- */}
{/* --- MODALS (hors layout) --- */} {isModalOpen && ( )} {notification && (
{notification.message}
)}
) }