import * as React from 'react'; import PropTypes from 'prop-types'; import { useNavigate, Link } from 'react-router-dom'; import Alert from '@mui/material/Alert'; import Button from '@mui/material/Button'; import Stack from '@mui/material/Stack'; import Dialog from '@mui/material/Dialog'; import DialogActions from '@mui/material/DialogActions'; import DialogContent from '@mui/material/DialogContent'; import DialogContentText from '@mui/material/DialogContentText'; import DialogTitle from '@mui/material/DialogTitle'; import Typography from '@mui/material/Typography'; import UploadIcon from '@mui/icons-material/Upload'; import Tooltip from '@mui/material/Tooltip'; import Box from '@mui/material/Box'; import * as URLS from 'config/urls'; import useFormatMessage from 'hooks/useFormatMessage'; import FileUploadInput from 'components/FileUploadInput'; import useImportFlow from 'hooks/useImportFlow'; import { getUnifiedErrorMessage } from 'helpers/errors'; function ImportFlowDialog(props) { const { open = true, 'data-test': dataTest = 'import-flow-dialog' } = props; const [hasParsingError, setParsingError] = React.useState(false); const [selectedFile, setSelectedFile] = React.useState(null); const navigate = useNavigate(); const formatMessage = useFormatMessage(); const { mutate: importFlow, data: importedFlow, error, isError, isSuccess, reset, } = useImportFlow(); const handleFileSelection = (event) => { reset(); setParsingError(false); const file = event.target.files[0]; setSelectedFile(file); }; const parseFlowFile = (fileContents) => { try { const flowData = JSON.parse(fileContents); return flowData; } catch { setParsingError(true); } }; const handleImportFlow = (event) => { if (!selectedFile) return; const fileReader = new FileReader(); fileReader.onload = async function readFileLoaded(e) { const flowData = parseFlowFile(e.target.result); if (flowData) { importFlow(flowData); } }; fileReader.readAsText(selectedFile); }; const onClose = () => { navigate('..'); }; return ( {formatMessage('importFlowDialog.title')} {formatMessage('importFlowDialog.description')} {formatMessage('importFlowDialog.selectFile')} {selectedFile && ( {formatMessage('importFlowDialog.selectedFileInformation')} {selectedFile.name} )} {hasParsingError && ( {formatMessage('importFlowDialog.parsingError')} )} {isError && ( {getUnifiedErrorMessage(error?.response?.data?.errors) || formatMessage('genericError')} )} {isSuccess && ( {formatMessage('importFlowDialog.successfullyImportedFlow', { link: (str) => ( {str} ), })} )} ); } ImportFlowDialog.propTypes = { open: PropTypes.bool, 'data-test': PropTypes.string, }; export default ImportFlowDialog;