| 
									
										
										
										
											2023-07-18 16:57:14 +08:00
										 |  |  | 'use client' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | import { useCallback, useEffect, useState } from 'react' | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  | import { useTranslation } from 'react-i18next' | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | import { useParams } from 'next/navigation' | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  | import useSWRInfinite from 'swr/infinite' | 
					
						
							|  |  |  | import { flatten } from 'lodash-es' | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | import produce from 'immer' | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  | import Nav from '../nav' | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | import { type NavItem } from '../nav/nav-selector' | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  | import { Robot, RobotActive } from '../../base/icons/src/public/header-nav/studio' | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | import { fetchAppList } from '@/service/apps' | 
					
						
							|  |  |  | import CreateAppTemplateDialog from '@/app/components/app/create-app-dialog' | 
					
						
							|  |  |  | import CreateAppModal from '@/app/components/app/create-app-modal' | 
					
						
							|  |  |  | import CreateFromDSLModal from '@/app/components/app/create-from-dsl-modal' | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  | import type { AppListResponse } from '@/models/app' | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  | import { useAppContext } from '@/context/app-context' | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | import { useStore as useAppStore } from '@/app/components/app/store' | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | const getKey = ( | 
					
						
							|  |  |  |   pageIndex: number, | 
					
						
							|  |  |  |   previousPageData: AppListResponse, | 
					
						
							|  |  |  |   activeTab: string, | 
					
						
							|  |  |  |   keywords: string, | 
					
						
							|  |  |  | ) => { | 
					
						
							|  |  |  |   if (!pageIndex || previousPageData.has_more) { | 
					
						
							|  |  |  |     const params: any = { url: 'apps', params: { page: pageIndex + 1, limit: 30, name: keywords } } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (activeTab !== 'all') | 
					
						
							|  |  |  |       params.params.mode = activeTab | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       delete params.params.mode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return params | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  |   return null | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const AppNav = () => { | 
					
						
							|  |  |  |   const { t } = useTranslation() | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |   const { appId } = useParams() | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   const { isCurrentWorkspaceManager } = useAppContext() | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |   const { appDetail } = useAppStore() | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  |   const [showNewAppDialog, setShowNewAppDialog] = useState(false) | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |   const [showNewAppTemplateDialog, setShowNewAppTemplateDialog] = useState(false) | 
					
						
							|  |  |  |   const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(false) | 
					
						
							|  |  |  |   const [navItems, setNavItems] = useState<NavItem[]>([]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const { data: appsData, setSize, mutate } = useSWRInfinite( | 
					
						
							|  |  |  |     appId | 
					
						
							|  |  |  |       ? (pageIndex: number, previousPageData: AppListResponse) => getKey(pageIndex, previousPageData, 'all', '') | 
					
						
							|  |  |  |       : () => null, | 
					
						
							|  |  |  |     fetchAppList, | 
					
						
							|  |  |  |     { revalidateFirstPage: false }, | 
					
						
							|  |  |  |   ) | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const handleLoadmore = useCallback(() => { | 
					
						
							|  |  |  |     setSize(size => size + 1) | 
					
						
							|  |  |  |   }, [setSize]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |   const openModal = (state: string) => { | 
					
						
							|  |  |  |     if (state === 'blank') | 
					
						
							|  |  |  |       setShowNewAppDialog(true) | 
					
						
							|  |  |  |     if (state === 'template') | 
					
						
							|  |  |  |       setShowNewAppTemplateDialog(true) | 
					
						
							|  |  |  |     if (state === 'dsl') | 
					
						
							|  |  |  |       setShowCreateFromDSLModal(true) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     if (appsData) { | 
					
						
							|  |  |  |       const appItems = flatten(appsData?.map(appData => appData.data)) | 
					
						
							|  |  |  |       const navItems = appItems.map((app) => { | 
					
						
							|  |  |  |         const link = ((isCurrentWorkspaceManager, app) => { | 
					
						
							|  |  |  |           if (!isCurrentWorkspaceManager) { | 
					
						
							|  |  |  |             return `/app/${app.id}/overview` | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           else { | 
					
						
							|  |  |  |             if (app.mode === 'workflow' || app.mode === 'advanced-chat') | 
					
						
							|  |  |  |               return `/app/${app.id}/workflow` | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |               return `/app/${app.id}/configuration` | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         })(isCurrentWorkspaceManager, app) | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |           id: app.id, | 
					
						
							|  |  |  |           icon: app.icon, | 
					
						
							|  |  |  |           icon_background: app.icon_background, | 
					
						
							|  |  |  |           name: app.name, | 
					
						
							|  |  |  |           mode: app.mode, | 
					
						
							|  |  |  |           link, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       setNavItems(navItems) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, [appsData, isCurrentWorkspaceManager, setNavItems]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // update current app name
 | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     if (appDetail) { | 
					
						
							|  |  |  |       const newNavItems = produce(navItems, (draft: NavItem[]) => { | 
					
						
							|  |  |  |         navItems.forEach((app, index) => { | 
					
						
							|  |  |  |           if (app.id === appDetail.id) | 
					
						
							|  |  |  |             draft[index].name = appDetail.name | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       setNavItems(newNavItems) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, [appDetail, navItems]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  |   return ( | 
					
						
							|  |  |  |     <> | 
					
						
							|  |  |  |       <Nav | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         isApp | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |         icon={<Robot className='w-4 h-4' />} | 
					
						
							|  |  |  |         activeIcon={<RobotActive className='w-4 h-4' />} | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  |         text={t('common.menus.apps')} | 
					
						
							|  |  |  |         activeSegment={['apps', 'app']} | 
					
						
							|  |  |  |         link='/apps' | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         curNav={appDetail} | 
					
						
							|  |  |  |         navs={navItems} | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  |         createText={t('common.menus.newApp')} | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         onCreate={openModal} | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  |         onLoadmore={handleLoadmore} | 
					
						
							|  |  |  |       /> | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |       <CreateAppModal | 
					
						
							|  |  |  |         show={showNewAppDialog} | 
					
						
							|  |  |  |         onClose={() => setShowNewAppDialog(false)} | 
					
						
							|  |  |  |         onSuccess={() => mutate()} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |       <CreateAppTemplateDialog | 
					
						
							|  |  |  |         show={showNewAppTemplateDialog} | 
					
						
							|  |  |  |         onClose={() => setShowNewAppTemplateDialog(false)} | 
					
						
							|  |  |  |         onSuccess={() => mutate()} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |       <CreateFromDSLModal | 
					
						
							|  |  |  |         show={showCreateFromDSLModal} | 
					
						
							|  |  |  |         onClose={() => setShowCreateFromDSLModal(false)} | 
					
						
							|  |  |  |         onSuccess={() => mutate()} | 
					
						
							|  |  |  |       /> | 
					
						
							| 
									
										
										
										
											2023-06-27 18:02:01 +08:00
										 |  |  |     </> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default AppNav |