50 lines
1.8 KiB
TypeScript
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
|
|
}
|
|
}
|