'use client' import type { ComponentProps } from 'react' import type { NavIcon } from './nav-link' import { cn } from '@langgenius/dify-ui/cn' import { RiDashboard2Fill, RiDashboard2Line, RiFileList3Fill, RiFileList3Line, RiTerminalBoxFill, RiTerminalBoxLine, RiTerminalWindowFill, RiTerminalWindowLine, } from '@remixicon/react' import { Fragment, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useStore } from '@/app/components/app/store' import Divider from '@/app/components/base/divider' import Annotations from '@/app/components/base/icons/src/vender/Annotations' import { useAppContext } from '@/context/app-context' import { usePathname } from '@/next/navigation' import { AppModeEnum } from '@/types/app' import { AppInfoView } from './app-info' import { useAppInfoActions } from './app-info/use-app-info-actions' import NavLink from './nav-link' type AppDetailNavItem = { name: string href: string icon: NavIcon selectedIcon: NavIcon } const AnnotationNavIcon = ({ className, ...props }: ComponentProps) => ( ) AnnotationNavIcon.displayName = 'Annotations' const isLogsNavItem = (item: AppDetailNavItem) => item.href.endsWith('/logs') const isAnnotationsNavItem = (item: AppDetailNavItem) => item.href.endsWith('/annotations') const renderNavDivider = (key: string, expand: boolean) => (
) type AppDetailSectionProps = { expand?: boolean } const AppDetailSection = ({ expand = true, }: AppDetailSectionProps) => { const { t } = useTranslation() const pathname = usePathname() const { isCurrentWorkspaceEditor } = useAppContext() const appDetail = useStore(state => state.appDetail) const appInfoActions = useAppInfoActions({ resetKey: appDetail?.id, }) const navigation = useMemo(() => { if (!appDetail) return [] const appId = appDetail.id const isWorkflowApp = appDetail.mode === AppModeEnum.WORKFLOW || appDetail.mode === AppModeEnum.ADVANCED_CHAT const supportsAnnotations = appDetail.mode !== AppModeEnum.WORKFLOW && appDetail.mode !== AppModeEnum.COMPLETION return [ ...(isCurrentWorkspaceEditor ? [{ name: t('appMenus.promptEng', { ns: 'common' }), href: `/app/${appId}/${isWorkflowApp ? 'workflow' : 'configuration'}`, icon: RiTerminalWindowLine, selectedIcon: RiTerminalWindowFill, }] : [] ), { name: t('appMenus.apiAccess', { ns: 'common' }), href: `/app/${appId}/develop`, icon: RiTerminalBoxLine, selectedIcon: RiTerminalBoxFill, }, ...(isCurrentWorkspaceEditor ? [{ name: t('appMenus.logs', { ns: 'common' }), href: `/app/${appId}/logs`, icon: RiFileList3Line, selectedIcon: RiFileList3Fill, }, ...(supportsAnnotations ? [{ name: t('appMenus.annotations', { ns: 'common' }), href: `/app/${appId}/annotations`, icon: AnnotationNavIcon, selectedIcon: AnnotationNavIcon, }] : [])] : [] ), { name: t('appMenus.overview', { ns: 'common' }), href: `/app/${appId}/overview`, icon: RiDashboard2Line, selectedIcon: RiDashboard2Fill, }, ] }, [appDetail, isCurrentWorkspaceEditor, t]) if (!appDetail) return null const hasAnnotationsNavigation = navigation.some(isAnnotationsNavItem) return (
{!expand && (
)}
) } export default AppDetailSection