diff --git a/web/app/components/workflow/skill/file-tree/search-result-list.tsx b/web/app/components/workflow/skill/file-tree/search-result-list.tsx index 277082c2a2..945cae0c49 100644 --- a/web/app/components/workflow/skill/file-tree/search-result-list.tsx +++ b/web/app/components/workflow/skill/file-tree/search-result-list.tsx @@ -4,6 +4,7 @@ import type { AppAssetTreeView } from '@/types/app-asset' import { useCallback, useMemo } from 'react' import { useStore, useWorkflowStore } from '@/app/components/workflow/store' import { cn } from '@/utils/classnames' +import { useDelayedClick } from '../hooks/use-delayed-click' import { flattenMatchingNodes, getAncestorIds } from '../utils/tree-utils' import { TreeNodeIcon } from './tree-node-icon' @@ -12,66 +13,100 @@ type SearchResultListProps = { treeChildren: AppAssetTreeView[] } -const SearchResultList = ({ searchTerm, treeChildren }: SearchResultListProps) => { - const activeTabId = useStore(s => s.activeTabId) - const storeApi = useWorkflowStore() +type SearchResultRowProps = { + node: AppAssetTreeView + parentPath: string + treeChildren: AppAssetTreeView[] +} +const SearchResultRow = ({ node, parentPath, treeChildren }: SearchResultRowProps) => { + const isActive = useStore(s => s.activeTabId === node.id) + const storeApi = useWorkflowStore() + const isFile = node.node_type === 'file' + + const openFilePreview = useCallback(() => { + storeApi.getState().clearArtifactSelection() + storeApi.getState().openTab(node.id, { pinned: false }) + }, [node.id, storeApi]) + + const openFilePinned = useCallback(() => { + storeApi.getState().clearArtifactSelection() + storeApi.getState().openTab(node.id, { pinned: true }) + }, [node.id, storeApi]) + + const { handleClick: handleFileClick, handleDoubleClick: handleFileDoubleClick } = useDelayedClick({ + onSingleClick: openFilePreview, + onDoubleClick: openFilePinned, + }) + + const handleFolderClick = useCallback(() => { + const ancestors = getAncestorIds(node.id, treeChildren) + storeApi.getState().revealFile([...ancestors, node.id]) + storeApi.getState().setFileTreeSearchTerm('') + }, [node.id, storeApi, treeChildren]) + + const handleClick = isFile ? handleFileClick : handleFolderClick + const handleDoubleClick = isFile ? handleFileDoubleClick : undefined + + return ( +