1 | import { __rest } from "tslib";
|
2 | import * as React from 'react';
|
3 | import styles from '@patternfly/react-styles/css/components/MultipleFileUpload/multiple-file-upload';
|
4 | import { css } from '@patternfly/react-styles';
|
5 | import { Progress } from '../Progress';
|
6 | import { Button } from '../Button';
|
7 | import FileIcon from '@patternfly/react-icons/dist/esm/icons/file-icon';
|
8 | import TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';
|
9 | export 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 | };
|
69 | MultipleFileUploadStatusItem.displayName = 'MultipleFileUploadStatusItem';
|
70 |
|
\ | No newline at end of file |