Files
dify/web/app/components/workflow/skill/hooks/use-file-operations.ts
yyh 31a7db2657 refactor(skill): unify root/blank constants and eliminate magic strings
- Add constants.ts with ROOT_ID, CONTEXT_MENU_TYPE, NODE_MENU_TYPE
- Add root utilities to tree-utils.ts (isRootId, toApiParentId, etc.)
- Replace '__root__' with ROOT_ID for consistent root identifier
- Replace inline 'blank'/'root' strings with constants
- Use NodeMenuType for type-safe menu type props
- Remove duplicate ContextMenuType from types.ts, use from constants.ts
2026-01-19 23:07:49 +08:00

75 lines
2.1 KiB
TypeScript

'use client'
// Orchestrator hook for file operations - combines create and modify operations
// Maintains backward compatibility for existing consumers
import type { NodeApi, TreeApi } from 'react-arborist'
import type { TreeNodeData } from '../type'
import { useStore as useAppStore } from '@/app/components/app/store'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { toApiParentId } from '../utils/tree-utils'
import { useCreateOperations } from './use-create-operations'
import { useModifyOperations } from './use-modify-operations'
import { useSkillAssetTreeData } from './use-skill-asset-tree'
type UseFileOperationsOptions = {
nodeId?: string
onClose: () => void
treeRef?: React.RefObject<TreeApi<TreeNodeData> | null>
node?: NodeApi<TreeNodeData>
}
export function useFileOperations({
nodeId: explicitNodeId,
onClose,
treeRef,
node,
}: UseFileOperationsOptions) {
const nodeId = node?.data.id ?? explicitNodeId ?? ''
const appDetail = useAppStore(s => s.appDetail)
const appId = appDetail?.id || ''
const storeApi = useWorkflowStore()
const { data: treeData } = useSkillAssetTreeData()
const parentId = toApiParentId(nodeId)
const createOps = useCreateOperations({
parentId,
appId,
storeApi,
onClose,
})
const modifyOps = useModifyOperations({
nodeId,
node,
treeRef,
appId,
storeApi,
treeData,
onClose,
})
return {
// Create operations
fileInputRef: createOps.fileInputRef,
folderInputRef: createOps.folderInputRef,
handleNewFile: createOps.handleNewFile,
handleNewFolder: createOps.handleNewFolder,
handleFileChange: createOps.handleFileChange,
handleFolderChange: createOps.handleFolderChange,
// Modify operations
showDeleteConfirm: modifyOps.showDeleteConfirm,
handleRename: modifyOps.handleRename,
handleDeleteClick: modifyOps.handleDeleteClick,
handleDeleteConfirm: modifyOps.handleDeleteConfirm,
handleDeleteCancel: modifyOps.handleDeleteCancel,
// Combined loading states
isLoading: createOps.isCreating || modifyOps.isDeleting,
isDeleting: modifyOps.isDeleting,
}
}