'use client' import type { FC } from 'react' import React from 'react' import { useEffect, useState } from 'react' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import type { OffsetOptions, Placement, } from '@floating-ui/react' import AllTools from '@/app/components/workflow/block-selector/all-tools' import type { ToolDefaultValue } from './types' import { fetchAllBuiltInTools, fetchAllCustomTools, fetchAllWorkflowTools, } from '@/service/tools' import type { BlockEnum, ToolWithProvider } from '@/app/components/workflow/types' import SearchBox from '@/app/components/plugins/marketplace/search-box' import { useTranslation } from 'react-i18next' import { useBoolean } from 'ahooks' import EditCustomToolModal from '@/app/components/tools/edit-custom-collection-modal/modal' import { createCustomCollection, } from '@/service/tools' import type { CustomCollectionBackend } from '@/app/components/tools/types' import Toast from '@/app/components/base/toast' type Props = { disabled: boolean trigger: React.ReactNode placement?: Placement offset?: OffsetOptions isShow: boolean onShowChange: (isShow: boolean) => void onSelect: (tool: ToolDefaultValue) => void supportAddCustomTool?: boolean } const ToolPicker: FC = ({ disabled, trigger, placement = 'right-start', offset = 0, isShow, onShowChange, onSelect, supportAddCustomTool, }) => { const { t } = useTranslation() const [searchText, setSearchText] = useState('') const [buildInTools, setBuildInTools] = useState([]) const [customTools, setCustomTools] = useState([]) const [workflowTools, setWorkflowTools] = useState([]) useEffect(() => { (async () => { const buildInTools = await fetchAllBuiltInTools() const customTools = await fetchAllCustomTools() const workflowTools = await fetchAllWorkflowTools() setBuildInTools(buildInTools) setCustomTools(customTools) setWorkflowTools(workflowTools) })() }, []) const handleAddedCustomTool = async () => { const customTools = await fetchAllCustomTools() setCustomTools(customTools) } const handleTriggerClick = () => { if (disabled) return onShowChange(true) } const handleSelect = (_type: BlockEnum, tool?: ToolDefaultValue) => { onSelect(tool!) } const [isShowEditCollectionToolModal, { setFalse: hideEditCustomCollectionModal, setTrue: showEditCustomCollectionModal, }] = useBoolean(false) const doCreateCustomToolCollection = async (data: CustomCollectionBackend) => { await createCustomCollection(data) Toast.notify({ type: 'success', message: t('common.api.actionSuccess'), }) hideEditCustomCollectionModal() handleAddedCustomTool() } if (isShowEditCollectionToolModal) { return ( ) } return ( {trigger} { }
{ }} size='small' placeholder={t('plugin.searchTools')!} />
) } export default React.memo(ToolPicker)