|
import { FileMimeType } from '@/constants/common'; |
|
import { useSetModalState } from '@/hooks/common-hooks'; |
|
import { useFetchFlow } from '@/hooks/flow-hooks'; |
|
import { IGraph } from '@/interfaces/database/flow'; |
|
import { downloadJsonFile } from '@/utils/file-util'; |
|
import { message, UploadFile } from 'antd'; |
|
import isEmpty from 'lodash/isEmpty'; |
|
import { useCallback } from 'react'; |
|
import { useTranslation } from 'react-i18next'; |
|
import { useBuildDslData } from './use-build-dsl'; |
|
import { useSetGraphInfo } from './use-set-graph'; |
|
|
|
export const useHandleExportOrImportJsonFile = () => { |
|
const { buildDslData } = useBuildDslData(); |
|
const { |
|
visible: fileUploadVisible, |
|
hideModal: hideFileUploadModal, |
|
showModal: showFileUploadModal, |
|
} = useSetModalState(); |
|
const setGraphInfo = useSetGraphInfo(); |
|
const { data } = useFetchFlow(); |
|
const { t } = useTranslation(); |
|
|
|
const onFileUploadOk = useCallback( |
|
async (fileList: UploadFile[]) => { |
|
if (fileList.length > 0) { |
|
const file: File = fileList[0] as unknown as File; |
|
if (file.type !== FileMimeType.Json) { |
|
message.error(t('flow.jsonUploadTypeErrorMessage')); |
|
return; |
|
} |
|
|
|
const graphStr = await file.text(); |
|
const errorMessage = t('flow.jsonUploadContentErrorMessage'); |
|
try { |
|
const graph = JSON.parse(graphStr); |
|
if (graphStr && !isEmpty(graph) && Array.isArray(graph?.nodes)) { |
|
setGraphInfo(graph ?? ({} as IGraph)); |
|
hideFileUploadModal(); |
|
} else { |
|
message.error(errorMessage); |
|
} |
|
} catch (error) { |
|
message.error(errorMessage); |
|
} |
|
} |
|
}, |
|
[hideFileUploadModal, setGraphInfo, t], |
|
); |
|
|
|
const handleExportJson = useCallback(() => { |
|
downloadJsonFile(buildDslData().graph, `${data.title}.json`); |
|
}, [buildDslData, data.title]); |
|
|
|
return { |
|
fileUploadVisible, |
|
handleExportJson, |
|
handleImportJson: showFileUploadModal, |
|
hideFileUploadModal, |
|
onFileUploadOk, |
|
}; |
|
}; |
|
|