VirtualMaintenanceTraining/src/features/file-handler/useFileHandler.ts
2025-12-09 17:35:12 +08:00

50 lines
1.8 KiB
TypeScript

import { useCallback } from 'react'
import { useFlowStore } from '../../store/flowStore'
import { exportFlowToYaml, importFlowFromYaml, type FlowMetadata } from '../../utils/yamlParser'
import { message } from 'antd'
export const useFileHandler = () => {
const { nodes, edges, setNodes, setEdges } = useFlowStore()
const handleExport = useCallback((metadata: Omit<FlowMetadata, 'version'>) => {
try {
const yamlStr = exportFlowToYaml(nodes, edges, { ...metadata, version: '1.0' })
const blob = new Blob([yamlStr], { type: 'text/yaml' })
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = `${metadata.flowName.replace(/\s+/g, '_')}.yaml`
a.click()
URL.revokeObjectURL(url)
message.success('导出成功')
} catch (error) {
console.error('Export failed:', error)
message.error('导出失败')
}
}, [nodes, edges])
const handleImport = useCallback((file: File) => {
const reader = new FileReader()
reader.onload = (e) => {
try {
const content = e.target?.result as string
const { nodes: newNodes, edges: newEdges, metadata } = importFlowFromYaml(content)
setNodes(newNodes)
setEdges(newEdges)
message.success(`流程 "${metadata.flowName}" 加载成功`)
} catch (error) {
console.error('Import failed:', error)
message.error('解析YAML文件失败: 格式不正确')
}
}
reader.readAsText(file)
return false // Prevent default upload behavior
}, [setNodes, setEdges])
return {
handleExport,
handleImport
}
}