in src/components/Utilities/FilePicker.js [125:271]
function FilePicker(props) {
const classes = useStyles();
const [fileName, setFileName] = useState(null);
const [newFile, setNewFile] = useState(null);
const [inProgress, setInProgress] = useState(false);
const [fileLabel, setFileLabel] = useState('No File Selected');
const [uploadPercent, setUploadPercent] = useState(0);
const bucketName = useSelector(state => state.mapsConfig.bucket);
const selectedPrefix = useSelector(state => state.mapsConfig.prefix);
const { alertHandler, closeHandler } = props;
const handleClose = () => {
if (!inProgress) {
setFileLabel('No File Selected')
setFileName(null);
setNewFile(null);
setUploadPercent(0);
}
closeHandler();
};
const handleFileInputClick = (event) => {
document.getElementById('hiddenFileInput').click();
};
const startUpload = () => {
setInProgress(true);
setTimeout(handleUpload, 2000);
};
const handleFileSelection = (e) => {
e.preventDefault();
const file = e.target.files[0];
if (file !== null) {
setNewFile(file);
setFileName(file.name);
setFileLabel(file.name);
}
};
const uploadObject = () => {
Auth.currentUserCredentials()
.then((response) => {
AWS.config.credentials = response;
AWS.config.region = awsmobile['aws_cognito_region'];
var upload = new AWS.S3.ManagedUpload({
params: {
Bucket: bucketName,
Key: `${selectedPrefix}${fileName}`,
Body: newFile,
ContentDisposition: `attachment; filename=\"${fileName}\"`
}
});
upload.on('httpUploadProgress', (event) => {
setUploadPercent(event.loaded * 100 / event.total);
});
upload.promise()
.then((response) => {
closeHandler();
setInProgress(false);
setFileLabel('No File Selected');
setFileName(null);
setNewFile(null);
})
.catch((uploadError) => {
console.log('Upload error', uploadError);
});
})
.catch((err) => {
console.log('Auth error', err);
});
}
const handleUpload = () => {
let fileName = newFile.name;
let version = -1;
fileName = selectedPrefix+fileName;
UploadObjRequest(bucketName, fileName, version)
.then((response) => {
if (response.data.body['allowCheckIn']) {
uploadObject();
} else {
alertHandler('error', 'Error', [response.data.body['reason']]);
closeHandler();
setInProgress(false);
setFileLabel('No File Selected');
setFileName(null);
setNewFile(null);
}
})
.catch((error) => {
console.log(error);
alertHandler('error', 'Error', ['There was an error uploading your file. Please try again.']);
});
};
return (
<>
<Dialog
open={props.open}
onClose={handleClose}
aria-labelledby="alert-dialog-title"
aria-describedby="alert-dialog-description"
maxWidth='md'
fullWidth={true}
PaperProps={{ style: { backgroundColor: "#343a40", elevation: "3", overflowY: 'inherit' } }}
>
<DialogContent>
<div className={clsx({[classes.loading]: inProgress})}>
<Fade in={inProgress} timeout={{enter: 500}}>
<div className={clsx({[classes.hide]: !inProgress})}>
<LinearProgressWithLabel className={clsx({[classes.hide]: !inProgress}, {[classes.loadingBar]: inProgress})} value={uploadPercent}/>
<span className={clsx(classes.span)}>
Uploading <strong style={{color: "#17a2b8"}}>{fileName}</strong>
</span>
</div>
</Fade>
</div>
<center>
<div className={clsx(classes.createJobRoot, {[classes.hide]: inProgress})}>
<Button variant="contained" className={classes.customButton} onClick={handleFileInputClick}>Browse</Button>
<label style={{marginBottom: '10px', marginLeft: '10px', marginRight: '10px', color: 'white', fontsize: '20px'}} className='fileText'>{fileLabel}</label>
<input
type="file"
id="hiddenFileInput"
onChange={handleFileSelection}
accept=".cmaf, .dash, .hls, .mp4, .f4v, .mxf, .mov, .ismv, .raw, .av1, .avc, .hevc, .mpeg-2, .avi, .mkv, .webm"
style={{display: 'none'}}
/>
</div>
<br/>
</center>
</DialogContent>
<center>
<Button variant='outlined' onClick={startUpload} disabled={fileName === null} className={classes.customButton} style={{display: inProgress ? 'none' : 'inline'}}>
Upload
</Button>
</center>
</Dialog>
</>
);
}