|
|
|
@@ -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} |