UNPKG

@e-group/material-lab

Version:

EGroup Team Lab - Incubator for EGroup Team experimental React components.

118 lines (112 loc) 5.75 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import React from 'react'; import { useDropzone } from 'react-dropzone'; import { Typography, CircularProgress, withStyles, createStyles } from '@material-ui/core'; import CloudUploadIcon from '@material-ui/icons/CloudUpload'; import clsx from 'clsx'; const styles = theme => 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 = 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.createElement("div", { className: classes.center }, /*#__PURE__*/React.createElement(CircularProgress, { variant: "determinate", color: "inherit", className: classes.icon, value: completed }), /*#__PURE__*/React.createElement(Typography, { align: "center", gutterBottom: true }, "\u6A94\u6848\u4E0A\u50B3\u4E2D... ", completed, "%"), /*#__PURE__*/React.createElement(Typography, { align: "center", color: "textSecondary" }, msg)); } return /*#__PURE__*/React.createElement("div", { className: classes.center }, /*#__PURE__*/React.createElement(CloudUploadIcon, { color: "inherit", className: classes.icon }), /*#__PURE__*/React.createElement(Typography, { align: "center", gutterBottom: true }, isDragActive ? '放開檔案開始上傳' : '從這裡上傳檔案'), /*#__PURE__*/React.createElement(Typography, { align: "center", color: "textSecondary" }, isDragActive ? '拖移至這裡的檔案將開始上傳' : '拖移檔案至此,或點擊開始上傳')); }; return /*#__PURE__*/React.createElement("div", _extends({ className: clsx(classes.root, { [classes.dragActive]: isDragActive }) }, getRootProps()), /*#__PURE__*/React.createElement("input", _extends({ ref: inputRef }, getInputProps(), { multiple: multiple })), renderContent()); }; export default withStyles(styles, { name: 'EgFileUploadDropzone' })(FileUploadDropzone);