UNPKG

4.23 kBJavaScriptView Raw
1import { __rest } from "tslib";
2import * as React from 'react';
3import styles from '@patternfly/react-styles/css/components/MultipleFileUpload/multiple-file-upload';
4import { css } from '@patternfly/react-styles';
5import { Progress } from '../Progress';
6import { Button } from '../Button';
7import FileIcon from '@patternfly/react-icons/dist/esm/icons/file-icon';
8import TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';
9export const MultipleFileUploadStatusItem = (_a) => {
10 var { className, file, fileIcon, onReadStarted = () => { }, onReadFinished = () => { }, onReadSuccess = () => { }, onReadFail = () => { }, onClearClick = () => { }, customFileHandler, fileName, fileSize, progressValue, progressVariant, progressAriaLabel, progressAriaLabelledBy, progressId, buttonAriaLabel = 'Remove from list' } = _a, props = __rest(_a, ["className", "file", "fileIcon", "onReadStarted", "onReadFinished", "onReadSuccess", "onReadFail", "onClearClick", "customFileHandler", "fileName", "fileSize", "progressValue", "progressVariant", "progressAriaLabel", "progressAriaLabelledBy", "progressId", "buttonAriaLabel"]);
11 const [loadPercentage, setLoadPercentage] = React.useState(0);
12 const [loadResult, setLoadResult] = React.useState();
13 function readFile(file) {
14 return new Promise((resolve, reject) => {
15 const reader = new FileReader();
16 reader.onload = () => resolve(reader.result);
17 reader.onerror = () => reject(reader.error);
18 reader.onprogress = data => {
19 if (data.lengthComputable) {
20 setLoadPercentage((data.loaded / data.total) * 100);
21 }
22 };
23 reader.readAsDataURL(file);
24 });
25 }
26 React.useEffect(() => {
27 if (customFileHandler) {
28 customFileHandler(file);
29 }
30 else {
31 onReadStarted(file);
32 readFile(file)
33 .then(data => {
34 setLoadResult('success');
35 setLoadPercentage(100);
36 onReadFinished(file);
37 onReadSuccess(data, file);
38 })
39 .catch((error) => {
40 onReadFinished(file);
41 onReadFail(error, file);
42 setLoadResult('danger');
43 });
44 }
45 }, []);
46 const getHumanReadableFileSize = (size) => {
47 const prefixes = ['', 'K', 'M', 'G', 'T'];
48 let prefixUnit = 0;
49 while (size >= 1000) {
50 prefixUnit += 1;
51 size = size / 1000;
52 }
53 if (prefixUnit >= prefixes.length) {
54 return 'File size too large';
55 }
56 return `${Math.round(size)}${prefixes[prefixUnit]}B`;
57 };
58 const title = (React.createElement("span", { className: styles.multipleFileUploadStatusItemProgress },
59 React.createElement("span", { className: styles.multipleFileUploadStatusItemProgressText }, fileName || (file === null || file === void 0 ? void 0 : file.name) || ''),
60 React.createElement("span", { className: styles.multipleFileUploadStatusItemProgressSize }, fileSize || getHumanReadableFileSize((file === null || file === void 0 ? void 0 : file.size) || 0))));
61 return (React.createElement("li", Object.assign({ className: css(styles.multipleFileUploadStatusItem, className) }, props),
62 React.createElement("div", { className: styles.multipleFileUploadStatusItemIcon }, fileIcon || React.createElement(FileIcon, null)),
63 React.createElement("div", { className: styles.multipleFileUploadStatusItemMain },
64 React.createElement(Progress, { title: title, value: progressValue || loadPercentage, variant: progressVariant || loadResult, "aria-label": progressAriaLabel, "aria-labelledby": progressAriaLabelledBy, id: progressId })),
65 React.createElement("div", { className: styles.multipleFileUploadStatusItemClose },
66 React.createElement(Button, { variant: "plain", "aria-label": buttonAriaLabel, onClick: onClearClick },
67 React.createElement(TimesCircleIcon, null)))));
68};
69MultipleFileUploadStatusItem.displayName = 'MultipleFileUploadStatusItem';
70//# sourceMappingURL=MultipleFileUploadStatusItem.js.map
\No newline at end of file