import { serviceSideProps } from '@fastgpt/web/common/system/nextjs'; import { getPluginGroups, getSystemPlugTemplates } from '@/web/core/app/api/plugin'; import { Box, Flex, Grid, useDisclosure } from '@chakra-ui/react'; import Avatar from '@fastgpt/web/components/common/Avatar'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { useMemo, useState } from 'react'; import PluginCard from './components/PluginCard'; import { i18nT } from '@fastgpt/web/i18n/utils'; import { useTranslation } from 'next-i18next'; import { useRouter } from 'next/router'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import SearchInput from '@fastgpt/web/components/common/Input/SearchInput'; import { navbarWidth } from '@/components/Layout'; const Toolkit = () => { const { t } = useTranslation(); const router = useRouter(); const { isPc } = useSystem(); const { data: plugins = [] } = useRequest2(getSystemPlugTemplates, { manual: false }); const { data: pluginGroups = [] } = useRequest2(getPluginGroups, { manual: false }); const isOneGroup = pluginGroups.length === 1; const [search, setSearch] = useState(''); const { isOpen, onOpen, onClose } = useDisclosure(); const { group: selectedGroup = pluginGroups?.[0]?.groupId, type: selectedType = 'all' } = router.query; const pluginGroupTypes = useMemo(() => { const allTypes = [ { typeId: 'all', typeName: i18nT('common:common.All') } ]; const currentTypes = pluginGroups?.find((group) => group.groupId === selectedGroup)?.groupTypes ?? []; return [ ...allTypes, ...currentTypes.filter((type) => plugins.find((plugin) => plugin.templateType === type.typeId) ) ]; }, [pluginGroups, plugins, selectedGroup]); const currentPlugins = useMemo(() => { const typeArray = pluginGroupTypes?.map((type) => type.typeId); return plugins .filter( (plugin) => (selectedType === 'all' && typeArray?.includes(plugin.templateType)) || selectedType === plugin.templateType ) .filter((plugin) => { const str = `${plugin.name}${plugin.intro}${plugin.instructions}`; const regx = new RegExp(search, 'gi'); return regx.test(str); }); }, [pluginGroupTypes, plugins, selectedType, search]); return ( {/* Mask */} {!isPc && isOpen && ( )} {/* Sidebar */} {(isPc || isOpen) && ( {pluginGroups.map((group) => { const selected = group.groupId === selectedGroup; return ( { router.push({ query: { group: group.groupId, type: 'all' } }); onClose(); } })} > {t(group.groupName as any)} {!isOneGroup && ( )} {/* group types */} {selected && pluginGroupTypes.map((type) => { return ( { router.push({ query: { group: selectedGroup, type: type.typeId } }); onClose(); }} > {t(type.typeName as any)} ); })} ); })} )} {isPc ? ( {t( pluginGroups?.find((group) => group.groupId === selectedGroup)?.groupName as any )} ) : ( )} setSearch(e.target.value)} placeholder={t('common:plugin.Search plugin')} /> {currentPlugins.map((item) => ( ))} ); }; export default Toolkit; export async function getServerSideProps(context: any) { return { props: { ...(await serviceSideProps(context, ['app', 'user'])) } }; }