@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.
- package/README.md +259 -2
- package/dist/file-center/api/endpoints.d.ts +42 -0
- package/dist/file-center/api/endpoints.js +45 -0
- package/dist/file-center/api/error.d.ts +6 -0
- package/dist/file-center/api/error.js +34 -0
- package/dist/file-center/api/index.d.ts +64 -0
- package/dist/file-center/api/index.js +238 -0
- package/dist/file-center/api/request.d.ts +28 -0
- package/dist/file-center/api/request.js +170 -0
- package/dist/file-center/api/token.d.ts +10 -0
- package/dist/file-center/api/token.js +122 -0
- package/dist/file-center/components/FcFileList/index.d.ts +39 -0
- package/dist/file-center/components/FcFileList/index.js +804 -0
- package/dist/file-center/components/FcFileList/style.css +106 -0
- package/dist/file-center/components/FcImage/index.d.ts +30 -0
- package/dist/file-center/components/FcImage/index.js +144 -0
- package/dist/file-center/components/FcImage/style.css +14 -0
- package/dist/file-center/components/FcUpload/index.d.ts +5 -0
- package/dist/file-center/components/FcUpload/index.js +642 -0
- package/dist/file-center/components/FcUpload/interface.d.ts +65 -0
- package/dist/file-center/components/FcUpload/interface.js +1 -0
- package/dist/file-center/components/FcUpload/style.css +279 -0
- package/dist/file-center/context.d.ts +22 -0
- package/dist/file-center/context.js +22 -0
- package/dist/file-center/index.d.ts +26 -0
- package/dist/file-center/index.js +21 -0
- package/dist/file-center/types.d.ts +144 -0
- package/dist/file-center/types.js +1 -0
- package/dist/file-center/upload.d.ts +35 -0
- package/dist/file-center/upload.js +295 -0
- package/dist/file-center/utils/common.d.ts +10 -0
- package/dist/file-center/utils/common.js +165 -0
- package/dist/file-center/utils/compress.d.ts +18 -0
- package/dist/file-center/utils/compress.js +108 -0
- package/dist/file-center/utils/md5.d.ts +5 -0
- package/dist/file-center/utils/md5.js +41 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +15 -0
- package/dist/mobile/FcImage/index.d.ts +26 -0
- package/dist/mobile/FcImage/index.js +114 -0
- package/dist/mobile/FcImage/style.css +11 -0
- package/dist/mobile/FcUpload/index.d.ts +74 -0
- package/dist/mobile/FcUpload/index.js +539 -0
- package/dist/mobile/FcUpload/style.css +233 -0
- package/dist/mobile/index.d.ts +13 -0
- package/dist/mobile/index.js +9 -0
- package/package.json +70 -4
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import SparkMD5 from 'spark-md5';
|
|
2
|
+
|
|
3
|
+
/** 分片读取块大小:2MB */
|
|
4
|
+
var READ_CHUNK_SIZE = 2 * 1024 * 1024;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 计算文件 MD5(分片读取,避免大文件一次性进内存)
|
|
8
|
+
* @param onProgress 进度回调(0-100)
|
|
9
|
+
*/
|
|
10
|
+
export function calcFileMd5(file, onProgress) {
|
|
11
|
+
return new Promise(function (resolve, reject) {
|
|
12
|
+
var spark = new SparkMD5.ArrayBuffer();
|
|
13
|
+
var reader = new FileReader();
|
|
14
|
+
var offset = 0;
|
|
15
|
+
var loadNext = function loadNext() {
|
|
16
|
+
reader.readAsArrayBuffer(file.slice(offset, offset + READ_CHUNK_SIZE));
|
|
17
|
+
};
|
|
18
|
+
reader.onload = function (event) {
|
|
19
|
+
var _event$target;
|
|
20
|
+
if (!((_event$target = event.target) !== null && _event$target !== void 0 && _event$target.result)) {
|
|
21
|
+
reject(new Error('读取文件失败'));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
spark.append(event.target.result);
|
|
25
|
+
offset += READ_CHUNK_SIZE;
|
|
26
|
+
onProgress === null || onProgress === void 0 || onProgress(Math.min(100, Math.round(offset / file.size * 100)));
|
|
27
|
+
if (offset < file.size) {
|
|
28
|
+
loadNext();
|
|
29
|
+
} else {
|
|
30
|
+
var md5 = spark.end();
|
|
31
|
+
spark.destroy();
|
|
32
|
+
resolve(md5);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
reader.onerror = function () {
|
|
36
|
+
spark.destroy();
|
|
37
|
+
reject(new Error('读取文件失败'));
|
|
38
|
+
};
|
|
39
|
+
loadNext();
|
|
40
|
+
});
|
|
41
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vnd design 组件库主入口
|
|
3
|
+
*
|
|
4
|
+
* 设计理念:Vnd design 继承 antd 的全部组件。
|
|
5
|
+
* 业务方只需从 '@jzwd/vnd-design'(Vnd design)一个入口引入:
|
|
6
|
+
* - antd 组件(Button / Table / Form ... 全量再导出)
|
|
7
|
+
* - Vnd design 自有业务组件(文件中心 FcUpload / FcImage / FcFileList 等)
|
|
8
|
+
* 无需再从 antd 单独引一次。
|
|
9
|
+
*/
|
|
10
|
+
export * from 'antd';
|
|
11
|
+
export * from './file-center';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vnd design 组件库主入口
|
|
3
|
+
*
|
|
4
|
+
* 设计理念:Vnd design 继承 antd 的全部组件。
|
|
5
|
+
* 业务方只需从 '@jzwd/vnd-design'(Vnd design)一个入口引入:
|
|
6
|
+
* - antd 组件(Button / Table / Form ... 全量再导出)
|
|
7
|
+
* - Vnd design 自有业务组件(文件中心 FcUpload / FcImage / FcFileList 等)
|
|
8
|
+
* 无需再从 antd 单独引一次。
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// 1) 继承 antd:全量再导出 antd 的组件与类型
|
|
12
|
+
export * from 'antd';
|
|
13
|
+
|
|
14
|
+
// 2) Vnd design 自有业务组件(首个模块:文件中心 FileCenter)
|
|
15
|
+
export * from "./file-center";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './style.css';
|
|
3
|
+
export interface FcImageMobileProps {
|
|
4
|
+
/** 文件中心文件 ID:组件内部自动换可访问 URL(OPEN-9) */
|
|
5
|
+
fileId?: string;
|
|
6
|
+
/** 直接给地址(不走文件中心) */
|
|
7
|
+
src?: string;
|
|
8
|
+
width?: number | string;
|
|
9
|
+
height?: number | string;
|
|
10
|
+
/** 同 antd-mobile Image 的 fit */
|
|
11
|
+
fit?: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';
|
|
12
|
+
/** 点击是否弹全屏预览,默认 true */
|
|
13
|
+
preview?: boolean;
|
|
14
|
+
/** 加载中的占位内容 */
|
|
15
|
+
placeholder?: React.ReactNode;
|
|
16
|
+
className?: string;
|
|
17
|
+
style?: React.CSSProperties;
|
|
18
|
+
appKey?: string;
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
getToken?: (appKey: string) => Promise<string>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 移动端文件中心回显组件:传 fileId 自动换地址,签名失效自动刷新一次,点按弹全屏预览
|
|
24
|
+
*/
|
|
25
|
+
export default function FcImage(props: FcImageMobileProps): React.JSX.Element;
|
|
26
|
+
export { FcImage };
|
|
@@ -0,0 +1,114 @@
|
|
|
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 _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
6
|
+
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."); }
|
|
7
|
+
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); }
|
|
8
|
+
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; }
|
|
9
|
+
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; } }
|
|
10
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
11
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
12
|
+
import { DotLoading, Image, ImageViewer } from 'antd-mobile';
|
|
13
|
+
import { PictureWrongOutline } from 'antd-mobile-icons';
|
|
14
|
+
import { fetchFileUrls, refreshFileSign } from "../../file-center/api";
|
|
15
|
+
import { resolveFcContext } from "../../file-center/context";
|
|
16
|
+
import "./style.css";
|
|
17
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
18
|
+
/**
|
|
19
|
+
* 移动端文件中心回显组件:传 fileId 自动换地址,签名失效自动刷新一次,点按弹全屏预览
|
|
20
|
+
*/
|
|
21
|
+
export default function FcImage(props) {
|
|
22
|
+
var fileId = props.fileId,
|
|
23
|
+
src = props.src,
|
|
24
|
+
width = props.width,
|
|
25
|
+
height = props.height,
|
|
26
|
+
_props$fit = props.fit,
|
|
27
|
+
fit = _props$fit === void 0 ? 'cover' : _props$fit,
|
|
28
|
+
_props$preview = props.preview,
|
|
29
|
+
preview = _props$preview === void 0 ? true : _props$preview,
|
|
30
|
+
placeholder = props.placeholder,
|
|
31
|
+
className = props.className,
|
|
32
|
+
style = props.style;
|
|
33
|
+
var ctx = resolveFcContext(props);
|
|
34
|
+
var _useState = useState(src),
|
|
35
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
36
|
+
url = _useState2[0],
|
|
37
|
+
setUrl = _useState2[1];
|
|
38
|
+
var refreshedRef = useRef(false);
|
|
39
|
+
useEffect(function () {
|
|
40
|
+
if (!fileId) {
|
|
41
|
+
setUrl(src);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
var alive = true;
|
|
45
|
+
refreshedRef.current = false;
|
|
46
|
+
fetchFileUrls(ctx, [fileId]).then(function (map) {
|
|
47
|
+
if (alive) setUrl(map[fileId]);
|
|
48
|
+
}).catch(function () {
|
|
49
|
+
if (alive) setUrl(undefined);
|
|
50
|
+
});
|
|
51
|
+
return function () {
|
|
52
|
+
alive = false;
|
|
53
|
+
};
|
|
54
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
55
|
+
}, [fileId, src]);
|
|
56
|
+
|
|
57
|
+
/** 加载失败:私有签名过期时自动刷新一次地址 */
|
|
58
|
+
var handleError = /*#__PURE__*/function () {
|
|
59
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
60
|
+
var _yield$refreshFileSig, fresh;
|
|
61
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
62
|
+
while (1) switch (_context.prev = _context.next) {
|
|
63
|
+
case 0:
|
|
64
|
+
if (!(!fileId || refreshedRef.current)) {
|
|
65
|
+
_context.next = 2;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
return _context.abrupt("return");
|
|
69
|
+
case 2:
|
|
70
|
+
refreshedRef.current = true;
|
|
71
|
+
_context.prev = 3;
|
|
72
|
+
_context.next = 6;
|
|
73
|
+
return refreshFileSign(ctx, fileId);
|
|
74
|
+
case 6:
|
|
75
|
+
_yield$refreshFileSig = _context.sent;
|
|
76
|
+
fresh = _yield$refreshFileSig.url;
|
|
77
|
+
setUrl(fresh);
|
|
78
|
+
_context.next = 13;
|
|
79
|
+
break;
|
|
80
|
+
case 11:
|
|
81
|
+
_context.prev = 11;
|
|
82
|
+
_context.t0 = _context["catch"](3);
|
|
83
|
+
case 13:
|
|
84
|
+
case "end":
|
|
85
|
+
return _context.stop();
|
|
86
|
+
}
|
|
87
|
+
}, _callee, null, [[3, 11]]);
|
|
88
|
+
}));
|
|
89
|
+
return function handleError() {
|
|
90
|
+
return _ref.apply(this, arguments);
|
|
91
|
+
};
|
|
92
|
+
}();
|
|
93
|
+
return /*#__PURE__*/_jsx("span", {
|
|
94
|
+
className: "bcm-fc-image".concat(className ? " ".concat(className) : ''),
|
|
95
|
+
style: style,
|
|
96
|
+
children: /*#__PURE__*/_jsx(Image, {
|
|
97
|
+
src: url,
|
|
98
|
+
width: width,
|
|
99
|
+
height: height,
|
|
100
|
+
fit: fit,
|
|
101
|
+
placeholder: placeholder !== null && placeholder !== void 0 ? placeholder : /*#__PURE__*/_jsx(DotLoading, {}),
|
|
102
|
+
fallback: /*#__PURE__*/_jsx(PictureWrongOutline, {
|
|
103
|
+
className: "bcm-fc-image-fallback"
|
|
104
|
+
}),
|
|
105
|
+
onError: handleError,
|
|
106
|
+
onClick: function onClick() {
|
|
107
|
+
if (preview && url) ImageViewer.show({
|
|
108
|
+
image: url
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
})
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export { FcImage };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { FcFileInfo, FcUploadProgress } from '../../file-center/types';
|
|
3
|
+
import type { FcCompressOptions } from '../../file-center/utils/compress';
|
|
4
|
+
import './style.css';
|
|
5
|
+
/**
|
|
6
|
+
* 移动端 FcUpload 的文件项(不依赖 antd 的 UploadFile 结构)
|
|
7
|
+
*/
|
|
8
|
+
export interface FcMobileUploadFile {
|
|
9
|
+
/** 本地唯一标识 */
|
|
10
|
+
uid: string;
|
|
11
|
+
name: string;
|
|
12
|
+
size: number;
|
|
13
|
+
type?: string;
|
|
14
|
+
/** 上传状态 */
|
|
15
|
+
status: 'uploading' | 'done' | 'error';
|
|
16
|
+
/** 上传进度 0-100 */
|
|
17
|
+
percent?: number;
|
|
18
|
+
/** 上传阶段(md5 计算 / 上传中 / 合并分片) */
|
|
19
|
+
stage?: FcUploadProgress['stage'];
|
|
20
|
+
/** 本地预览地址(图片) */
|
|
21
|
+
thumbUrl?: string;
|
|
22
|
+
/** 文件中心文件 ID(上传成功后有值) */
|
|
23
|
+
fileId?: string;
|
|
24
|
+
/** 文件中心文件元数据(上传成功后有值) */
|
|
25
|
+
fileInfo?: FcFileInfo;
|
|
26
|
+
/** 失败原因 */
|
|
27
|
+
error?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface FcUploadMobileProps {
|
|
30
|
+
/** 受控文件列表 */
|
|
31
|
+
value?: FcMobileUploadFile[];
|
|
32
|
+
/** 文件列表变化回调(上传中/成功/失败/移除都会触发) */
|
|
33
|
+
onChange?: (fileList: FcMobileUploadFile[]) => void;
|
|
34
|
+
appKey?: string;
|
|
35
|
+
baseUrl?: string;
|
|
36
|
+
getToken?: (appKey: string) => Promise<string>;
|
|
37
|
+
bizType?: string;
|
|
38
|
+
bizId?: string;
|
|
39
|
+
bizUrl?: string;
|
|
40
|
+
/** 展示形态:picture-card 图片宫格 / text 文件列表 */
|
|
41
|
+
listType?: 'picture-card' | 'text';
|
|
42
|
+
/** 最多上传个数 */
|
|
43
|
+
maxCount?: number;
|
|
44
|
+
/** 单文件大小上限(MB),默认 50 */
|
|
45
|
+
maxSizeMB?: number;
|
|
46
|
+
/** 接受的文件类型(同 input accept) */
|
|
47
|
+
accept?: string;
|
|
48
|
+
/** 支持多选 */
|
|
49
|
+
multiple?: boolean;
|
|
50
|
+
/** 直接调起相机拍照(移动端特有) */
|
|
51
|
+
capture?: boolean;
|
|
52
|
+
/** 禁用 */
|
|
53
|
+
disabled?: boolean;
|
|
54
|
+
/** 图片上传前压缩;传 true 用默认配置,仅对图片生效 */
|
|
55
|
+
compress?: boolean | FcCompressOptions;
|
|
56
|
+
/** 是否启用秒传,默认 true */
|
|
57
|
+
instant?: boolean;
|
|
58
|
+
/** 移除文件时是否同步删除文件中心的文件,默认 false */
|
|
59
|
+
deleteOnRemove?: boolean;
|
|
60
|
+
onUploadSuccess?: (fileInfo: FcFileInfo, file: FcMobileUploadFile) => void;
|
|
61
|
+
onUploadError?: (error: Error, file: FcMobileUploadFile) => void;
|
|
62
|
+
/** 点击预览:图片默认弹全屏预览,其他文件默认新窗口打开;传入后完全接管 */
|
|
63
|
+
onPreview?: (file: FcMobileUploadFile) => void;
|
|
64
|
+
/** 列表形态的按钮文案,默认「上传文件」 */
|
|
65
|
+
buttonText?: string;
|
|
66
|
+
className?: string;
|
|
67
|
+
style?: React.CSSProperties;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 移动端文件中心上传组件(antd-mobile 版)
|
|
71
|
+
* 与 PC 端 FcUpload 共用同一套上传编排(压缩 → MD5 → 秒传 → 分片/普通上传 → 引用登记)
|
|
72
|
+
*/
|
|
73
|
+
export default function FcUpload(props: FcUploadMobileProps): React.JSX.Element;
|
|
74
|
+
export { FcUpload };
|