import React from 'react' import { useTranslation } from 'react-i18next' import { RiAddLine, RiArrowDropDownLine, RiQuestionLine, } from '@remixicon/react' import ToolSelector from '@/app/components/plugins/plugin-detail-panel/tool-selector' import ActionButton from '@/app/components/base/action-button' import Tooltip from '@/app/components/base/tooltip' import Divider from '@/app/components/base/divider' import type { ToolValue } from '@/app/components/workflow/block-selector/types' import type { Node } from 'reactflow' import type { NodeOutPutVar } from '@/app/components/workflow/types' import cn from '@/utils/classnames' type Props = { disabled?: boolean value: ToolValue[] label: string required?: boolean tooltip?: any supportCollapse?: boolean scope?: string onChange: (value: ToolValue[]) => void nodeOutputVars: NodeOutPutVar[], availableNodes: Node[], nodeId?: string } const MultipleToolSelector = ({ disabled, value = [], label, required, tooltip, supportCollapse, scope, onChange, nodeOutputVars, availableNodes, nodeId, }: Props) => { const { t } = useTranslation() const enabledCount = value.filter(item => item.enabled).length // collapse control const [collapse, setCollapse] = React.useState(false) const handleCollapse = () => { if (supportCollapse) setCollapse(!collapse) } // add tool const [open, setOpen] = React.useState(false) const [panelShowState, setPanelShowState] = React.useState(true) const handleAdd = (val: ToolValue) => { const newValue = [...value, val] // deduplication const deduplication = newValue.reduce((acc, cur) => { if (!acc.find(item => item.provider_name === cur.provider_name && item.tool_name === cur.tool_name)) acc.push(cur) return acc }, [] as ToolValue[]) // update value onChange(deduplication) setOpen(false) } // delete tool const handleDelete = (index: number) => { const newValue = [...value] newValue.splice(index, 1) onChange(newValue) } // configure tool const handleConfigure = (val: ToolValue, index: number) => { const newValue = [...value] newValue[index] = val onChange(newValue) } return ( <>