import React from 'react' import { knowledgeGroupService } from '../../services/knowledgeGroupService' import { KnowledgeGroup, UpdateGroupData, CreateGroupData } from '../../types' import { Plus, Book, MoreVertical, Library, MessageSquare, Trash2, Edit2, FolderInput } from 'lucide-react' import { motion, AnimatePresence } from 'framer-motion' import { NotebookDetailView } from './NotebookDetailView' import { CreateNotebookDrawer } from '../CreateNotebookDrawer' import { EditNotebookDrawer } from '../EditNotebookDrawer' import { ImportFolderDrawer } from '../ImportFolderDrawer' import { useLanguage } from '../../contexts/LanguageContext' import { useToast } from '../../contexts/ToastContext' import { useConfirm } from '../../contexts/ConfirmContext' interface NotebooksViewProps { authToken: string onChatWithContext: (context: { selectedGroups?: string[], selectedFiles?: string[] }) => void isAdmin?: boolean } export const NotebooksView: React.FC = ({ authToken, onChatWithContext, isAdmin = false }) => { const { t } = useLanguage() const { showError } = useToast() const { confirm } = useConfirm() const [notebooks, setNotebooks] = React.useState([]) const [isLoading, setIsLoading] = React.useState(true) const [selectedNotebook, setSelectedNotebook] = React.useState(null) const [isCreateDrawerOpen, setIsCreateDrawerOpen] = React.useState(false) const [isImportDrawerOpen, setIsImportDrawerOpen] = React.useState(false) const [editingNotebook, setEditingNotebook] = React.useState(null) const fetchNotebooks = async () => { try { const groups = await knowledgeGroupService.getGroups() setNotebooks(groups) } catch (error) { console.error(error) } finally { setIsLoading(false) } } React.useEffect(() => { fetchNotebooks() }, [authToken, selectedNotebook]) const handleCreateNotebook = async (data: CreateGroupData) => { try { setIsLoading(true) await knowledgeGroupService.createGroup(data) await fetchNotebooks() setIsCreateDrawerOpen(false) } catch (error) { console.error(error) showError(t('createFailed')) } finally { setIsLoading(false) } } const handleUpdateNotebook = async (id: string, data: UpdateGroupData) => { await knowledgeGroupService.updateGroup(id, data) await fetchNotebooks() } const handleDeleteNotebook = async (e: React.MouseEvent, id: string, name: string) => { e.stopPropagation() if (!(await confirm(t('confirmDeleteNotebook').replace('$1', name)))) return try { setIsLoading(true) await knowledgeGroupService.deleteGroup(id) setNotebooks(prev => prev.filter(n => n.id !== id)) } catch (error) { console.error(error) showError(t('deleteFailed')) } finally { setIsLoading(false) } } if (selectedNotebook) { return ( setSelectedNotebook(null)} onChatWithContext={onChatWithContext} isAdmin={!!isAdmin} /> ) } return (

{t('navKnowledgeGroups')}

{t('notebooksDesc')}

{isAdmin && ( )} {isAdmin && ( )}
{isLoading ? (
) : notebooks.length === 0 ? (

No Knowledge Groups

Create a group to start organizing your files.

{isAdmin && ( )}
) : (
{notebooks.map((notebook, index) => ( setSelectedNotebook(notebook)} className="bg-white rounded-xl border border-slate-200/80 p-5 shadow-sm hover:shadow-md transition-all group relative overflow-hidden flex flex-col h-64 cursor-pointer" >
e.stopPropagation()}> {isAdmin && ( )} {isAdmin && ( )}

{notebook.name}

{notebook.description || "No description provided."}

{notebook.fileCount || 0} Files
{notebook.updatedAt ? new Date(notebook.updatedAt).toLocaleDateString() : ''}
))}
)}
{isCreateDrawerOpen && ( setIsCreateDrawerOpen(false)} onCreate={handleCreateNotebook} /> )} {editingNotebook && ( setEditingNotebook(null)} notebook={editingNotebook} onUpdate={handleUpdateNotebook} /> )} setIsImportDrawerOpen(false)} authToken={authToken} onImportSuccess={fetchNotebooks} />
) }