@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
122 lines (121 loc) • 4.51 kB
JavaScript
"use client";
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
const _excluded = ["value", "format", "className", "variant", "listType", "download", "displaySize", "onFileClick"];
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
import React, { useMemo, useState } from 'react';
import classnames from 'classnames';
import { useValueProps } from '../../hooks';
import ValueBlock from '../../ValueBlock';
import ListFormat from '../../../../components/list-format';
import { getFileIcon } from '../../../../components/upload/UploadFileListCell';
import { BYTES_IN_A_MEGA_BYTE } from '../../../../components/upload/UploadVerify';
import { transformFiles } from '../../Field/Upload/Upload';
import { format } from '../../../../components/number-format/NumberUtils';
import { UploadFileLink } from '../../../../components/upload/UploadFileListLink';
import { isAsync } from '../../../../shared/helpers/isAsync';
function Upload(props) {
const preparedProps = _objectSpread({
fromExternal: transformFiles
}, props);
const _useValueProps = useValueProps(preparedProps),
{
value,
format,
className,
variant = 'text',
listType,
download = false,
displaySize = false,
onFileClick
} = _useValueProps,
rest = _objectWithoutProperties(_useValueProps, _excluded);
const list = useMemo(() => {
const valueToUse = (value === null || value === void 0 ? void 0 : value.map((uploadFile, index) => {
if (!uploadFile) {
return;
}
return React.createElement(UploadFileItem, {
key: index,
uploadFile: uploadFile,
download: download,
displaySize: displaySize,
onFileClick: onFileClick
});
})) || undefined;
if (valueToUse) {
return React.createElement(ListFormat, {
value: valueToUse,
format: format,
variant: variant,
listType: listType
});
}
}, [value, download, displaySize, onFileClick, format, variant, listType]);
return React.createElement(ValueBlock, _extends({
className: classnames('dnb-forms-value-upload', className)
}, rest), list);
}
function getSize(size) {
if (!size) {
return;
}
const sizeInMb = size / BYTES_IN_A_MEGA_BYTE;
return ` (${format(sizeInMb, {
decimals: 0
})} MB)`;
}
Upload._supportsSpacingProps = true;
export default Upload;
function UploadFileItem(props) {
const {
uploadFile,
download = false,
displaySize = false,
onFileClick
} = props;
const [loading, setLoading] = useState(false);
const {
file,
isLoading: fileIsLoading
} = uploadFile || {};
if (!file) {
return null;
}
const handleFileClickAsync = async uploadFile => {
setLoading(true);
await onFileClick({
fileItem: uploadFile
});
setLoading(false);
};
const onFileClickHandler = async () => {
if (typeof onFileClick === 'function') {
if (isAsync(onFileClick)) {
handleFileClickAsync(uploadFile);
} else {
onFileClick({
fileItem: uploadFile
});
}
}
};
const imageUrl = (file === null || file === void 0 ? void 0 : file.size) > 0 ? URL.createObjectURL(file) : null;
const text = file.name + (displaySize ? ' ' + getSize(file.size) : '');
const isLoading = fileIsLoading || loading;
return React.createElement("span", {
className: "dnb-forms-value-upload__item"
}, getFileIcon(file, {
isLoading,
size: 'medium'
}, false), React.createElement(UploadFileLink, {
left: "x-small",
text: text,
href: imageUrl,
download: download,
onClick: onFileClick && onFileClickHandler
}));
}
//# sourceMappingURL=Upload.js.map