@jzwd/vnd-design 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +259 -2
  2. package/dist/file-center/api/endpoints.d.ts +42 -0
  3. package/dist/file-center/api/endpoints.js +45 -0
  4. package/dist/file-center/api/error.d.ts +6 -0
  5. package/dist/file-center/api/error.js +34 -0
  6. package/dist/file-center/api/index.d.ts +64 -0
  7. package/dist/file-center/api/index.js +238 -0
  8. package/dist/file-center/api/request.d.ts +28 -0
  9. package/dist/file-center/api/request.js +170 -0
  10. package/dist/file-center/api/token.d.ts +10 -0
  11. package/dist/file-center/api/token.js +122 -0
  12. package/dist/file-center/components/FcFileList/index.d.ts +39 -0
  13. package/dist/file-center/components/FcFileList/index.js +804 -0
  14. package/dist/file-center/components/FcFileList/style.css +106 -0
  15. package/dist/file-center/components/FcImage/index.d.ts +30 -0
  16. package/dist/file-center/components/FcImage/index.js +144 -0
  17. package/dist/file-center/components/FcImage/style.css +14 -0
  18. package/dist/file-center/components/FcUpload/index.d.ts +5 -0
  19. package/dist/file-center/components/FcUpload/index.js +642 -0
  20. package/dist/file-center/components/FcUpload/interface.d.ts +65 -0
  21. package/dist/file-center/components/FcUpload/interface.js +1 -0
  22. package/dist/file-center/components/FcUpload/style.css +279 -0
  23. package/dist/file-center/context.d.ts +22 -0
  24. package/dist/file-center/context.js +22 -0
  25. package/dist/file-center/index.d.ts +26 -0
  26. package/dist/file-center/index.js +21 -0
  27. package/dist/file-center/types.d.ts +144 -0
  28. package/dist/file-center/types.js +1 -0
  29. package/dist/file-center/upload.d.ts +35 -0
  30. package/dist/file-center/upload.js +295 -0
  31. package/dist/file-center/utils/common.d.ts +10 -0
  32. package/dist/file-center/utils/common.js +165 -0
  33. package/dist/file-center/utils/compress.d.ts +18 -0
  34. package/dist/file-center/utils/compress.js +108 -0
  35. package/dist/file-center/utils/md5.d.ts +5 -0
  36. package/dist/file-center/utils/md5.js +41 -0
  37. package/dist/index.d.ts +11 -0
  38. package/dist/index.js +15 -0
  39. package/dist/mobile/FcImage/index.d.ts +26 -0
  40. package/dist/mobile/FcImage/index.js +114 -0
  41. package/dist/mobile/FcImage/style.css +11 -0
  42. package/dist/mobile/FcUpload/index.d.ts +74 -0
  43. package/dist/mobile/FcUpload/index.js +539 -0
  44. package/dist/mobile/FcUpload/style.css +233 -0
  45. package/dist/mobile/index.d.ts +13 -0
  46. package/dist/mobile/index.js +9 -0
  47. package/package.json +70 -4
@@ -0,0 +1,642 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
5
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
6
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
8
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
9
+ 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; }
10
+ 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; }
11
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
13
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
14
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
15
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
16
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
17
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
18
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
19
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
20
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
21
+ import { Button, Checkbox, Image, Modal, Progress, Space, Tooltip, Typography, message } from 'antd';
22
+ import { DeleteOutlined, EyeOutlined, InboxOutlined, LinkOutlined, PaperClipOutlined, PlusOutlined } from '@ant-design/icons';
23
+ import { resolveFcContext } from "../../context";
24
+ import { deleteFile, fetchReferences } from "../../api";
25
+ import { uploadFile } from "../../upload";
26
+ import { copyText, formatFileSize, getFileCategory } from "../../utils/common";
27
+ import "./style.css";
28
+ import { jsxs as _jsxs } from "react/jsx-runtime";
29
+ import { jsx as _jsx } from "react/jsx-runtime";
30
+ import { Fragment as _Fragment } from "react/jsx-runtime";
31
+ var uidSeed = 0;
32
+ function genUid() {
33
+ uidSeed += 1;
34
+ return "fc-upload-".concat(Date.now(), "-").concat(uidSeed);
35
+ }
36
+ var STAGE_TEXT = {
37
+ md5: '校验中',
38
+ uploading: '上传中',
39
+ merging: '合并中'
40
+ };
41
+
42
+ /** 引用记录列表(删除二次确认弹窗内展示) */
43
+ function ReferenceList(_ref) {
44
+ var references = _ref.references;
45
+ return /*#__PURE__*/_jsxs("div", {
46
+ className: "bc-fc-upload-refs",
47
+ children: [/*#__PURE__*/_jsxs(Typography.Paragraph, {
48
+ type: "warning",
49
+ children: ["\u8BE5\u6587\u4EF6\u88AB\u4EE5\u4E0B ", references.length, " \u6761\u4E1A\u52A1\u8BB0\u5F55\u5F15\u7528\uFF0C\u5220\u9664\u540E\u5C06\u65E0\u6CD5\u8BBF\u95EE\uFF1A"]
50
+ }), /*#__PURE__*/_jsx("ul", {
51
+ children: references.map(function (ref) {
52
+ var _ref$projectName;
53
+ return /*#__PURE__*/_jsxs("li", {
54
+ children: [/*#__PURE__*/_jsx("span", {
55
+ className: "bc-fc-upload-refs-project",
56
+ children: (_ref$projectName = ref.projectName) !== null && _ref$projectName !== void 0 ? _ref$projectName : ref.projectId
57
+ }), /*#__PURE__*/_jsxs("span", {
58
+ className: "bc-fc-upload-refs-biz",
59
+ children: [ref.bizType, " / ", ref.bizId]
60
+ }), ref.bizUrl && /*#__PURE__*/_jsxs("a", {
61
+ href: ref.bizUrl,
62
+ target: "_blank",
63
+ rel: "noopener noreferrer",
64
+ children: [/*#__PURE__*/_jsx(LinkOutlined, {}), " \u67E5\u770B\u4E1A\u52A1\u9875\u9762"]
65
+ })]
66
+ }, ref.id);
67
+ })
68
+ })]
69
+ });
70
+ }
71
+ export function FcUpload(props) {
72
+ var value = props.value,
73
+ onChange = props.onChange,
74
+ bizType = props.bizType,
75
+ bizId = props.bizId,
76
+ bizUrl = props.bizUrl,
77
+ _props$listType = props.listType,
78
+ listType = _props$listType === void 0 ? 'picture-card' : _props$listType,
79
+ _props$drag = props.drag,
80
+ drag = _props$drag === void 0 ? false : _props$drag,
81
+ maxCount = props.maxCount,
82
+ _props$maxSizeMB = props.maxSizeMB,
83
+ maxSizeMB = _props$maxSizeMB === void 0 ? 50 : _props$maxSizeMB,
84
+ accept = props.accept,
85
+ _props$multiple = props.multiple,
86
+ multiple = _props$multiple === void 0 ? false : _props$multiple,
87
+ _props$disabled = props.disabled,
88
+ disabled = _props$disabled === void 0 ? false : _props$disabled,
89
+ compress = props.compress,
90
+ instant = props.instant,
91
+ _props$deleteOnRemove = props.deleteOnRemove,
92
+ deleteOnRemove = _props$deleteOnRemove === void 0 ? false : _props$deleteOnRemove,
93
+ onUploadSuccess = props.onUploadSuccess,
94
+ onUploadError = props.onUploadError,
95
+ onPreview = props.onPreview,
96
+ _props$buttonText = props.buttonText,
97
+ buttonText = _props$buttonText === void 0 ? '上传文件' : _props$buttonText,
98
+ cardContent = props.cardContent,
99
+ className = props.className,
100
+ style = props.style;
101
+ var fcCtx = useMemo(function () {
102
+ return resolveFcContext(props);
103
+ }, [props.appKey, props.baseUrl, props.getToken]);
104
+
105
+ /* ---- 文件列表状态(受控/非受控两用) ---- */
106
+ var _useState = useState([]),
107
+ _useState2 = _slicedToArray(_useState, 2),
108
+ innerList = _useState2[0],
109
+ setInnerList = _useState2[1];
110
+ var mergedList = value !== null && value !== void 0 ? value : innerList;
111
+ var listRef = useRef(mergedList);
112
+ listRef.current = mergedList;
113
+ var emitChange = useCallback(function (next) {
114
+ if (value === undefined) setInnerList(next);
115
+ onChange === null || onChange === void 0 || onChange(next);
116
+ }, [onChange, value]);
117
+
118
+ /** 按 uid 更新列表中的单个文件项 */
119
+ var patchItem = useCallback(function (uid, patch) {
120
+ var next = listRef.current.map(function (item) {
121
+ return item.uid === uid ? _objectSpread(_objectSpread({}, item), patch) : item;
122
+ });
123
+ emitChange(next);
124
+ }, [emitChange]);
125
+ var removeItem = useCallback(function (uid) {
126
+ emitChange(listRef.current.filter(function (item) {
127
+ return item.uid !== uid;
128
+ }));
129
+ }, [emitChange]);
130
+
131
+ /* ---- 上传任务管理 ---- */
132
+ var abortRef = useRef(new Map());
133
+ var inputRef = useRef(null);
134
+ var _useState3 = useState(false),
135
+ _useState4 = _slicedToArray(_useState3, 2),
136
+ dragOver = _useState4[0],
137
+ setDragOver = _useState4[1];
138
+ var _message$useMessage = message.useMessage(),
139
+ _message$useMessage2 = _slicedToArray(_message$useMessage, 2),
140
+ messageApi = _message$useMessage2[0],
141
+ messageHolder = _message$useMessage2[1];
142
+
143
+ // 本地图片预览地址管理(上传中即可看到缩略图)
144
+ var objectUrlsRef = useRef(new Map());
145
+ useEffect(function () {
146
+ return function () {
147
+ objectUrlsRef.current.forEach(function (url) {
148
+ return URL.revokeObjectURL(url);
149
+ });
150
+ objectUrlsRef.current.clear();
151
+ };
152
+ }, []);
153
+ var doUpload = useCallback(function (rawFile) {
154
+ var uid = genUid();
155
+ var isImage = rawFile.type.startsWith('image/');
156
+ var thumbUrl;
157
+ if (isImage) {
158
+ thumbUrl = URL.createObjectURL(rawFile);
159
+ objectUrlsRef.current.set(uid, thumbUrl);
160
+ }
161
+ var item = {
162
+ uid: uid,
163
+ name: rawFile.name,
164
+ size: rawFile.size,
165
+ type: rawFile.type,
166
+ status: 'uploading',
167
+ percent: 0,
168
+ stage: 'md5',
169
+ thumbUrl: thumbUrl
170
+ };
171
+ emitChange([].concat(_toConsumableArray(listRef.current), [item]));
172
+ var controller = new AbortController();
173
+ abortRef.current.set(uid, controller);
174
+ uploadFile({
175
+ file: rawFile,
176
+ appKey: fcCtx.appKey,
177
+ baseUrl: fcCtx.baseUrl,
178
+ getToken: fcCtx.getToken,
179
+ bizType: bizType,
180
+ bizInfo: bizId ? {
181
+ bizType: bizType !== null && bizType !== void 0 ? bizType : '',
182
+ bizId: bizId,
183
+ bizUrl: bizUrl
184
+ } : undefined,
185
+ compress: compress,
186
+ instant: instant,
187
+ chunkThreshold: fcCtx.chunkThreshold,
188
+ chunkSize: fcCtx.chunkSize,
189
+ signal: controller.signal,
190
+ onProgress: function onProgress(progress) {
191
+ patchItem(uid, {
192
+ percent: progress.percent,
193
+ stage: progress.stage
194
+ });
195
+ }
196
+ }).then(function (fileInfo) {
197
+ abortRef.current.delete(uid);
198
+ patchItem(uid, {
199
+ status: 'done',
200
+ percent: 100,
201
+ fileId: fileInfo.id,
202
+ fileInfo: fileInfo,
203
+ url: fileInfo.url,
204
+ // 上传成功后统一用文件中心返回的 URL 做缩略图
205
+ thumbUrl: getFileCategory(fileInfo.mime, fileInfo.ext) === 'image' ? fileInfo.url : thumbUrl
206
+ });
207
+ onUploadSuccess === null || onUploadSuccess === void 0 || onUploadSuccess(fileInfo, _objectSpread(_objectSpread({}, item), {}, {
208
+ fileInfo: fileInfo
209
+ }));
210
+ }).catch(function (err) {
211
+ abortRef.current.delete(uid);
212
+ if (err.code === 'ABORT') {
213
+ removeItem(uid);
214
+ return;
215
+ }
216
+ patchItem(uid, {
217
+ status: 'error',
218
+ response: err.message
219
+ });
220
+ onUploadError === null || onUploadError === void 0 || onUploadError(err, _objectSpread(_objectSpread({}, item), {}, {
221
+ status: 'error'
222
+ }));
223
+ });
224
+ },
225
+ // eslint-disable-next-line react-hooks/exhaustive-deps
226
+ [emitChange, patchItem, removeItem, fcCtx, bizType, bizId, bizUrl, compress, instant, onUploadSuccess, onUploadError]);
227
+
228
+ /** 校验并接收一批文件 */
229
+ var handleFiles = useCallback(function (files) {
230
+ var fileArray = Array.from(files);
231
+ var acceptList = fileArray;
232
+
233
+ // 数量上限校验
234
+ if (maxCount !== undefined) {
235
+ var remaining = Math.max(0, maxCount - listRef.current.length);
236
+ if (remaining <= 0) {
237
+ messageApi.warning("\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxCount, " \u4E2A\u6587\u4EF6"));
238
+ return;
239
+ }
240
+ if (fileArray.length > remaining) {
241
+ messageApi.warning("\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxCount, " \u4E2A\u6587\u4EF6\uFF0C\u5DF2\u81EA\u52A8\u622A\u53D6\u524D ").concat(remaining, " \u4E2A"));
242
+ acceptList = fileArray.slice(0, remaining);
243
+ }
244
+ }
245
+ acceptList.forEach(function (file) {
246
+ // 大小上限校验
247
+ if (file.size > maxSizeMB * 1024 * 1024) {
248
+ messageApi.error("\u300A".concat(file.name, "\u300B\u8D85\u8FC7 ").concat(maxSizeMB, "MB \u5927\u5C0F\u9650\u5236\uFF0C\u5DF2\u8DF3\u8FC7"));
249
+ return;
250
+ }
251
+ if (file.size === 0) {
252
+ messageApi.error("\u300A".concat(file.name, "\u300B\u662F\u7A7A\u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7"));
253
+ return;
254
+ }
255
+ doUpload(file);
256
+ });
257
+ }, [doUpload, maxCount, maxSizeMB, messageApi]);
258
+
259
+ /* ---- 移除文件(可选同步删除文件中心文件,含引用二次确认) ---- */
260
+ var handleRemove = useCallback( /*#__PURE__*/function () {
261
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(item) {
262
+ var controller, hideLoading, _result$references, result, references, acknowledged;
263
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
264
+ while (1) switch (_context2.prev = _context2.next) {
265
+ case 0:
266
+ // 上传中:直接取消
267
+ controller = abortRef.current.get(item.uid);
268
+ if (!controller) {
269
+ _context2.next = 5;
270
+ break;
271
+ }
272
+ controller.abort();
273
+ abortRef.current.delete(item.uid);
274
+ return _context2.abrupt("return");
275
+ case 5:
276
+ if (!(!deleteOnRemove || !item.fileId)) {
277
+ _context2.next = 8;
278
+ break;
279
+ }
280
+ removeItem(item.uid);
281
+ return _context2.abrupt("return");
282
+ case 8:
283
+ hideLoading = messageApi.loading("\u6B63\u5728\u5220\u9664\u300A".concat(item.name, "\u300B..."), 0);
284
+ _context2.prev = 9;
285
+ _context2.next = 12;
286
+ return deleteFile(fcCtx, item.fileId);
287
+ case 12:
288
+ result = _context2.sent;
289
+ hideLoading();
290
+ if (!result.deleted) {
291
+ _context2.next = 18;
292
+ break;
293
+ }
294
+ removeItem(item.uid);
295
+ messageApi.success('删除成功');
296
+ return _context2.abrupt("return");
297
+ case 18:
298
+ if (!((_result$references = result.references) !== null && _result$references !== void 0)) {
299
+ _context2.next = 22;
300
+ break;
301
+ }
302
+ _context2.t0 = _result$references;
303
+ _context2.next = 25;
304
+ break;
305
+ case 22:
306
+ _context2.next = 24;
307
+ return fetchReferences(fcCtx, item.fileId);
308
+ case 24:
309
+ _context2.t0 = _context2.sent;
310
+ case 25:
311
+ references = _context2.t0;
312
+ acknowledged = false;
313
+ Modal.confirm({
314
+ title: '该文件存在业务引用,确认删除?',
315
+ width: 560,
316
+ icon: /*#__PURE__*/_jsx(DeleteOutlined, {}),
317
+ content: /*#__PURE__*/_jsxs("div", {
318
+ children: [/*#__PURE__*/_jsx(ReferenceList, {
319
+ references: references
320
+ }), /*#__PURE__*/_jsx(Checkbox, {
321
+ onChange: function onChange(e) {
322
+ acknowledged = e.target.checked;
323
+ },
324
+ children: "\u6211\u5DF2\u77E5\u6653\u5F71\u54CD\u8303\u56F4\uFF0C\u786E\u8BA4\u5220\u9664"
325
+ })]
326
+ }),
327
+ okText: '删除',
328
+ okButtonProps: {
329
+ danger: true
330
+ },
331
+ cancelText: '取消',
332
+ onOk: function () {
333
+ var _onOk = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
334
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
335
+ while (1) switch (_context.prev = _context.next) {
336
+ case 0:
337
+ if (acknowledged) {
338
+ _context.next = 3;
339
+ break;
340
+ }
341
+ messageApi.warning('请先勾选「我已知晓影响范围」');
342
+ return _context.abrupt("return", Promise.reject());
343
+ case 3:
344
+ _context.next = 5;
345
+ return deleteFile(fcCtx, item.fileId, {
346
+ force: true
347
+ });
348
+ case 5:
349
+ removeItem(item.uid);
350
+ messageApi.success('删除成功');
351
+ case 7:
352
+ case "end":
353
+ return _context.stop();
354
+ }
355
+ }, _callee);
356
+ }));
357
+ function onOk() {
358
+ return _onOk.apply(this, arguments);
359
+ }
360
+ return onOk;
361
+ }()
362
+ });
363
+ _context2.next = 34;
364
+ break;
365
+ case 30:
366
+ _context2.prev = 30;
367
+ _context2.t1 = _context2["catch"](9);
368
+ hideLoading();
369
+ messageApi.error(_context2.t1 instanceof Error ? _context2.t1.message : '删除失败');
370
+ case 34:
371
+ case "end":
372
+ return _context2.stop();
373
+ }
374
+ }, _callee2, null, [[9, 30]]);
375
+ }));
376
+ return function (_x) {
377
+ return _ref2.apply(this, arguments);
378
+ };
379
+ }(), [deleteOnRemove, fcCtx, messageApi, removeItem]);
380
+
381
+ /* ---- 预览 / 复制链接 ---- */
382
+ var _useState5 = useState(null),
383
+ _useState6 = _slicedToArray(_useState5, 2),
384
+ previewSrc = _useState6[0],
385
+ setPreviewSrc = _useState6[1];
386
+ var handlePreview = useCallback(function (item) {
387
+ var _item$url, _item$fileInfo, _ref3, _item$fileInfo$mime, _item$fileInfo2, _item$fileInfo3;
388
+ if (onPreview) {
389
+ onPreview(item);
390
+ return;
391
+ }
392
+ var url = (_item$url = item.url) !== null && _item$url !== void 0 ? _item$url : (_item$fileInfo = item.fileInfo) === null || _item$fileInfo === void 0 ? void 0 : _item$fileInfo.url;
393
+ if (!url) return;
394
+ var category = getFileCategory((_ref3 = (_item$fileInfo$mime = (_item$fileInfo2 = item.fileInfo) === null || _item$fileInfo2 === void 0 ? void 0 : _item$fileInfo2.mime) !== null && _item$fileInfo$mime !== void 0 ? _item$fileInfo$mime : item.type) !== null && _ref3 !== void 0 ? _ref3 : '', (_item$fileInfo3 = item.fileInfo) === null || _item$fileInfo3 === void 0 ? void 0 : _item$fileInfo3.ext);
395
+ if (category === 'image') {
396
+ setPreviewSrc(url);
397
+ } else {
398
+ window.open(url, '_blank', 'noopener');
399
+ }
400
+ }, [onPreview]);
401
+ var handleCopyUrl = useCallback( /*#__PURE__*/function () {
402
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(item) {
403
+ var _item$url2, _item$fileInfo4;
404
+ var url, ok;
405
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
406
+ while (1) switch (_context3.prev = _context3.next) {
407
+ case 0:
408
+ url = (_item$url2 = item.url) !== null && _item$url2 !== void 0 ? _item$url2 : (_item$fileInfo4 = item.fileInfo) === null || _item$fileInfo4 === void 0 ? void 0 : _item$fileInfo4.url;
409
+ if (url) {
410
+ _context3.next = 3;
411
+ break;
412
+ }
413
+ return _context3.abrupt("return");
414
+ case 3:
415
+ _context3.next = 5;
416
+ return copyText(url);
417
+ case 5:
418
+ ok = _context3.sent;
419
+ if (ok) messageApi.success('链接已复制');else messageApi.error('复制失败,请手动复制');
420
+ case 7:
421
+ case "end":
422
+ return _context3.stop();
423
+ }
424
+ }, _callee3);
425
+ }));
426
+ return function (_x2) {
427
+ return _ref4.apply(this, arguments);
428
+ };
429
+ }(), [messageApi]);
430
+
431
+ /* ---- 渲染 ---- */
432
+ var isCard = listType === 'picture-card';
433
+ var inputAcceptMemo = useMemo(function () {
434
+ return accept;
435
+ }, [accept]);
436
+ var renderThumb = function renderThumb(item) {
437
+ var _item$thumbUrl, _ref5, _item$fileInfo$mime2, _item$fileInfo5, _item$fileInfo6;
438
+ var thumb = (_item$thumbUrl = item.thumbUrl) !== null && _item$thumbUrl !== void 0 ? _item$thumbUrl : getFileCategory((_ref5 = (_item$fileInfo$mime2 = (_item$fileInfo5 = item.fileInfo) === null || _item$fileInfo5 === void 0 ? void 0 : _item$fileInfo5.mime) !== null && _item$fileInfo$mime2 !== void 0 ? _item$fileInfo$mime2 : item.type) !== null && _ref5 !== void 0 ? _ref5 : '', (_item$fileInfo6 = item.fileInfo) === null || _item$fileInfo6 === void 0 ? void 0 : _item$fileInfo6.ext) === 'image' ? item.url : undefined;
439
+ if (thumb) {
440
+ return /*#__PURE__*/_jsx("img", {
441
+ className: "bc-fc-upload-thumb",
442
+ src: thumb,
443
+ alt: item.name
444
+ });
445
+ }
446
+ return /*#__PURE__*/_jsx("span", {
447
+ className: "bc-fc-upload-fileicon",
448
+ children: /*#__PURE__*/_jsx(PaperClipOutlined, {})
449
+ });
450
+ };
451
+ var renderActions = function renderActions(item) {
452
+ var done = item.status === 'done';
453
+ return /*#__PURE__*/_jsxs("span", {
454
+ className: "bc-fc-upload-actions",
455
+ children: [done && /*#__PURE__*/_jsxs(_Fragment, {
456
+ children: [/*#__PURE__*/_jsx(Tooltip, {
457
+ title: "\u9884\u89C8",
458
+ children: /*#__PURE__*/_jsx(EyeOutlined, {
459
+ onClick: function onClick() {
460
+ return handlePreview(item);
461
+ }
462
+ })
463
+ }), /*#__PURE__*/_jsx(Tooltip, {
464
+ title: "\u590D\u5236\u94FE\u63A5",
465
+ children: /*#__PURE__*/_jsx(LinkOutlined, {
466
+ onClick: function onClick() {
467
+ return handleCopyUrl(item);
468
+ }
469
+ })
470
+ })]
471
+ }), /*#__PURE__*/_jsx(Tooltip, {
472
+ title: item.status === 'uploading' ? '取消上传' : '删除',
473
+ children: /*#__PURE__*/_jsx(DeleteOutlined, {
474
+ onClick: function onClick() {
475
+ return handleRemove(item);
476
+ }
477
+ })
478
+ })]
479
+ });
480
+ };
481
+ var renderStatus = function renderStatus(item) {
482
+ if (item.status === 'uploading') {
483
+ var _item$percent, _item$stage, _item$percent2;
484
+ return /*#__PURE__*/_jsxs("div", {
485
+ className: "bc-fc-upload-progress",
486
+ children: [/*#__PURE__*/_jsx(Progress, {
487
+ percent: (_item$percent = item.percent) !== null && _item$percent !== void 0 ? _item$percent : 0,
488
+ size: "small",
489
+ status: "active",
490
+ showInfo: false
491
+ }), /*#__PURE__*/_jsxs("span", {
492
+ className: "bc-fc-upload-stage",
493
+ children: [STAGE_TEXT[(_item$stage = item.stage) !== null && _item$stage !== void 0 ? _item$stage : 'uploading'], " ", (_item$percent2 = item.percent) !== null && _item$percent2 !== void 0 ? _item$percent2 : 0, "%"]
494
+ })]
495
+ });
496
+ }
497
+ if (item.status === 'error') {
498
+ return /*#__PURE__*/_jsx(Tooltip, {
499
+ title: typeof item.response === 'string' ? item.response : '上传失败',
500
+ children: /*#__PURE__*/_jsx("span", {
501
+ className: "bc-fc-upload-error",
502
+ children: item.response || '上传失败'
503
+ })
504
+ });
505
+ }
506
+ return null;
507
+ };
508
+ var cardNodes = mergedList.map(function (item) {
509
+ var _item$status, _item$percent3, _item$stage2;
510
+ return /*#__PURE__*/_jsx("div", {
511
+ className: "bc-fc-upload-item bc-fc-upload-item-".concat(isCard ? 'card' : 'row', " bc-fc-upload-item-").concat((_item$status = item.status) !== null && _item$status !== void 0 ? _item$status : 'done'),
512
+ children: isCard ? /*#__PURE__*/_jsxs("div", {
513
+ className: "bc-fc-upload-card",
514
+ children: [renderThumb(item), item.status === 'uploading' && /*#__PURE__*/_jsxs("div", {
515
+ className: "bc-fc-upload-card-mask",
516
+ children: [/*#__PURE__*/_jsx(Progress, {
517
+ type: "circle",
518
+ percent: (_item$percent3 = item.percent) !== null && _item$percent3 !== void 0 ? _item$percent3 : 0,
519
+ size: 48
520
+ }), /*#__PURE__*/_jsx("span", {
521
+ children: STAGE_TEXT[(_item$stage2 = item.stage) !== null && _item$stage2 !== void 0 ? _item$stage2 : 'uploading']
522
+ })]
523
+ }), item.status === 'error' && /*#__PURE__*/_jsx("div", {
524
+ className: "bc-fc-upload-card-mask bc-fc-upload-card-mask-error",
525
+ children: "\u4E0A\u4F20\u5931\u8D25"
526
+ }), /*#__PURE__*/_jsxs("div", {
527
+ className: "bc-fc-upload-card-hover",
528
+ children: [renderActions(item), item.fileInfo && /*#__PURE__*/_jsx("span", {
529
+ className: "bc-fc-upload-size",
530
+ children: formatFileSize(item.fileInfo.size)
531
+ })]
532
+ })]
533
+ }) : /*#__PURE__*/_jsxs("div", {
534
+ className: "bc-fc-upload-row",
535
+ children: [listType === 'picture' && renderThumb(item), /*#__PURE__*/_jsxs("div", {
536
+ className: "bc-fc-upload-row-main",
537
+ children: [/*#__PURE__*/_jsx("span", {
538
+ className: "bc-fc-upload-name ".concat(item.status === 'done' ? 'bc-fc-upload-name-link' : ''),
539
+ onClick: function onClick() {
540
+ return item.status === 'done' && handlePreview(item);
541
+ },
542
+ children: item.name
543
+ }), item.fileInfo && /*#__PURE__*/_jsx("span", {
544
+ className: "bc-fc-upload-size",
545
+ children: formatFileSize(item.fileInfo.size)
546
+ }), renderStatus(item)]
547
+ }), renderActions(item)]
548
+ })
549
+ }, item.uid);
550
+ });
551
+ var uploadEntry = !disabled && (maxCount === undefined || mergedList.length < maxCount) && (isCard ? /*#__PURE__*/_jsx("button", {
552
+ type: "button",
553
+ className: "bc-fc-upload-card bc-fc-upload-card-add",
554
+ onClick: function onClick() {
555
+ var _inputRef$current;
556
+ return (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.click();
557
+ },
558
+ children: cardContent !== null && cardContent !== void 0 ? cardContent : /*#__PURE__*/_jsxs(_Fragment, {
559
+ children: [/*#__PURE__*/_jsx(PlusOutlined, {}), /*#__PURE__*/_jsx("span", {
560
+ className: "bc-fc-upload-add-text",
561
+ children: "\u4E0A\u4F20"
562
+ })]
563
+ })
564
+ }) : drag ? /*#__PURE__*/_jsxs("div", {
565
+ className: "bc-fc-upload-dragger ".concat(dragOver ? 'bc-fc-upload-dragger-over' : ''),
566
+ onClick: function onClick() {
567
+ var _inputRef$current2;
568
+ return (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.click();
569
+ },
570
+ onDragOver: function onDragOver(e) {
571
+ e.preventDefault();
572
+ setDragOver(true);
573
+ },
574
+ onDragLeave: function onDragLeave() {
575
+ return setDragOver(false);
576
+ },
577
+ onDrop: function onDrop(e) {
578
+ e.preventDefault();
579
+ setDragOver(false);
580
+ if (!disabled) handleFiles(e.dataTransfer.files);
581
+ },
582
+ children: [/*#__PURE__*/_jsx("p", {
583
+ className: "bc-fc-upload-dragger-icon",
584
+ children: /*#__PURE__*/_jsx(InboxOutlined, {})
585
+ }), /*#__PURE__*/_jsx("p", {
586
+ children: "\u70B9\u51FB\u6216\u62D6\u62FD\u6587\u4EF6\u5230\u6B64\u533A\u57DF\u4E0A\u4F20"
587
+ }), /*#__PURE__*/_jsxs("p", {
588
+ className: "bc-fc-upload-dragger-tip",
589
+ children: ["\u5355\u4E2A\u6587\u4EF6\u4E0D\u8D85\u8FC7 ", maxSizeMB, "MB", maxCount !== undefined ? "\uFF0C\u6700\u591A ".concat(maxCount, " \u4E2A") : '']
590
+ })]
591
+ }) : /*#__PURE__*/_jsx(Button, {
592
+ icon: /*#__PURE__*/_jsx(PlusOutlined, {}),
593
+ onClick: function onClick() {
594
+ var _inputRef$current3;
595
+ return (_inputRef$current3 = inputRef.current) === null || _inputRef$current3 === void 0 ? void 0 : _inputRef$current3.click();
596
+ },
597
+ children: buttonText
598
+ }));
599
+ return /*#__PURE__*/_jsxs("div", {
600
+ className: "bc-fc-upload ".concat(isCard ? 'bc-fc-upload-card-mode' : 'bc-fc-upload-list-mode', " ").concat(className !== null && className !== void 0 ? className : ''),
601
+ style: style,
602
+ children: [/*#__PURE__*/_jsx("input", {
603
+ ref: inputRef,
604
+ type: "file",
605
+ style: {
606
+ display: 'none'
607
+ },
608
+ accept: inputAcceptMemo,
609
+ multiple: multiple,
610
+ onChange: function onChange(e) {
611
+ var _e$target$files;
612
+ if ((_e$target$files = e.target.files) !== null && _e$target$files !== void 0 && _e$target$files.length) handleFiles(e.target.files);
613
+ // 清空,保证选择同一文件也能再次触发
614
+ e.target.value = '';
615
+ }
616
+ }), isCard ? /*#__PURE__*/_jsxs("div", {
617
+ className: "bc-fc-upload-grid",
618
+ children: [cardNodes, uploadEntry]
619
+ }) : /*#__PURE__*/_jsxs(Space, {
620
+ direction: "vertical",
621
+ style: {
622
+ width: '16em'
623
+ },
624
+ children: [uploadEntry, cardNodes.length > 0 && /*#__PURE__*/_jsx("div", {
625
+ className: "bc-fc-upload-rows",
626
+ children: cardNodes
627
+ })]
628
+ }), previewSrc && /*#__PURE__*/_jsx(Image, {
629
+ style: {
630
+ display: 'none'
631
+ },
632
+ preview: {
633
+ visible: true,
634
+ src: previewSrc,
635
+ onVisibleChange: function onVisibleChange(visible) {
636
+ if (!visible) setPreviewSrc(null);
637
+ }
638
+ }
639
+ }), messageHolder]
640
+ });
641
+ }
642
+ export default FcUpload;