|
|
|
|
@ -5,6 +5,7 @@ import type {
|
|
|
|
|
import {
|
|
|
|
|
memo,
|
|
|
|
|
useCallback,
|
|
|
|
|
useMemo,
|
|
|
|
|
useState,
|
|
|
|
|
} from 'react'
|
|
|
|
|
import { useTranslation } from 'react-i18next'
|
|
|
|
|
@ -17,6 +18,7 @@ import {
|
|
|
|
|
} from '@remixicon/react'
|
|
|
|
|
import type { BlockEnum, OnSelectBlock } from '../types'
|
|
|
|
|
import Tabs from './tabs'
|
|
|
|
|
import { TabsEnum } from './types'
|
|
|
|
|
import {
|
|
|
|
|
PortalToFollowElem,
|
|
|
|
|
PortalToFollowElemContent,
|
|
|
|
|
@ -66,6 +68,9 @@ const NodeSelector: FC<NodeSelectorProps> = ({
|
|
|
|
|
const handleOpenChange = useCallback((newOpen: boolean) => {
|
|
|
|
|
setLocalOpen(newOpen)
|
|
|
|
|
|
|
|
|
|
if (!newOpen)
|
|
|
|
|
setSearchText('')
|
|
|
|
|
|
|
|
|
|
if (onOpenChange)
|
|
|
|
|
onOpenChange(newOpen)
|
|
|
|
|
}, [onOpenChange])
|
|
|
|
|
@ -80,6 +85,19 @@ const NodeSelector: FC<NodeSelectorProps> = ({
|
|
|
|
|
onSelect(type, toolDefaultValue)
|
|
|
|
|
}, [handleOpenChange, onSelect])
|
|
|
|
|
|
|
|
|
|
const [activeTab, setActiveTab] = useState(noBlocks ? TabsEnum.Tools : TabsEnum.Blocks)
|
|
|
|
|
const handleActiveTabChange = useCallback((newActiveTab: TabsEnum) => {
|
|
|
|
|
setActiveTab(newActiveTab)
|
|
|
|
|
}, [])
|
|
|
|
|
const searchPlaceholder = useMemo(() => {
|
|
|
|
|
if (activeTab === TabsEnum.Blocks)
|
|
|
|
|
return t('workflow.tabs.searchBlock')
|
|
|
|
|
|
|
|
|
|
if (activeTab === TabsEnum.Tools)
|
|
|
|
|
return t('workflow.tabs.searchTool')
|
|
|
|
|
return ''
|
|
|
|
|
}, [activeTab, t])
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<PortalToFollowElem
|
|
|
|
|
placement={placement}
|
|
|
|
|
@ -120,7 +138,7 @@ const NodeSelector: FC<NodeSelectorProps> = ({
|
|
|
|
|
<input
|
|
|
|
|
value={searchText}
|
|
|
|
|
className='grow px-0.5 py-[7px] text-[13px] text-gray-700 bg-transparent appearance-none outline-none caret-primary-600 placeholder:text-gray-400'
|
|
|
|
|
placeholder={t('workflow.tabs.searchBlock') || ''}
|
|
|
|
|
placeholder={searchPlaceholder}
|
|
|
|
|
onChange={e => setSearchText(e.target.value)}
|
|
|
|
|
autoFocus
|
|
|
|
|
/>
|
|
|
|
|
@ -137,6 +155,8 @@ const NodeSelector: FC<NodeSelectorProps> = ({
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<Tabs
|
|
|
|
|
activeTab={activeTab}
|
|
|
|
|
onActiveTabChange={handleActiveTabChange}
|
|
|
|
|
onSelect={handleSelect}
|
|
|
|
|
searchText={searchText}
|
|
|
|
|
availableBlocksTypes={availableBlocksTypes}
|
|
|
|
|
|