()
| 91 | } |
| 92 | |
| 93 | export function NavProjects() { |
| 94 | const { t } = useTranslation() |
| 95 | const { isMobile } = useSidebar() |
| 96 | const { folders, updateFolder } = useThreadManagement() |
| 97 | |
| 98 | const [editDialogOpen, setEditDialogOpen] = useState(false) |
| 99 | const [deleteDialogOpen, setDeleteDialogOpen] = useState(false) |
| 100 | const [selectedProject, setSelectedProject] = useState<ThreadFolder | null>(null) |
| 101 | |
| 102 | const handleEdit = (project: ThreadFolder) => { |
| 103 | setSelectedProject(project) |
| 104 | setEditDialogOpen(true) |
| 105 | } |
| 106 | |
| 107 | const handleDelete = (project: ThreadFolder) => { |
| 108 | setSelectedProject(project) |
| 109 | setDeleteDialogOpen(true) |
| 110 | } |
| 111 | |
| 112 | const handleSaveEdit = async (name: string, assistantId?: string) => { |
| 113 | if (selectedProject) { |
| 114 | await updateFolder(selectedProject.id, name, assistantId) |
| 115 | setEditDialogOpen(false) |
| 116 | setSelectedProject(null) |
| 117 | } |
| 118 | } |
| 119 | |
| 120 | if (folders.length === 0) { |
| 121 | return null |
| 122 | } |
| 123 | |
| 124 | return ( |
| 125 | <> |
| 126 | <SidebarGroup className="group-data-[collapsible=icon]:hidden"> |
| 127 | <SidebarGroupLabel>{t('common:projects.title')}</SidebarGroupLabel> |
| 128 | <SidebarMenu> |
| 129 | {folders.map((item) => ( |
| 130 | <ProjectItem |
| 131 | key={item.id} |
| 132 | item={item} |
| 133 | isMobile={isMobile} |
| 134 | onEdit={handleEdit} |
| 135 | onDelete={handleDelete} |
| 136 | /> |
| 137 | ))} |
| 138 | </SidebarMenu> |
| 139 | </SidebarGroup> |
| 140 | |
| 141 | <AddProjectDialog |
| 142 | open={editDialogOpen} |
| 143 | onOpenChange={setEditDialogOpen} |
| 144 | editingKey={selectedProject?.id ?? null} |
| 145 | initialData={selectedProject ?? undefined} |
| 146 | onSave={handleSaveEdit} |
| 147 | /> |
| 148 | |
| 149 | <DeleteProjectDialog |
| 150 | open={deleteDialogOpen} |
nothing calls this directly
no test coverage detected