@e-group/material-lab
Version:
EGroup Team Lab - Incubator for EGroup Team experimental React components.
134 lines (119 loc) • 6.25 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _react = _interopRequireDefault(require("react"));
var _reactDropzone = require("react-dropzone");
var _core = require("@material-ui/core");
var _CloudUpload = _interopRequireDefault(require("@material-ui/icons/CloudUpload"));
var _clsx = _interopRequireDefault(require("clsx"));
const styles = theme => (0, _core.createStyles)({
// https://jsfiddle.net/prafuitu/vmL0ys1u/
root: {
'--border-color': theme.palette.text.secondary,
'--border-weight': '2px',
'--dash-size': '8px',
'--gap-size': '8px',
position: 'relative',
width: '100%',
height: '100%',
minHeight: 200,
outline: 'none',
cursor: props => props.uploading ? 'auto' : 'pointer',
'&::after': {
content: '""',
transition: 'all .6s ease',
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
background: "\n linear-gradient(90deg, var(--border-color) 100%, transparent 100%) top left no-repeat,\n linear-gradient(90deg, transparent calc(var(--gap-size) / 2), var(--border-color) calc(var(--gap-size) / 2), var(--border-color) calc(var(--gap-size) / 2 + var(--dash-size)), transparent calc(var(--gap-size) / 2 + var(--dash-size))) top center repeat-x,\n linear-gradient(90deg, var(--border-color) 100%, transparent 100%) top right no-repeat,\n \n linear-gradient(0deg, var(--border-color) 100%, transparent 100%) top left no-repeat,\n linear-gradient(0deg, transparent calc(var(--gap-size) / 2), var(--border-color) calc(var(--gap-size) / 2), var(--border-color) calc(var(--gap-size) / 2 + var(--dash-size)), transparent calc(var(--gap-size) / 2 + var(--dash-size))) center left repeat-y,\n linear-gradient(0deg, var(--border-color) 100%, transparent 100%) bottom left no-repeat,\n \n linear-gradient(90deg, var(--border-color) 100%, transparent 100%) bottom left no-repeat,\n linear-gradient(90deg, transparent calc(var(--gap-size) / 2), var(--border-color) calc(var(--gap-size) / 2), var(--border-color) calc(var(--gap-size) / 2 + var(--dash-size)), transparent calc(var(--gap-size) / 2 + var(--dash-size))) bottom center repeat-x,\n linear-gradient(90deg, var(--border-color) 100%, transparent 100%) bottom right no-repeat,\n \n linear-gradient(0deg, var(--border-color) 100%, transparent 100%) top right no-repeat,\n linear-gradient(0deg, transparent calc(var(--gap-size) / 2), var(--border-color) calc(var(--gap-size) / 2), var(--border-color) calc(var(--gap-size) / 2 + var(--dash-size)), transparent calc(var(--gap-size) / 2 + var(--dash-size))) center right repeat-y,\n linear-gradient(0deg, var(--border-color) 100%, transparent 100%) bottom right no-repeat;\n background-size: var(--dash-size) var(--border-weight), calc(var(--dash-size) + var(--gap-size)) var(--border-weight), var(--dash-size) var(--border-weight), var(--border-weight) var(--dash-size), var(--border-weight) calc(var(--dash-size) + var(--gap-size)), var(--border-weight) var(--dash-size)"
}
},
dragActive: {
'--border-color': theme.palette.text.primary,
backgroundColor: theme.palette.background.default
},
center: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'column',
position: 'absolute',
left: '50%',
top: '50%',
transform: 'translate(-50%, -50%)',
zIndex: 1
},
icon: {
fontSize: 40,
marginBottom: theme.spacing(2)
}
});
const FileUploadDropzone = ({
classes,
onDrop: onDropProp,
uploading,
accept,
multiple = false,
completed,
inputRef
}) => {
const _useDropzone = (0, _reactDropzone.useDropzone)({
onDrop: onDropProp,
accept,
disabled: uploading
}),
getRootProps = _useDropzone.getRootProps,
getInputProps = _useDropzone.getInputProps,
isDragActive = _useDropzone.isDragActive,
acceptedFiles = _useDropzone.acceptedFiles;
const renderContent = () => {
if (uploading) {
const msg = acceptedFiles.length > 1 ? "".concat(acceptedFiles[0].name, " \u548C\u5176\u4ED6 ").concat(acceptedFiles.length - 1, " \u500B\u6A94\u6848") : acceptedFiles[0].name;
return /*#__PURE__*/_react.default.createElement("div", {
className: classes.center
}, /*#__PURE__*/_react.default.createElement(_core.CircularProgress, {
variant: "determinate",
color: "inherit",
className: classes.icon,
value: completed
}), /*#__PURE__*/_react.default.createElement(_core.Typography, {
align: "center",
gutterBottom: true
}, "\u6A94\u6848\u4E0A\u50B3\u4E2D... ", completed, "%"), /*#__PURE__*/_react.default.createElement(_core.Typography, {
align: "center",
color: "textSecondary"
}, msg));
}
return /*#__PURE__*/_react.default.createElement("div", {
className: classes.center
}, /*#__PURE__*/_react.default.createElement(_CloudUpload.default, {
color: "inherit",
className: classes.icon
}), /*#__PURE__*/_react.default.createElement(_core.Typography, {
align: "center",
gutterBottom: true
}, isDragActive ? '放開檔案開始上傳' : '從這裡上傳檔案'), /*#__PURE__*/_react.default.createElement(_core.Typography, {
align: "center",
color: "textSecondary"
}, isDragActive ? '拖移至這裡的檔案將開始上傳' : '拖移檔案至此,或點擊開始上傳'));
};
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
className: (0, _clsx.default)(classes.root, {
[classes.dragActive]: isDragActive
})
}, getRootProps()), /*#__PURE__*/_react.default.createElement("input", (0, _extends2.default)({
ref: inputRef
}, getInputProps(), {
multiple: multiple
})), renderContent());
};
var _default = (0, _core.withStyles)(styles, {
name: 'EgFileUploadDropzone'
})(FileUploadDropzone);
exports.default = _default;