"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 */}
)
}
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 */}
{/* 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}
)}
)
}