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