UNPKG

ango-react-components

Version:
149 lines (148 loc) 5.7 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __spreadArray = (this && this.__spreadArray) || function (to, from) { for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) to[j] = from[i]; return to; }; import React, { useRef, useState } from 'react'; import axios from 'axios'; import UploadList from './uploadList'; import Dragger from './dragger'; export var Upload = function (props) { var action = props.action, defaultFileList = props.defaultFileList, beforeUpload = props.beforeUpload, onProgress = props.onProgress, onSuccess = props.onSuccess, onError = props.onError, onChange = props.onChange, onRemove = props.onRemove, name = props.name, headers = props.headers, data = props.data, withCredentials = props.withCredentials, accept = props.accept, multiple = props.multiple, children = props.children, drag = props.drag; var fileInput = useRef(null); var _a = useState(defaultFileList || []), fileList = _a[0], setFileList = _a[1]; var updateFileList = function (updateFile, updateObj) { setFileList(function (prevList) { return prevList.map(function (file) { if (file.uid === updateFile.uid) { return __assign(__assign({}, file), updateObj); } else { return file; } }); }); }; var handleClick = function () { if (fileInput.current) { fileInput.current.click(); } }; var handleFileChange = function (e) { var files = e.target.files; if (!files) { return; } uploadFiles(files); if (fileInput.current) { fileInput.current.value = ''; } }; var handleRemove = function (file) { setFileList(function (prevList) { return prevList.filter(function (item) { return item.uid !== file.uid; }); }); if (onRemove) { onRemove(file); } }; var uploadFiles = function (files) { var postFiles = Array.from(files); postFiles.forEach(function (file) { if (!beforeUpload) { post(file); } else { var result = beforeUpload(file); if (result && result instanceof Promise) { result.then(function (processedFile) { post(processedFile); }); } else if (result !== false) { post(file); } } }); }; var post = function (file) { var _file = { uid: Date.now() + 'upload-file', status: 'ready', name: file.name, size: file.size, percent: 0, raw: file, }; setFileList(function (prevList) { return __spreadArray([_file], prevList); }); var formData = new FormData(); formData.append(name || 'file', file); if (data) { Object.keys(data).forEach(function (key) { formData.append(key, data[key]); }); } axios .post(action, formData, { headers: __assign(__assign({}, headers), { 'Content-Type': 'multipart/form-data' }), withCredentials: withCredentials, onUploadProgress: function (e) { var percentage = Math.round((e.loaded * 100) / e.total) || 0; if (percentage < 100) { updateFileList(_file, { percent: percentage, status: 'uploading', }); if (onProgress) { onProgress(percentage, file); } } }, }) .then(function (resp) { updateFileList(_file, { status: 'success', response: resp.data, }); if (onSuccess) { onSuccess(resp.data, file); } if (onChange) { onChange(file); } }) .catch(function (err) { updateFileList(_file, { status: 'error', error: err }); if (onError) { onError(err, file); } if (onChange) { onChange(file); } }); }; return (React.createElement("div", { className: "ango-upload-component" }, React.createElement("div", { className: "ango-upload-input", style: { display: 'inline-block' }, onClick: handleClick }, drag ? (React.createElement(Dragger, { onFile: function (files) { uploadFiles(files); } }, children)) : (children), React.createElement("input", { className: "ango-file-input", style: { display: 'none' }, ref: fileInput, onChange: handleFileChange, type: "file", accept: accept, multiple: multiple })), React.createElement(UploadList, { fileList: fileList, onRemove: handleRemove }))); }; Upload.defaultProps = { name: 'file', }; export default Upload;