import React, { ReactElement, memo, useCallback, useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import DicomFileUploader, { DicomFileUploaderProgressEvent, EVENTS, UploadRejection, UploadStatus, } from '../../utils/DicomFileUploader'; import { Icons } from '@ohif/ui-next'; type DicomUploadProgressItemProps = { dicomFileUploader: DicomFileUploader; }; // eslint-disable-next-line react/display-name const DicomUploadProgressItem = memo( ({ dicomFileUploader }: DicomUploadProgressItemProps): ReactElement => { const [percentComplete, setPercentComplete] = useState(dicomFileUploader.getPercentComplete()); const [failedReason, setFailedReason] = useState(''); const [status, setStatus] = useState(dicomFileUploader.getStatus()); const isComplete = useCallback(() => { return ( status === UploadStatus.Failed || status === UploadStatus.Cancelled || status === UploadStatus.Success ); }, [status]); useEffect(() => { const progressSubscription = dicomFileUploader.subscribe( EVENTS.PROGRESS, (dicomFileUploaderProgressEvent: DicomFileUploaderProgressEvent) => { setPercentComplete(dicomFileUploaderProgressEvent.percentComplete); } ); dicomFileUploader .load() .catch((reason: UploadRejection) => { setStatus(reason.status); setFailedReason(reason.message ?? ''); }) .finally(() => setStatus(dicomFileUploader.getStatus())); return () => progressSubscription.unsubscribe(); }, []); const cancelUpload = useCallback(() => { dicomFileUploader.cancel(); }, []); const getStatusIcon = (): ReactElement => { switch (dicomFileUploader.getStatus()) { case UploadStatus.Success: return ( ); case UploadStatus.InProgress: return ; case UploadStatus.Failed: return ; case UploadStatus.Cancelled: return ; default: return <>; } }; return (
{getStatusIcon()}
{dicomFileUploader.getFileName()}
{failedReason &&
{failedReason}
}
{!isComplete() && ( <> {dicomFileUploader.getStatus() === UploadStatus.InProgress && (
{percentComplete}%
)}
)}
); } ); DicomUploadProgressItem.propTypes = { dicomFileUploader: PropTypes.instanceOf(DicomFileUploader).isRequired, }; export default DicomUploadProgressItem;