MCPcopy
hub / github.com/janhq/jan / NavProjects

Function NavProjects

web-app/src/components/left-sidebar/NavProjects.tsx:93–157  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

91}
92
93export 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}

Callers

nothing calls this directly

Calls 5

useTranslationFunction · 0.90
useSidebarFunction · 0.90
useThreadManagementFunction · 0.90
tFunction · 0.85
mapMethod · 0.45

Tested by

no test coverage detected