diff --git a/web/app/components/header/app-nav/index.tsx b/web/app/components/header/app-nav/index.tsx index 55c6575015..48fed408ed 100644 --- a/web/app/components/header/app-nav/index.tsx +++ b/web/app/components/header/app-nav/index.tsx @@ -3,7 +3,6 @@ import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useParams } from 'next/navigation' -// import useSWR from 'swr' import useSWRInfinite from 'swr/infinite' import { flatten } from 'lodash-es' import produce from 'immer' @@ -11,7 +10,9 @@ import Nav from '../nav' import { type NavItem } from '../nav/nav-selector' import { Robot, RobotActive } from '../../base/icons/src/public/header-nav/studio' import { fetchAppList } from '@/service/apps' -import CreateAppDialog from '@/app/components/app/create-app-dialog' +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' import type { AppListResponse } from '@/models/app' import { useAppContext } from '@/context/app-context' import { useStore as useAppStore } from '@/app/components/app/store' @@ -28,6 +29,8 @@ const AppNav = () => { const { isCurrentWorkspaceManager } = useAppContext() const { appDetail } = useAppStore() const [showNewAppDialog, setShowNewAppDialog] = useState(false) + const [showNewAppTemplateDialog, setShowNewAppTemplateDialog] = useState(false) + const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(false) const [navItems, setNavItems] = useState([]) const { data: appsData, setSize } = useSWRInfinite(appId ? getKey : () => null, fetchAppList, { revalidateFirstPage: false }) @@ -36,6 +39,15 @@ const AppNav = () => { setSize(size => size + 1) }, [setSize]) + 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)) @@ -87,14 +99,24 @@ const AppNav = () => { curNav={appDetail} navs={navItems} createText={t('common.menus.newApp')} - onCreate={() => setShowNewAppDialog(true)} + onCreate={openModal} onLoadmore={handleLoadmore} /> - setShowNewAppDialog(false)} onSuccess={() => {}} /> + setShowNewAppTemplateDialog(false)} + onSuccess={() => {}} + /> + setShowCreateFromDSLModal(false)} + onSuccess={() => {}} + /> ) } diff --git a/web/app/components/header/nav/nav-selector/index.tsx b/web/app/components/header/nav/nav-selector/index.tsx index f65ccd1c34..b44d8b1c66 100644 --- a/web/app/components/header/nav/nav-selector/index.tsx +++ b/web/app/components/header/nav/nav-selector/index.tsx @@ -1,14 +1,16 @@ 'use client' -import { useCallback } from 'react' +import { useTranslation } from 'react-i18next' +import { Fragment, useCallback } from 'react' import cn from 'classnames' -import { Menu } from '@headlessui/react' +import { Menu, Transition } from '@headlessui/react' import { useRouter } from 'next/navigation' import { debounce } from 'lodash-es' import Indicator from '../../indicator' import AppIcon from '@/app/components/base/app-icon' import { useAppContext } from '@/context/app-context' import { useStore as useAppStore } from '@/app/components/app/store' -import { ChevronDown } from '@/app/components/base/icons/src/vender/line/arrows' +import { ChevronDown, ChevronRight } from '@/app/components/base/icons/src/vender/line/arrows' +import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files' import { Plus } from '@/app/components/base/icons/src/vender/line/general' export type NavItem = { @@ -22,11 +24,12 @@ export type INavSelectorProps = { navs: NavItem[] curNav?: Omit createText: string - onCreate: () => void + onCreate: (state: string) => void onLoadmore?: () => void } const NavSelector = ({ curNav, navs, createText, onCreate, onLoadmore }: INavSelectorProps) => { + const { t } = useTranslation() const router = useRouter() const { isCurrentWorkspaceManager } = useAppContext() const { setAppDetail } = useAppStore() @@ -84,16 +87,56 @@ const NavSelector = ({ curNav, navs, createText, onCreate, onLoadmore }: INavSel )) } - {isCurrentWorkspaceManager && -
-
-
- -
-
{createText}
-
-
-
} + {isCurrentWorkspaceManager && ( + + {({ open }) => ( + <> + +
+
+ +
+
{createText}
+ +
+
+ + +
+
onCreate('blank')}> + + {t('app.newApp.startFromBlank')} +
+
onCreate('template')}> + + {t('app.newApp.startFromTemplate')} +
+
+
+
onCreate('dsl')}> + + {t('app.importDSL')} +
+
+
+
+ + )} +
+ )} )}