'use client' import { useState, useCallback } from 'react' import { usePathname, useRouter, useSearchParams } from 'next/navigation' import { cn } from '@/lib/utils' import { StickyNote, Plus, Tag as TagIcon, Folder, Briefcase, FileText, Zap, BarChart3, Globe, Sparkles, Book, Heart, Crown, Music, Building2, LucideIcon } from 'lucide-react' import { useNotebooks } from '@/context/notebooks-context' import { useNotebookDrag } from '@/context/notebook-drag-context' import { Button } from '@/components/ui/button' import { CreateNotebookDialog } from './create-notebook-dialog' import { NotebookActions } from './notebook-actions' import { DeleteNotebookDialog } from './delete-notebook-dialog' import { EditNotebookDialog } from './edit-notebook-dialog' import { NotebookSummaryDialog } from './notebook-summary-dialog' import { CreateLabelDialog } from './create-label-dialog' import { useLanguage } from '@/lib/i18n' // Map icon names to lucide-react components const ICON_MAP: Record = { 'folder': Folder, 'briefcase': Briefcase, 'document': FileText, 'lightning': Zap, 'chart': BarChart3, 'globe': Globe, 'sparkle': Sparkles, 'book': Book, 'heart': Heart, 'crown': Crown, 'music': Music, 'building': Building2, } // Function to get icon component by name const getNotebookIcon = (iconName: string) => { const IconComponent = ICON_MAP[iconName] || Folder return IconComponent } export function NotebooksList() { const pathname = usePathname() const searchParams = useSearchParams() const router = useRouter() const { t } = useLanguage() const { notebooks, currentNotebook, deleteNotebook, moveNoteToNotebookOptimistic, isLoading } = useNotebooks() const { draggedNoteId, dragOverNotebookId, dragOver } = useNotebookDrag() const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false) const [editingNotebook, setEditingNotebook] = useState(null) const [deletingNotebook, setDeletingNotebook] = useState(null) const [summaryNotebook, setSummaryNotebook] = useState(null) // NEW: Summary dialog state (IA6) const currentNotebookId = searchParams.get('notebook') // Handle drop on a notebook const handleDrop = useCallback(async (e: React.DragEvent, notebookId: string | null) => { e.preventDefault() e.stopPropagation() // Prevent triggering notebook click const noteId = e.dataTransfer.getData('text/plain') if (noteId) { await moveNoteToNotebookOptimistic(noteId, notebookId) router.refresh() // Refresh the page to show the moved note } dragOver(null) }, [moveNoteToNotebookOptimistic, dragOver, router]) // Handle drag over a notebook const handleDragOver = useCallback((e: React.DragEvent, notebookId: string | null) => { e.preventDefault() dragOver(notebookId) }, [dragOver]) // Handle drag leave const handleDragLeave = useCallback(() => { dragOver(null) }, [dragOver]) const handleSelectNotebook = (notebookId: string | null) => { const params = new URLSearchParams(searchParams) if (notebookId) { params.set('notebook', notebookId) } else { params.delete('notebook') } // Clear other filters params.delete('labels') params.delete('search') router.push(`/?${params.toString()}`) } if (isLoading) { return (
{t('nav.notebooks')}
{t('common.loading')}
) } return ( <> {/* Notebooks Section */}
{/* Section Header */}
{t('nav.notebooks')}
{/* "Notes générales" (Inbox) */} {/* Notebooks List */} {notebooks.map((notebook: any) => { const isActive = currentNotebookId === notebook.id const isDragOver = dragOverNotebookId === notebook.id // Get the icon component const NotebookIcon = getNotebookIcon(notebook.icon || 'folder') return (
{/* Actions (visible on hover) */} setEditingNotebook(notebook)} onDelete={() => setDeletingNotebook(notebook)} onSummary={() => setSummaryNotebook(notebook)} // NEW: Summary action (IA6) />
) })}
{/* Create Notebook Dialog */} {/* Edit Notebook Dialog */} {editingNotebook && ( { if (!open) setEditingNotebook(null) }} /> )} {/* Delete Confirmation Dialog */} {deletingNotebook && ( { if (!open) setDeletingNotebook(null) }} /> )} {/* Notebook Summary Dialog (IA6) */} { if (!open) setSummaryNotebook(null) }} notebookId={summaryNotebook?.id} notebookName={summaryNotebook?.name} /> ) }