fix: handle add workflow

This commit is contained in:
Joel 2025-05-09 18:47:44 +08:00
parent 9c21294f40
commit c427aafb94

View File

@ -1,6 +1,6 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import React, { useEffect, useMemo, useRef } from 'react' import React, { useCallback, useEffect, useMemo, useRef } from 'react'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react' import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react'
import { useGetLanguage } from '@/context/i18n' import { useGetLanguage } from '@/context/i18n'
@ -39,20 +39,30 @@ const Tool: FC<Props> = ({
const { t } = useTranslation() const { t } = useTranslation()
const language = useGetLanguage() const language = useGetLanguage()
const isFlatView = viewType === ViewType.flat const isFlatView = viewType === ViewType.flat
const notShowProvider = payload.type === CollectionType.workflow
const actions = payload.tools const actions = payload.tools
const hasAction = true // Now always support actions const hasAction = !notShowProvider
const [isFold, setFold] = React.useState<boolean>(true) const [isFold, setFold] = React.useState<boolean>(true)
const ref = useRef(null) const ref = useRef(null)
const isHovering = useHover(ref) const isHovering = useHover(ref)
const getIsDisabled = (tool: ToolType) => { const getIsDisabled = useCallback((tool: ToolType) => {
if (!selectedTools || !selectedTools.length) return false if (!selectedTools || !selectedTools.length) return false
return selectedTools.some(selectedTool => (selectedTool.provider_name === payload.name || selectedTool.provider_name === payload.id) && selectedTool.tool_name === tool.name) return selectedTools.some(selectedTool => (selectedTool.provider_name === payload.name || selectedTool.provider_name === payload.id) && selectedTool.tool_name === tool.name)
} }, [payload.id, payload.name, selectedTools])
const totalToolsNum = actions.length const totalToolsNum = actions.length
const selectedToolsNum = actions.filter(action => getIsDisabled(action)).length const selectedToolsNum = actions.filter(action => getIsDisabled(action)).length
const isAllSelected = selectedToolsNum === totalToolsNum const isAllSelected = selectedToolsNum === totalToolsNum
const notShowProviderSelectInfo = useMemo(() => {
if (isAllSelected) {
return (
<span className='system-xs-regular text-text-tertiary'>
{t('tools.addToolModal.added')}
</span>
)
}
}, [isAllSelected, t])
const selectedInfo = useMemo(() => { const selectedInfo = useMemo(() => {
if (isHovering && !isAllSelected) { if (isHovering && !isAllSelected) {
return ( return (
@ -97,7 +107,7 @@ const Tool: FC<Props> = ({
} }
</span> </span>
) )
}, [isAllSelected, isHovering, selectedToolsNum, t, totalToolsNum]) }, [actions, getIsDisabled, isAllSelected, isHovering, language, onSelectMultiple, payload.id, payload.is_team_authorization, payload.name, payload.type, selectedToolsNum, t, totalToolsNum])
useEffect(() => { useEffect(() => {
if (hasSearchText && isFold) { if (hasSearchText && isFold) {
@ -134,24 +144,31 @@ const Tool: FC<Props> = ({
<div <div
className='flex w-full cursor-pointer select-none items-center justify-between rounded-lg pl-3 pr-1 hover:bg-state-base-hover' className='flex w-full cursor-pointer select-none items-center justify-between rounded-lg pl-3 pr-1 hover:bg-state-base-hover'
onClick={() => { onClick={() => {
if (hasAction) if (hasAction) {
setFold(!isFold) setFold(!isFold)
return
}
// Now always support actions const tool = actions[0]
// if (payload.parameters) { const params: Record<string, string> = {}
// payload.parameters.forEach((item) => { if (tool.parameters) {
// params[item.name] = '' tool.parameters.forEach((item) => {
// }) params[item.name] = ''
// } })
// onSelect(BlockEnum.Tool, { }
// provider_id: payload.id, onSelect(BlockEnum.Tool, {
// provider_type: payload.type, provider_id: payload.id,
// provider_name: payload.name, provider_type: payload.type,
// tool_name: payload.name, provider_name: payload.name,
// tool_label: payload.label[language], tool_name: tool.name,
// title: payload.label[language], tool_label: tool.label[language],
// params: {}, tool_description: tool.description[language],
// }) title: tool.label[language],
is_team_authorization: payload.is_team_authorization,
output_schema: tool.output_schema,
paramSchemas: tool.parameters,
params,
})
}} }}
> >
<div className='flex h-8 grow items-center'> <div className='flex h-8 grow items-center'>
@ -161,7 +178,7 @@ const Tool: FC<Props> = ({
toolIcon={payload.icon} toolIcon={payload.icon}
/> />
<div className='ml-2 w-0 grow truncate text-sm text-text-primary'> <div className='ml-2 w-0 grow truncate text-sm text-text-primary'>
<span>{payload.label[language]}</span> <span>{notShowProvider ? actions[0]?.label[language] : payload.label[language]}</span>
{isFlatView && ( {isFlatView && (
<span className='system-xs-regular ml-2 text-text-quaternary'>{groupName}</span> <span className='system-xs-regular ml-2 text-text-quaternary'>{groupName}</span>
)} )}
@ -169,14 +186,14 @@ const Tool: FC<Props> = ({
</div> </div>
<div className='ml-2 flex items-center'> <div className='ml-2 flex items-center'>
{selectedInfo} {notShowProvider ? notShowProviderSelectInfo : selectedInfo}
{hasAction && ( {hasAction && (
<FoldIcon className={cn('h-4 w-4 shrink-0 text-text-quaternary', isFold && 'text-text-tertiary')} /> <FoldIcon className={cn('h-4 w-4 shrink-0 text-text-quaternary', isFold && 'text-text-tertiary')} />
)} )}
</div> </div>
</div> </div>
{hasAction && !isFold && ( {!notShowProvider && hasAction && !isFold && (
actions.map(action => ( actions.map(action => (
<ActonItem <ActonItem
key={action.name} key={action.name}