@zero-library/common 2.1.10 → 2.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/dist/index.cjs.js +877 -340
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.mts +1587 -144
- package/dist/index.d.ts +1587 -144
- package/dist/index.esm.js +829 -307
- package/dist/index.esm.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.js
CHANGED
|
@@ -14,13 +14,12 @@ var zoom = require('@react-pdf-viewer/zoom');
|
|
|
14
14
|
require('@react-pdf-viewer/core/lib/styles/index.css');
|
|
15
15
|
var zh_CN = require('@react-pdf-viewer/locales/lib/zh_CN.json');
|
|
16
16
|
require('@react-pdf-viewer/page-navigation/lib/styles/index.css');
|
|
17
|
-
var dayjs = require('dayjs');
|
|
18
|
-
var relativeTime = require('dayjs/plugin/relativeTime');
|
|
19
17
|
var AES = require('crypto-js/aes');
|
|
20
18
|
var encUtf8 = require('crypto-js/enc-utf8');
|
|
19
|
+
var dayjs = require('dayjs');
|
|
20
|
+
var relativeTime = require('dayjs/plugin/relativeTime');
|
|
21
21
|
var Decimal = require('decimal.js');
|
|
22
22
|
var axios = require('axios');
|
|
23
|
-
var lib = require('antd/lib');
|
|
24
23
|
require('@react-pdf-viewer/thumbnail/lib/styles/index.css');
|
|
25
24
|
require('@react-pdf-viewer/zoom/lib/styles/index.css');
|
|
26
25
|
var classNames2 = require('classnames');
|
|
@@ -70,10 +69,10 @@ var React16__namespace = /*#__PURE__*/_interopNamespace(React16);
|
|
|
70
69
|
var parse__default = /*#__PURE__*/_interopDefault(parse);
|
|
71
70
|
var markdownit__default = /*#__PURE__*/_interopDefault(markdownit);
|
|
72
71
|
var zh_CN__default = /*#__PURE__*/_interopDefault(zh_CN);
|
|
73
|
-
var dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
|
|
74
|
-
var relativeTime__default = /*#__PURE__*/_interopDefault(relativeTime);
|
|
75
72
|
var AES__default = /*#__PURE__*/_interopDefault(AES);
|
|
76
73
|
var encUtf8__default = /*#__PURE__*/_interopDefault(encUtf8);
|
|
74
|
+
var dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
|
|
75
|
+
var relativeTime__default = /*#__PURE__*/_interopDefault(relativeTime);
|
|
77
76
|
var Decimal__default = /*#__PURE__*/_interopDefault(Decimal);
|
|
78
77
|
var axios__default = /*#__PURE__*/_interopDefault(axios);
|
|
79
78
|
var classNames2__default = /*#__PURE__*/_interopDefault(classNames2);
|
|
@@ -97,24 +96,8 @@ var AudioPlayer_default = ({ fileUrl }) => {
|
|
|
97
96
|
"\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301 audio \u6807\u7B7E\u3002"
|
|
98
97
|
] });
|
|
99
98
|
};
|
|
100
|
-
|
|
101
|
-
// src/utils/theme.ts
|
|
102
|
-
var getPrimaryColor = () => {
|
|
103
|
-
const searchParams = new URLSearchParams(location.search);
|
|
104
|
-
const mainSource = searchParams.get("mainSource") || "cube-uc";
|
|
105
|
-
if (mainSource === "cube-uc") {
|
|
106
|
-
return "#34AFBE";
|
|
107
|
-
} else if (mainSource === "uc") {
|
|
108
|
-
return "#FA541C";
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
var LgPrimaryColor = getPrimaryColor();
|
|
112
|
-
var themeConfig = {
|
|
113
|
-
token: { colorPrimary: LgPrimaryColor, colorLink: LgPrimaryColor },
|
|
114
|
-
cssVar: true
|
|
115
|
-
};
|
|
116
99
|
var FileIcon_default = ({ suffix, fontSize = 22 }) => {
|
|
117
|
-
const styles = { fontSize, color:
|
|
100
|
+
const styles = { fontSize, color: "var(--ant-color-primary)" };
|
|
118
101
|
const Icon = React16.useMemo(() => {
|
|
119
102
|
switch (suffix?.toUpperCase()) {
|
|
120
103
|
case "TXT":
|
|
@@ -209,7 +192,7 @@ function highlightKeywords(html, keywords) {
|
|
|
209
192
|
function makePlaceholder(id) {
|
|
210
193
|
return `__ALERT_DATA_${id}__`;
|
|
211
194
|
}
|
|
212
|
-
function
|
|
195
|
+
function alertMarkClean(src) {
|
|
213
196
|
let pos = 0;
|
|
214
197
|
let id = 0;
|
|
215
198
|
let out = "";
|
|
@@ -225,17 +208,13 @@ function extractAlertPlaceholders(src) {
|
|
|
225
208
|
const relAfter = afterStart.slice(":::alert".length);
|
|
226
209
|
const matchLineEnd = relAfter.search(/\s*:::\s*/);
|
|
227
210
|
let endIdx = -1;
|
|
211
|
+
let isNoEnd = 1;
|
|
228
212
|
if (matchLineEnd !== -1) {
|
|
229
|
-
endIdx = start + ":::alert".length + matchLineEnd
|
|
213
|
+
endIdx = start + ":::alert".length + matchLineEnd;
|
|
214
|
+
isNoEnd = 0;
|
|
230
215
|
} else {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
out += src.slice(start);
|
|
234
|
-
pos = src.length;
|
|
235
|
-
break;
|
|
236
|
-
} else {
|
|
237
|
-
endIdx = fallback;
|
|
238
|
-
}
|
|
216
|
+
endIdx = src.length;
|
|
217
|
+
isNoEnd = 1;
|
|
239
218
|
}
|
|
240
219
|
const inner = src.slice(start + ":::alert".length, endIdx).trim();
|
|
241
220
|
const typeMatch = inner.match(/type\s*=\s*(?:(['"])(.*?)\1|(\S+))/);
|
|
@@ -247,8 +226,8 @@ function extractAlertPlaceholders(src) {
|
|
|
247
226
|
}
|
|
248
227
|
const ph = makePlaceholder(id++);
|
|
249
228
|
placeholders.set(ph, rawData);
|
|
250
|
-
const typeText = type ? `
|
|
251
|
-
out += `:::alert${typeText} data="${ph}" :::`;
|
|
229
|
+
const typeText = type ? `type=${JSON.stringify(type)}` : "";
|
|
230
|
+
out += `:::alert ${typeText} data="${ph}" loading="${isNoEnd}" :::`;
|
|
252
231
|
const realClose = src.indexOf(":::", endIdx);
|
|
253
232
|
pos = realClose === -1 ? endIdx : realClose + 3;
|
|
254
233
|
}
|
|
@@ -277,33 +256,23 @@ try {
|
|
|
277
256
|
var RenderMarkdown_default = ({ content = "", searchValue, customComponents, onChange, onPartialChange }) => {
|
|
278
257
|
const reactContent = React16.useMemo(() => {
|
|
279
258
|
if (!content) return null;
|
|
280
|
-
|
|
281
|
-
const openCount = (fixedContent.match(/:::alert\b/g) || []).length;
|
|
282
|
-
const closeCount = (fixedContent.match(/\s*:::\s*/gm) || []).length - openCount;
|
|
283
|
-
let incomplete = false;
|
|
284
|
-
if (openCount > closeCount) {
|
|
285
|
-
incomplete = true;
|
|
286
|
-
fixedContent += " :::";
|
|
287
|
-
}
|
|
288
|
-
const { text: preprocessed, placeholders } = extractAlertPlaceholders(fixedContent);
|
|
259
|
+
const { text: preprocessed, placeholders } = alertMarkClean(content);
|
|
289
260
|
let rawHtml = md.render(preprocessed);
|
|
290
261
|
rawHtml = searchValue ? highlightKeywords(rawHtml, [searchValue]) : rawHtml;
|
|
291
262
|
let lazyIndex = -1;
|
|
292
|
-
const allLazyMatches = [...rawHtml.matchAll(/<lazy-component/gi)];
|
|
293
|
-
const lastLazyIndex = allLazyMatches.length - 1;
|
|
294
263
|
return parse__default.default(rawHtml, {
|
|
295
264
|
replace: (domNode) => {
|
|
296
265
|
if (domNode.name === "lazy-component") {
|
|
297
266
|
lazyIndex++;
|
|
298
267
|
const el = domNode;
|
|
299
268
|
const type = el.attribs.type;
|
|
269
|
+
const loading = !!Number(el.attribs.loading);
|
|
300
270
|
const dataAttr = el.attribs.data || "";
|
|
301
271
|
let data = {};
|
|
302
272
|
if (/^__ALERT_DATA_\d+__$/.test(dataAttr)) {
|
|
303
273
|
const raw = placeholders.get(dataAttr) ?? "";
|
|
304
274
|
data = parseData(raw);
|
|
305
275
|
}
|
|
306
|
-
const loading = incomplete && lazyIndex === lastLazyIndex;
|
|
307
276
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
308
277
|
LazyComponent_default,
|
|
309
278
|
{
|
|
@@ -408,7 +377,7 @@ function isNumber(val) {
|
|
|
408
377
|
return is(val, "Number");
|
|
409
378
|
}
|
|
410
379
|
function isNumberNoNaN(val) {
|
|
411
|
-
return
|
|
380
|
+
return isNumber(val) && !isNaN(val);
|
|
412
381
|
}
|
|
413
382
|
function isString(val) {
|
|
414
383
|
return is(val, "String");
|
|
@@ -429,7 +398,7 @@ function isArray(val) {
|
|
|
429
398
|
return Array.isArray(val);
|
|
430
399
|
}
|
|
431
400
|
function isEmpty(val) {
|
|
432
|
-
if (
|
|
401
|
+
if (isString(val) || isArray(val)) {
|
|
433
402
|
return val.length === 0;
|
|
434
403
|
}
|
|
435
404
|
if (isNullOrUnDef(val)) {
|
|
@@ -441,28 +410,89 @@ function isEmpty(val) {
|
|
|
441
410
|
return isEmptyObj(val);
|
|
442
411
|
}
|
|
443
412
|
function isWindow(val) {
|
|
444
|
-
return
|
|
413
|
+
return is(val, "Window");
|
|
445
414
|
}
|
|
446
415
|
function isElement(val) {
|
|
447
|
-
return isObject(val) && !!val
|
|
416
|
+
return isObject(val) && !!val?.tagName;
|
|
448
417
|
}
|
|
449
418
|
function isMap(val) {
|
|
450
419
|
return is(val, "Map");
|
|
451
420
|
}
|
|
452
|
-
|
|
453
|
-
|
|
421
|
+
function isSet(val) {
|
|
422
|
+
return is(val, "Set");
|
|
423
|
+
}
|
|
454
424
|
var isExternal = (path) => {
|
|
455
|
-
|
|
425
|
+
if (!isString(path)) return false;
|
|
426
|
+
return /^(https?:|mailto:|tel:|ftp:)/.test(path);
|
|
456
427
|
};
|
|
457
428
|
var isBlob = (val) => {
|
|
458
429
|
return is(val, "Blob");
|
|
459
430
|
};
|
|
460
431
|
var isLocalhost = (host) => {
|
|
461
|
-
|
|
432
|
+
const targetHost = host || location.host;
|
|
433
|
+
return /^(localhost|127\.0\.0\.1|0\.0\.0\.0|\[?::1\]?)(:\d+)?$/.test(targetHost);
|
|
434
|
+
};
|
|
435
|
+
function isReferenceType(val) {
|
|
436
|
+
return typeof val === "object" && !isNull(val) || isFunction(val);
|
|
437
|
+
}
|
|
438
|
+
var isScriptSafe = (script) => {
|
|
439
|
+
if (isString(script)) {
|
|
440
|
+
const unsafeKeywords = [
|
|
441
|
+
"eval",
|
|
442
|
+
// 动态执行代码,极高风险
|
|
443
|
+
"new Function",
|
|
444
|
+
// 动态创建函数,高风险
|
|
445
|
+
"setTimeout",
|
|
446
|
+
// 可能被用于延迟恶意代码执行
|
|
447
|
+
"setInterval",
|
|
448
|
+
// 可能被用于持续执行恶意代码
|
|
449
|
+
"window",
|
|
450
|
+
// 访问全局窗口对象
|
|
451
|
+
"document",
|
|
452
|
+
// 访问文档对象,可能操作DOM
|
|
453
|
+
"location",
|
|
454
|
+
// 可能被用于钓鱼攻击或重定向
|
|
455
|
+
"navigator",
|
|
456
|
+
// 访问浏览器信息
|
|
457
|
+
"localStorage",
|
|
458
|
+
// 访问本地存储数据
|
|
459
|
+
"sessionStorage",
|
|
460
|
+
// 访问会话存储数据
|
|
461
|
+
"history",
|
|
462
|
+
// 可能被用于操纵浏览历史
|
|
463
|
+
"fetch",
|
|
464
|
+
// 发起网络请求
|
|
465
|
+
"XMLHttpRequest",
|
|
466
|
+
// 发起 AJAX 请求
|
|
467
|
+
"WebSocket",
|
|
468
|
+
// 建立 WebSocket 连接
|
|
469
|
+
"alert",
|
|
470
|
+
// 弹出警告框(可能用于社会工程学攻击)
|
|
471
|
+
"confirm",
|
|
472
|
+
// 弹出确认框(可能用于社会工程学攻击)
|
|
473
|
+
"prompt"
|
|
474
|
+
// 弹出输入框(可能用于社会工程学攻击)
|
|
475
|
+
// 'console' // 控制台对象(通常被注释掉)
|
|
476
|
+
];
|
|
477
|
+
const regex = new RegExp(`\\b(${unsafeKeywords.join("|")})\\b`, "i");
|
|
478
|
+
if (regex.test(script)) {
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
return false;
|
|
484
|
+
};
|
|
485
|
+
var isJson = (text = "") => {
|
|
486
|
+
try {
|
|
487
|
+
const parsed = JSON.parse(text);
|
|
488
|
+
return isObject(parsed) || isArray(parsed);
|
|
489
|
+
} catch {
|
|
490
|
+
return false;
|
|
491
|
+
}
|
|
462
492
|
};
|
|
463
493
|
|
|
464
494
|
// src/hooks/iframe/useIframeRelayBridge.ts
|
|
465
|
-
|
|
495
|
+
var useIframeRelayBridge_default = (allowedOrigins = ["*"]) => {
|
|
466
496
|
const handlers = React16.useRef({});
|
|
467
497
|
React16.useEffect(() => {
|
|
468
498
|
const onMessage = (evt) => {
|
|
@@ -489,8 +519,64 @@ function useIframeRelayBridge(allowedOrigins = ["*"]) {
|
|
|
489
519
|
handlers.current[type] = (handlers.current[type] || []).filter((fn) => fn !== handler);
|
|
490
520
|
}
|
|
491
521
|
return { on, off };
|
|
492
|
-
}
|
|
493
|
-
|
|
522
|
+
};
|
|
523
|
+
var useAutoRefresh_default = (listenValue, shouldRefresh, callback, delay = 1e4) => {
|
|
524
|
+
const timerRef = React16.useRef(null);
|
|
525
|
+
const shouldRefreshRef = React16.useRef(shouldRefresh);
|
|
526
|
+
const callbackRef = React16.useRef(callback);
|
|
527
|
+
const [num, setNum] = React16.useState(0);
|
|
528
|
+
React16.useEffect(() => {
|
|
529
|
+
shouldRefreshRef.current = shouldRefresh;
|
|
530
|
+
callbackRef.current = callback;
|
|
531
|
+
}, [shouldRefresh, callback]);
|
|
532
|
+
React16.useEffect(() => {
|
|
533
|
+
if (timerRef.current) {
|
|
534
|
+
clearTimeout(timerRef.current);
|
|
535
|
+
timerRef.current = null;
|
|
536
|
+
}
|
|
537
|
+
if (shouldRefreshRef.current(listenValue)) {
|
|
538
|
+
timerRef.current = setTimeout(async () => {
|
|
539
|
+
await callbackRef.current();
|
|
540
|
+
setNum(num + 1);
|
|
541
|
+
}, delay);
|
|
542
|
+
}
|
|
543
|
+
return () => {
|
|
544
|
+
if (timerRef.current) {
|
|
545
|
+
clearTimeout(timerRef.current);
|
|
546
|
+
}
|
|
547
|
+
};
|
|
548
|
+
}, [listenValue, delay, num]);
|
|
549
|
+
};
|
|
550
|
+
var useCountDown_default = (callback) => {
|
|
551
|
+
const [count, setCount] = React16.useState(0);
|
|
552
|
+
const [startCount, setStartCount] = React16.useState(0);
|
|
553
|
+
const timer = React16.useRef(null);
|
|
554
|
+
const pause = () => {
|
|
555
|
+
clearInterval(timer.current);
|
|
556
|
+
timer.current = null;
|
|
557
|
+
};
|
|
558
|
+
const start = (initialValue = 60) => {
|
|
559
|
+
pause();
|
|
560
|
+
setCount(initialValue);
|
|
561
|
+
setStartCount((startCount2) => startCount2 + 1);
|
|
562
|
+
timer.current = setInterval(() => {
|
|
563
|
+
setCount((count2) => count2 - 1);
|
|
564
|
+
}, 1e3);
|
|
565
|
+
};
|
|
566
|
+
React16.useEffect(() => {
|
|
567
|
+
return () => {
|
|
568
|
+
pause();
|
|
569
|
+
};
|
|
570
|
+
}, []);
|
|
571
|
+
React16.useEffect(() => {
|
|
572
|
+
if (count === 0 && startCount !== 0) {
|
|
573
|
+
pause();
|
|
574
|
+
callback?.();
|
|
575
|
+
}
|
|
576
|
+
}, [count]);
|
|
577
|
+
return { count, start, pause, startCount };
|
|
578
|
+
};
|
|
579
|
+
var useCreateValtioContext_default = () => {
|
|
494
580
|
const Context = React16.createContext(null);
|
|
495
581
|
const ValtioProvider = ({ store, children }) => /* @__PURE__ */ jsxRuntime.jsx(Context.Provider, { value: store, children });
|
|
496
582
|
const useValtioStore = () => {
|
|
@@ -500,11 +586,12 @@ function useCreateValtioContext() {
|
|
|
500
586
|
};
|
|
501
587
|
return {
|
|
502
588
|
ValtioProvider,
|
|
503
|
-
useValtioStore
|
|
504
|
-
// Context
|
|
589
|
+
useValtioStore,
|
|
590
|
+
// 导出 Context 以便外部使用
|
|
591
|
+
Context
|
|
505
592
|
};
|
|
506
|
-
}
|
|
507
|
-
|
|
593
|
+
};
|
|
594
|
+
var useDebounce_default = (func, wait = 400) => {
|
|
508
595
|
const { current } = React16.useRef({ func, timeOut: null });
|
|
509
596
|
React16.useEffect(() => {
|
|
510
597
|
current.func = func;
|
|
@@ -539,99 +626,155 @@ function useDebounce(func, wait = 400) {
|
|
|
539
626
|
debounce.flush = flush;
|
|
540
627
|
debounce.cancel = cancel;
|
|
541
628
|
return React16.useCallback(debounce, []);
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
for (const key in obj) {
|
|
550
|
-
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
551
|
-
result[key] = deepCopy(obj[key], isJson);
|
|
629
|
+
};
|
|
630
|
+
var deepCopy = (obj, isJson2 = true) => {
|
|
631
|
+
if (isJson2) {
|
|
632
|
+
try {
|
|
633
|
+
return JSON.parse(JSON.stringify(obj));
|
|
634
|
+
} catch {
|
|
635
|
+
return deepCopy(obj, false);
|
|
552
636
|
}
|
|
553
637
|
}
|
|
554
|
-
|
|
638
|
+
const visited = /* @__PURE__ */ new WeakMap();
|
|
639
|
+
const cloneRecursively = (value) => {
|
|
640
|
+
if (isNullOrUnDef(value)) return value;
|
|
641
|
+
const type = typeof value;
|
|
642
|
+
if (type !== "object") return value;
|
|
643
|
+
if (visited.has(value)) {
|
|
644
|
+
return visited.get(value);
|
|
645
|
+
}
|
|
646
|
+
if (isDate(value)) return new Date(value);
|
|
647
|
+
if (isRegExp(value)) return new RegExp(value);
|
|
648
|
+
if (isMap(value)) {
|
|
649
|
+
const clonedMap = /* @__PURE__ */ new Map();
|
|
650
|
+
visited.set(value, clonedMap);
|
|
651
|
+
for (const [k, v] of value.entries()) {
|
|
652
|
+
clonedMap.set(cloneRecursively(k), cloneRecursively(v));
|
|
653
|
+
}
|
|
654
|
+
return clonedMap;
|
|
655
|
+
}
|
|
656
|
+
if (isSet(value)) {
|
|
657
|
+
const clonedSet = /* @__PURE__ */ new Set();
|
|
658
|
+
visited.set(value, clonedSet);
|
|
659
|
+
for (const v of value.values()) {
|
|
660
|
+
clonedSet.add(cloneRecursively(v));
|
|
661
|
+
}
|
|
662
|
+
return clonedSet;
|
|
663
|
+
}
|
|
664
|
+
if (isArray(value)) {
|
|
665
|
+
const result = [];
|
|
666
|
+
visited.set(value, result);
|
|
667
|
+
for (let i = 0; i < value.length; i++) {
|
|
668
|
+
result[i] = cloneRecursively(value[i]);
|
|
669
|
+
}
|
|
670
|
+
return result;
|
|
671
|
+
} else {
|
|
672
|
+
const result = {};
|
|
673
|
+
visited.set(value, result);
|
|
674
|
+
for (const key in value) {
|
|
675
|
+
if (Object.prototype.hasOwnProperty.call(value, key)) {
|
|
676
|
+
result[key] = cloneRecursively(value[key]);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
return result;
|
|
680
|
+
}
|
|
681
|
+
};
|
|
682
|
+
return cloneRecursively(obj);
|
|
555
683
|
};
|
|
556
684
|
function deepEqual(a, b) {
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
685
|
+
const visited = /* @__PURE__ */ new WeakMap();
|
|
686
|
+
const isEqual = (x, y) => {
|
|
687
|
+
if (Object.is(x, y)) return true;
|
|
688
|
+
if (typeof x === "object" && !isNull(x) && typeof y === "object" && !isNull(y)) {
|
|
689
|
+
if (visited.has(x)) {
|
|
690
|
+
if (visited.get(x).has(y)) return true;
|
|
691
|
+
}
|
|
692
|
+
if (!visited.has(x)) visited.set(x, /* @__PURE__ */ new WeakSet());
|
|
693
|
+
visited.get(x).add(y);
|
|
694
|
+
if (!visited.has(y)) visited.set(y, /* @__PURE__ */ new WeakSet());
|
|
695
|
+
visited.get(y).add(x);
|
|
564
696
|
}
|
|
565
|
-
return
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
697
|
+
if (isDate(x) && isDate(y)) return x.getTime() === y.getTime();
|
|
698
|
+
if (isRegExp(x) && isRegExp(y)) return x.toString() === y.toString();
|
|
699
|
+
if (isMap(x) && isMap(y)) {
|
|
700
|
+
if (x.size !== y.size) return false;
|
|
701
|
+
for (const [key, val] of x.entries()) {
|
|
702
|
+
if (!y.has(key)) return false;
|
|
703
|
+
if (!isEqual(val, y.get(key))) return false;
|
|
704
|
+
}
|
|
705
|
+
return true;
|
|
571
706
|
}
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
if (isObject(a) && isObject(b)) {
|
|
580
|
-
const keysA = Object.keys(a);
|
|
581
|
-
const keysB = Object.keys(b);
|
|
582
|
-
if (keysA.length !== keysB.length) return false;
|
|
583
|
-
for (const key of keysA) {
|
|
584
|
-
if (!deepEqual(a[key], b[key])) return false;
|
|
707
|
+
if (isSet(x) && isSet(y)) {
|
|
708
|
+
if (x.size !== y.size) return false;
|
|
709
|
+
for (const val of x.values()) {
|
|
710
|
+
const hasEqual = Array.from(y.values()).some((bVal) => isEqual(val, bVal));
|
|
711
|
+
if (!hasEqual) return false;
|
|
712
|
+
}
|
|
713
|
+
return true;
|
|
585
714
|
}
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
715
|
+
if (isArray(x) && isArray(y)) {
|
|
716
|
+
if (x.length !== y.length) return false;
|
|
717
|
+
return x.every((item, i) => isEqual(item, y[i]));
|
|
718
|
+
}
|
|
719
|
+
if (isFunction(x) && isFunction(y)) return x === y;
|
|
720
|
+
if (isObject(x) && isObject(y)) {
|
|
721
|
+
const keysA = Object.keys(x);
|
|
722
|
+
const keysB = Object.keys(y);
|
|
723
|
+
if (keysA.length !== keysB.length) return false;
|
|
724
|
+
for (const key of keysA) {
|
|
725
|
+
if (!keysB.includes(key)) return false;
|
|
726
|
+
if (!isEqual(x[key], y[key])) return false;
|
|
727
|
+
}
|
|
728
|
+
return true;
|
|
729
|
+
}
|
|
730
|
+
return false;
|
|
731
|
+
};
|
|
732
|
+
return isEqual(a, b);
|
|
589
733
|
}
|
|
590
734
|
var deepMerge = (base, override) => {
|
|
735
|
+
if (!base || !override) {
|
|
736
|
+
return base || override || {};
|
|
737
|
+
}
|
|
591
738
|
const result = { ...base };
|
|
592
739
|
Object.keys(override || {}).forEach((key) => {
|
|
593
740
|
const baseValue = base[key];
|
|
594
741
|
const overrideValue = override[key];
|
|
595
|
-
if (
|
|
742
|
+
if (isObject(baseValue) && isObject(overrideValue)) {
|
|
596
743
|
result[key] = deepMerge(baseValue, overrideValue);
|
|
597
|
-
} else if (overrideValue
|
|
744
|
+
} else if (isDef(overrideValue)) {
|
|
598
745
|
result[key] = overrideValue;
|
|
599
746
|
}
|
|
600
747
|
});
|
|
601
748
|
return result;
|
|
602
749
|
};
|
|
603
|
-
var objToOptions = (obj) => {
|
|
604
|
-
return Object.keys(obj).map((key) => ({
|
|
750
|
+
var objToOptions = (obj, filter) => {
|
|
751
|
+
return Object.keys(obj).filter((key) => !filter || filter(key, obj[key])).map((key) => ({
|
|
605
752
|
label: obj[key],
|
|
606
|
-
value: Number(key)
|
|
753
|
+
value: isNaN(Number(key)) ? key : Number(key)
|
|
607
754
|
}));
|
|
608
755
|
};
|
|
609
756
|
var arrToObj = (arr = [], key) => {
|
|
610
757
|
const obj = {};
|
|
611
|
-
arr
|
|
758
|
+
arr.forEach((item) => {
|
|
612
759
|
obj[item[key]] = item;
|
|
613
760
|
});
|
|
614
761
|
return obj;
|
|
615
762
|
};
|
|
616
|
-
var
|
|
763
|
+
var setInterval2 = (fn, t) => {
|
|
617
764
|
let timer = null;
|
|
618
|
-
let
|
|
619
|
-
const
|
|
765
|
+
let running = true;
|
|
766
|
+
const loop = () => {
|
|
620
767
|
timer = setTimeout(async () => {
|
|
621
|
-
if (
|
|
622
|
-
return;
|
|
623
|
-
}
|
|
768
|
+
if (!running) return;
|
|
624
769
|
await fn();
|
|
625
|
-
if (
|
|
626
|
-
interval();
|
|
627
|
-
}
|
|
770
|
+
if (running) loop();
|
|
628
771
|
}, t);
|
|
629
772
|
};
|
|
630
|
-
|
|
773
|
+
loop();
|
|
631
774
|
return {
|
|
632
|
-
isRun: () =>
|
|
775
|
+
isRun: () => running,
|
|
633
776
|
cancel: () => {
|
|
634
|
-
|
|
777
|
+
running = false;
|
|
635
778
|
if (timer) {
|
|
636
779
|
clearTimeout(timer);
|
|
637
780
|
timer = null;
|
|
@@ -640,14 +783,13 @@ var nsSetInterval = (fn, t) => {
|
|
|
640
783
|
};
|
|
641
784
|
};
|
|
642
785
|
var genNonDuplicateID = () => {
|
|
643
|
-
|
|
644
|
-
idStr += Math.random().toString(36).substr(2);
|
|
645
|
-
return idStr;
|
|
786
|
+
return crypto.randomUUID();
|
|
646
787
|
};
|
|
647
|
-
var copyText = (text) => {
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
788
|
+
var copyText = async (text, prompt = "\u590D\u5236\u6210\u529F") => {
|
|
789
|
+
try {
|
|
790
|
+
await navigator.clipboard.writeText(text);
|
|
791
|
+
if (prompt) antd.message.success(prompt);
|
|
792
|
+
} catch (e) {
|
|
651
793
|
const textArea = document.createElement("textarea");
|
|
652
794
|
textArea.value = text;
|
|
653
795
|
textArea.style.position = "absolute";
|
|
@@ -657,10 +799,9 @@ var copyText = (text) => {
|
|
|
657
799
|
document.body.appendChild(textArea);
|
|
658
800
|
textArea.focus();
|
|
659
801
|
textArea.select();
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
});
|
|
802
|
+
const ok = document.execCommand("copy");
|
|
803
|
+
if (ok && prompt) antd.message.success(prompt);
|
|
804
|
+
textArea.remove();
|
|
664
805
|
}
|
|
665
806
|
};
|
|
666
807
|
function formatNumberWithCommas(number) {
|
|
@@ -684,25 +825,71 @@ var getFileName = (filePath) => {
|
|
|
684
825
|
var getFileSuffixName = (fileName) => {
|
|
685
826
|
return fileName.split(".").pop() || "";
|
|
686
827
|
};
|
|
687
|
-
var
|
|
828
|
+
var convertNewlineToBr = (con) => {
|
|
688
829
|
return con ? con.replace(/\r\n/g, "\n").replace(/\n/g, "<br/>") : "";
|
|
689
830
|
};
|
|
690
|
-
var
|
|
691
|
-
const
|
|
831
|
+
var getAllUrlParams = (url = "") => {
|
|
832
|
+
const result = {};
|
|
833
|
+
if (!url) return result;
|
|
834
|
+
let query = "";
|
|
835
|
+
try {
|
|
836
|
+
const u = new URL(url, "http://dummy.com");
|
|
837
|
+
query = u.search;
|
|
838
|
+
} catch {
|
|
839
|
+
const qIndex = url.indexOf("?");
|
|
840
|
+
if (qIndex === -1) return result;
|
|
841
|
+
query = url.slice(qIndex);
|
|
842
|
+
}
|
|
843
|
+
const params = new URLSearchParams(query);
|
|
844
|
+
const seen = /* @__PURE__ */ new Set();
|
|
845
|
+
for (const [key, value] of params.entries()) {
|
|
846
|
+
if (seen.has(key)) {
|
|
847
|
+
if (isArray(result[key])) {
|
|
848
|
+
result[key].push(value);
|
|
849
|
+
} else {
|
|
850
|
+
result[key] = [result[key], value];
|
|
851
|
+
}
|
|
852
|
+
} else {
|
|
853
|
+
result[key] = value;
|
|
854
|
+
seen.add(key);
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
return result;
|
|
858
|
+
};
|
|
859
|
+
var buildUrlParams = (obj, url, format = "repeat") => {
|
|
860
|
+
if (!isObject(obj)) return url ?? "";
|
|
861
|
+
let base = url || "";
|
|
862
|
+
let hash = "";
|
|
863
|
+
if (base.includes("#")) {
|
|
864
|
+
const i = base.indexOf("#");
|
|
865
|
+
hash = base.slice(i);
|
|
866
|
+
base = base.slice(0, i);
|
|
867
|
+
}
|
|
868
|
+
const originalParams = getAllUrlParams(base);
|
|
869
|
+
const merged = { ...originalParams, ...obj };
|
|
870
|
+
const params = new URLSearchParams();
|
|
871
|
+
for (const [key, value] of Object.entries(merged)) {
|
|
872
|
+
if (isNullOrUnDef(value)) continue;
|
|
692
873
|
if (isArray(value)) {
|
|
693
|
-
|
|
874
|
+
const list = value.filter((v) => !isNullOrUnDef(v)).map(String);
|
|
875
|
+
if (list.length === 0) continue;
|
|
876
|
+
if (format === "repeat") {
|
|
877
|
+
list.forEach((v) => params.append(key, v));
|
|
878
|
+
} else {
|
|
879
|
+
params.set(key, list.join(","));
|
|
880
|
+
}
|
|
881
|
+
} else {
|
|
882
|
+
params.set(key, String(value));
|
|
694
883
|
}
|
|
695
|
-
return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
|
|
696
|
-
}).join("&");
|
|
697
|
-
if (url) {
|
|
698
|
-
const separator = url.includes("?") ? "&" : "?";
|
|
699
|
-
return `${url}${separator}${params}`;
|
|
700
884
|
}
|
|
701
|
-
|
|
885
|
+
const query = params.toString();
|
|
886
|
+
if (!base) return query;
|
|
887
|
+
const cleanBase = base.split("?")[0];
|
|
888
|
+
return `${cleanBase}${query ? `?${query}` : ""}${hash}`;
|
|
702
889
|
};
|
|
703
890
|
var downloadFile = (url, name) => {
|
|
704
891
|
const a = document.createElement("a");
|
|
705
|
-
a.download = name || "\
|
|
892
|
+
a.download = name || "\u6587\u4EF6";
|
|
706
893
|
a.href = url;
|
|
707
894
|
document.body.appendChild(a);
|
|
708
895
|
a.click();
|
|
@@ -710,31 +897,28 @@ var downloadFile = (url, name) => {
|
|
|
710
897
|
window.URL.revokeObjectURL(url);
|
|
711
898
|
};
|
|
712
899
|
var addUrlLastSlash = (url = "") => {
|
|
713
|
-
const u = new URL(url, "
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
pathname += "/";
|
|
717
|
-
}
|
|
718
|
-
u.pathname = pathname;
|
|
719
|
-
return `${isExternal(url) ? u.origin : ""}${u.pathname}${u.search}${u.hash}`;
|
|
900
|
+
const u = new URL(url, "http://dummy.com");
|
|
901
|
+
if (!u.pathname.endsWith("/")) u.pathname += "/";
|
|
902
|
+
return isExternal(url) ? u.toString() : `${u.pathname}${u.search}${u.hash}`;
|
|
720
903
|
};
|
|
721
|
-
var
|
|
722
|
-
if (!preHref) return url;
|
|
723
|
-
let newUrl = "";
|
|
724
|
-
const preHrefUrl = new URL(preHref);
|
|
904
|
+
var setUrlMainSource = (url, preHref, defaultMainSource) => {
|
|
725
905
|
const urlParts = url.split("?");
|
|
726
906
|
const srcParams = new URLSearchParams(urlParts[1] || "");
|
|
727
907
|
if (srcParams.has("mainSource")) {
|
|
728
|
-
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
908
|
+
return url;
|
|
909
|
+
}
|
|
910
|
+
let mainSourceValue = defaultMainSource;
|
|
911
|
+
if (preHref) {
|
|
912
|
+
try {
|
|
913
|
+
const preHrefUrl = new URL(preHref, "http://dummy.com");
|
|
914
|
+
const preMainSource = preHrefUrl.searchParams.get("mainSource");
|
|
915
|
+
if (preMainSource) {
|
|
916
|
+
mainSourceValue = preMainSource;
|
|
917
|
+
}
|
|
918
|
+
} catch (e) {
|
|
735
919
|
}
|
|
736
920
|
}
|
|
737
|
-
return
|
|
921
|
+
return buildUrlParams({ mainSource: mainSourceValue }, url);
|
|
738
922
|
};
|
|
739
923
|
var getWebSocketUrl = (path, customHost) => {
|
|
740
924
|
const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
|
|
@@ -758,9 +942,178 @@ function transform(source, fieldMap) {
|
|
|
758
942
|
function transforms(sources, fieldMap) {
|
|
759
943
|
return sources?.map((source) => transform(source, fieldMap)) || [];
|
|
760
944
|
}
|
|
945
|
+
var convertCurrency = (money = "") => {
|
|
946
|
+
let newMoney = money;
|
|
947
|
+
const cnNums = ["\u96F6", "\u58F9", "\u8D30", "\u53C1", "\u8086", "\u4F0D", "\u9646", "\u67D2", "\u634C", "\u7396"];
|
|
948
|
+
const cnIntRadice = ["", "\u62FE", "\u4F70", "\u4EDF"];
|
|
949
|
+
const cnIntUnits = ["", "\u4E07", "\u4EBF", "\u5146"];
|
|
950
|
+
const cnDecUnits = ["\u89D2", "\u5206", "\u6BEB", "\u5398"];
|
|
951
|
+
const cnInteger = "\u6574";
|
|
952
|
+
const cnIntLast = "\u5706";
|
|
953
|
+
const minus2 = "(\u8D1F\u6570)";
|
|
954
|
+
let isMinus = false;
|
|
955
|
+
const maxNum = 1e15;
|
|
956
|
+
let integerNum;
|
|
957
|
+
let decimalNum;
|
|
958
|
+
let chineseStr = "";
|
|
959
|
+
let parts;
|
|
960
|
+
if (newMoney === "") {
|
|
961
|
+
return "";
|
|
962
|
+
}
|
|
963
|
+
newMoney = isString(newMoney) ? parseFloat(newMoney) : newMoney;
|
|
964
|
+
if (newMoney < 0) {
|
|
965
|
+
isMinus = true;
|
|
966
|
+
newMoney = Math.abs(newMoney);
|
|
967
|
+
}
|
|
968
|
+
if (newMoney >= maxNum) {
|
|
969
|
+
return "";
|
|
970
|
+
}
|
|
971
|
+
if (newMoney === 0) {
|
|
972
|
+
chineseStr = cnNums[0] + cnIntLast + cnInteger;
|
|
973
|
+
return chineseStr;
|
|
974
|
+
}
|
|
975
|
+
newMoney = newMoney.toString();
|
|
976
|
+
if (newMoney.indexOf(".") === -1) {
|
|
977
|
+
integerNum = newMoney;
|
|
978
|
+
decimalNum = "";
|
|
979
|
+
} else {
|
|
980
|
+
parts = newMoney.split(".");
|
|
981
|
+
integerNum = parts[0];
|
|
982
|
+
decimalNum = parts[1].substr(0, 4);
|
|
983
|
+
}
|
|
984
|
+
if (parseInt(integerNum, 10) > 0) {
|
|
985
|
+
let zeroCount = 0;
|
|
986
|
+
const IntLen = integerNum.length;
|
|
987
|
+
for (let i = 0; i < IntLen; i++) {
|
|
988
|
+
const n = integerNum.substr(i, 1);
|
|
989
|
+
const p = IntLen - i - 1;
|
|
990
|
+
const q = p / 4;
|
|
991
|
+
const m = p % 4;
|
|
992
|
+
if (n === "0") {
|
|
993
|
+
zeroCount++;
|
|
994
|
+
} else {
|
|
995
|
+
if (zeroCount > 0) {
|
|
996
|
+
chineseStr += cnNums[0];
|
|
997
|
+
}
|
|
998
|
+
zeroCount = 0;
|
|
999
|
+
chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
|
|
1000
|
+
}
|
|
1001
|
+
if (m === 0 && zeroCount < 4) {
|
|
1002
|
+
chineseStr += cnIntUnits[q];
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
chineseStr += cnIntLast;
|
|
1006
|
+
}
|
|
1007
|
+
if (decimalNum !== "") {
|
|
1008
|
+
const decLen = decimalNum.length;
|
|
1009
|
+
for (let i = 0; i < decLen; i++) {
|
|
1010
|
+
const n = decimalNum.substr(i, 1);
|
|
1011
|
+
if (n !== "0") {
|
|
1012
|
+
chineseStr += cnNums[Number(n)] + cnDecUnits[i];
|
|
1013
|
+
} else {
|
|
1014
|
+
chineseStr += cnNums[0];
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
if (chineseStr === "") {
|
|
1019
|
+
chineseStr += cnNums[0] + cnIntLast + cnInteger;
|
|
1020
|
+
} else if (decimalNum === "") {
|
|
1021
|
+
chineseStr += cnInteger;
|
|
1022
|
+
}
|
|
1023
|
+
if (isMinus) {
|
|
1024
|
+
chineseStr = minus2 + chineseStr;
|
|
1025
|
+
}
|
|
1026
|
+
return chineseStr;
|
|
1027
|
+
};
|
|
1028
|
+
var getRowSpanCount = (data, key, target) => {
|
|
1029
|
+
if (!Array.isArray(data)) return 1;
|
|
1030
|
+
const newData = data.map((_) => _[key]);
|
|
1031
|
+
let preValue = newData[0];
|
|
1032
|
+
const res = [[preValue]];
|
|
1033
|
+
let index = 0;
|
|
1034
|
+
for (let i = 1; i < newData.length; i++) {
|
|
1035
|
+
if (newData[i] === preValue) {
|
|
1036
|
+
res[index].push(newData[i]);
|
|
1037
|
+
} else {
|
|
1038
|
+
index += 1;
|
|
1039
|
+
res[index] = [];
|
|
1040
|
+
res[index].push(newData[i]);
|
|
1041
|
+
preValue = newData[i];
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
const arr = [];
|
|
1045
|
+
res.forEach((_) => {
|
|
1046
|
+
const len = _.length;
|
|
1047
|
+
for (let i = 0; i < len; i++) {
|
|
1048
|
+
arr.push(i === 0 ? len : 0);
|
|
1049
|
+
}
|
|
1050
|
+
});
|
|
1051
|
+
return arr[target];
|
|
1052
|
+
};
|
|
1053
|
+
var importThirdPartyFile = (document2, path) => {
|
|
1054
|
+
const type = path.endsWith(".js") ? "script" : "link";
|
|
1055
|
+
const element = type === "script" ? document2.createElement("script") : document2.createElement("link");
|
|
1056
|
+
if (type === "script") {
|
|
1057
|
+
const scriptElement = element;
|
|
1058
|
+
scriptElement.async = true;
|
|
1059
|
+
scriptElement.src = path;
|
|
1060
|
+
} else {
|
|
1061
|
+
const linkElement = element;
|
|
1062
|
+
linkElement.rel = "stylesheet";
|
|
1063
|
+
linkElement.type = "text/css";
|
|
1064
|
+
linkElement.href = path;
|
|
1065
|
+
}
|
|
1066
|
+
if (document2.head) {
|
|
1067
|
+
document2.head.appendChild(element);
|
|
1068
|
+
}
|
|
1069
|
+
};
|
|
1070
|
+
var processItemList = (items) => {
|
|
1071
|
+
return items.filter((item) => item.hidden !== true).map((item, index) => ({ key: index, ...item }));
|
|
1072
|
+
};
|
|
1073
|
+
var executeScript = (script, params) => {
|
|
1074
|
+
if (isScriptSafe(script)) {
|
|
1075
|
+
const func = new Function(
|
|
1076
|
+
...Object.keys(params),
|
|
1077
|
+
// 参数列表
|
|
1078
|
+
script
|
|
1079
|
+
// 脚本字符串
|
|
1080
|
+
);
|
|
1081
|
+
try {
|
|
1082
|
+
return func(...Object.values(params));
|
|
1083
|
+
} catch (error) {
|
|
1084
|
+
console.error("Error executing script:", error);
|
|
1085
|
+
}
|
|
1086
|
+
} else {
|
|
1087
|
+
console.error("unsafe script");
|
|
1088
|
+
}
|
|
1089
|
+
};
|
|
1090
|
+
function aesEncrypt(data, key) {
|
|
1091
|
+
if (!key) throw new Error("AES Encrypt: key is required");
|
|
1092
|
+
if (isNullOrUnDef(data)) return "";
|
|
1093
|
+
try {
|
|
1094
|
+
const text = JSON.stringify(data);
|
|
1095
|
+
return AES__default.default.encrypt(text, key.trim()).toString();
|
|
1096
|
+
} catch (err) {
|
|
1097
|
+
console.error("AES Encrypt error:", err);
|
|
1098
|
+
throw new Error("AES Encrypt failed");
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
function aesDecrypt(data, key) {
|
|
1102
|
+
if (!key) throw new Error("AES Decrypt: key is required");
|
|
1103
|
+
if (!data) return null;
|
|
1104
|
+
try {
|
|
1105
|
+
const bytes = AES__default.default.decrypt(data, key.trim());
|
|
1106
|
+
const decoded = bytes.toString(encUtf8__default.default);
|
|
1107
|
+
if (!decoded) return null;
|
|
1108
|
+
return JSON.parse(decoded);
|
|
1109
|
+
} catch (err) {
|
|
1110
|
+
console.error("AES Decrypt error:", err);
|
|
1111
|
+
return null;
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
761
1114
|
|
|
762
1115
|
// src/hooks/useDeepEffect.ts
|
|
763
|
-
|
|
1116
|
+
var useDeepEffect_default = (effect, deps) => {
|
|
764
1117
|
const prevDepsRef = React16.useRef();
|
|
765
1118
|
const depsChanged = !prevDepsRef.current || deps.length !== prevDepsRef.current.length || deps.some((dep, i) => !deepEqual(dep, prevDepsRef.current[i]));
|
|
766
1119
|
React16.useEffect(() => {
|
|
@@ -769,8 +1122,8 @@ function useDeepEffect(effect, deps) {
|
|
|
769
1122
|
return effect();
|
|
770
1123
|
}
|
|
771
1124
|
}, [depsChanged]);
|
|
772
|
-
}
|
|
773
|
-
|
|
1125
|
+
};
|
|
1126
|
+
var useRefState_default = (init) => {
|
|
774
1127
|
const [state, setState] = React16.useState(init);
|
|
775
1128
|
const stateRef = React16.useRef(init);
|
|
776
1129
|
const setProxy = (newVal) => {
|
|
@@ -779,8 +1132,8 @@ function useRefState(init) {
|
|
|
779
1132
|
};
|
|
780
1133
|
const getState = () => stateRef.current;
|
|
781
1134
|
return [state, setProxy, getState];
|
|
782
|
-
}
|
|
783
|
-
var
|
|
1135
|
+
};
|
|
1136
|
+
var useSyncInput_default = (storeValue, setStoreValue) => {
|
|
784
1137
|
const [inputValue, setInputValue] = React16.useState(storeValue);
|
|
785
1138
|
React16.useEffect(() => {
|
|
786
1139
|
if (storeValue !== inputValue) {
|
|
@@ -796,7 +1149,7 @@ var useSyncInput = (storeValue, setStoreValue) => {
|
|
|
796
1149
|
setInputValue: handleValueChange
|
|
797
1150
|
};
|
|
798
1151
|
};
|
|
799
|
-
|
|
1152
|
+
var useThrottle_default = (func, wait) => {
|
|
800
1153
|
const { current } = React16.useRef({ func, timeOut: null });
|
|
801
1154
|
React16.useEffect(() => {
|
|
802
1155
|
current.func = func;
|
|
@@ -830,18 +1183,20 @@ function useThrottle(func, wait) {
|
|
|
830
1183
|
throttle.flush = flush;
|
|
831
1184
|
throttle.cancel = cancel;
|
|
832
1185
|
return React16.useCallback(throttle, []);
|
|
833
|
-
}
|
|
1186
|
+
};
|
|
834
1187
|
dayjs__default.default.extend(relativeTime__default.default);
|
|
835
|
-
var
|
|
836
|
-
var
|
|
837
|
-
var
|
|
838
|
-
var
|
|
1188
|
+
var DEFAULT_DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
|
|
1189
|
+
var DEFAULT_DATE_FORMAT = "YYYY-MM-DD";
|
|
1190
|
+
var DEFAULT_YEAR_MONTH_FORMAT = "YYYY\u5E74MM\u6708";
|
|
1191
|
+
var DEFAULT_YEAR_MONTH_DAY_FORMAT = "YYYY\u5E74MM\u6708DD\u65E5";
|
|
1192
|
+
var DEFAULT_UNIT = "date";
|
|
1193
|
+
var getStartOfTimestamp = (date, unit = DEFAULT_UNIT) => {
|
|
839
1194
|
return dayjs__default.default(date).startOf(unit).valueOf();
|
|
840
1195
|
};
|
|
841
|
-
var getEndOfTimestamp = (date, unit =
|
|
1196
|
+
var getEndOfTimestamp = (date, unit = DEFAULT_UNIT) => {
|
|
842
1197
|
return dayjs__default.default(date).endOf(unit).valueOf();
|
|
843
1198
|
};
|
|
844
|
-
var formatDate = (date, fmt =
|
|
1199
|
+
var formatDate = (date, fmt = DEFAULT_DATE_TIME_FORMAT) => {
|
|
845
1200
|
if (date) {
|
|
846
1201
|
return dayjs__default.default(date).format(fmt);
|
|
847
1202
|
}
|
|
@@ -853,33 +1208,6 @@ var getTimestamp = (date) => {
|
|
|
853
1208
|
var isExpire = (date) => {
|
|
854
1209
|
return dayjs__default.default(date).isBefore(getStartOfTimestamp());
|
|
855
1210
|
};
|
|
856
|
-
var USER_KEY = "NS-USER";
|
|
857
|
-
function setCurrentUser(userInfo) {
|
|
858
|
-
const cipherText = AES__default.default.encrypt(JSON.stringify(userInfo), "((#II))").toString();
|
|
859
|
-
sessionStorage.setItem(USER_KEY, cipherText);
|
|
860
|
-
}
|
|
861
|
-
function getCurrentUser() {
|
|
862
|
-
const userInfoJson = sessionStorage.getItem(USER_KEY);
|
|
863
|
-
if (userInfoJson) {
|
|
864
|
-
const bytes = AES__default.default.decrypt(userInfoJson, "((#II))");
|
|
865
|
-
const originalText = bytes.toString(encUtf8__default.default);
|
|
866
|
-
return JSON.parse(originalText);
|
|
867
|
-
}
|
|
868
|
-
return null;
|
|
869
|
-
}
|
|
870
|
-
function clearCurrentUser() {
|
|
871
|
-
sessionStorage.removeItem(USER_KEY);
|
|
872
|
-
}
|
|
873
|
-
var DEVICEID_KEY = "NS-DEVICE-ID";
|
|
874
|
-
function getDeviceId() {
|
|
875
|
-
let deviceId = localStorage.getItem(DEVICEID_KEY);
|
|
876
|
-
if (deviceId) {
|
|
877
|
-
return deviceId;
|
|
878
|
-
}
|
|
879
|
-
deviceId = genNonDuplicateID();
|
|
880
|
-
localStorage.setItem(DEVICEID_KEY, deviceId);
|
|
881
|
-
return deviceId;
|
|
882
|
-
}
|
|
883
1211
|
var OperatorToMethodName = {
|
|
884
1212
|
"+": "plus",
|
|
885
1213
|
"-": "minus",
|
|
@@ -932,97 +1260,191 @@ var isInteger = (num) => {
|
|
|
932
1260
|
var isNegative = (num) => {
|
|
933
1261
|
return new Decimal__default.default(num).isNegative();
|
|
934
1262
|
};
|
|
935
|
-
var
|
|
936
|
-
const
|
|
1263
|
+
var createCachedMessage = () => {
|
|
1264
|
+
const messageCache = {};
|
|
937
1265
|
return ({ title = "\u63D0\u793A", content, type = "warning", duration = 3, onClose, isCache = true, isOnly = false }) => {
|
|
938
1266
|
if (!content) return;
|
|
939
|
-
const
|
|
940
|
-
const
|
|
941
|
-
delete
|
|
1267
|
+
const cacheKey = isOnly ? "unique-message-key" : content;
|
|
1268
|
+
const handleClose = () => {
|
|
1269
|
+
delete messageCache[cacheKey];
|
|
942
1270
|
onClose?.();
|
|
943
1271
|
};
|
|
944
|
-
if (isCache &&
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
} else {
|
|
958
|
-
lib.message[type]({
|
|
959
|
-
content,
|
|
960
|
-
duration,
|
|
961
|
-
onClose: onClose2
|
|
962
|
-
});
|
|
963
|
-
}
|
|
1272
|
+
if (isCache && messageCache[cacheKey]) return;
|
|
1273
|
+
if (isCache) {
|
|
1274
|
+
messageCache[cacheKey] = getTimestamp();
|
|
1275
|
+
}
|
|
1276
|
+
if (duration) {
|
|
1277
|
+
if (content.length > 30) {
|
|
1278
|
+
antd.notification[type]({
|
|
1279
|
+
message: title,
|
|
1280
|
+
description: content,
|
|
1281
|
+
placement: "top",
|
|
1282
|
+
duration,
|
|
1283
|
+
onClose: handleClose
|
|
1284
|
+
});
|
|
964
1285
|
} else {
|
|
965
|
-
antd.
|
|
966
|
-
title,
|
|
1286
|
+
antd.message[type]({
|
|
967
1287
|
content,
|
|
968
|
-
|
|
969
|
-
|
|
1288
|
+
duration,
|
|
1289
|
+
onClose: handleClose
|
|
970
1290
|
});
|
|
971
1291
|
}
|
|
1292
|
+
} else {
|
|
1293
|
+
antd.Modal[type]({
|
|
1294
|
+
title,
|
|
1295
|
+
content,
|
|
1296
|
+
closable: true,
|
|
1297
|
+
centered: true,
|
|
1298
|
+
footer: null,
|
|
1299
|
+
afterClose: handleClose
|
|
1300
|
+
});
|
|
972
1301
|
}
|
|
973
1302
|
};
|
|
974
1303
|
};
|
|
975
|
-
var
|
|
1304
|
+
var cachedMessage = createCachedMessage();
|
|
976
1305
|
|
|
977
|
-
// src/utils/
|
|
978
|
-
var
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
1306
|
+
// src/utils/pattern.ts
|
|
1307
|
+
var RegMobile = {
|
|
1308
|
+
pattern: /^1[3-9]\d{9}$/,
|
|
1309
|
+
message: "\u624B\u673A\u53F7\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01"
|
|
1310
|
+
};
|
|
1311
|
+
var RegFixedTelePhone = {
|
|
1312
|
+
pattern: /^0\d{2,3}-\d{7,8}$/,
|
|
1313
|
+
message: "\u7535\u8BDD\u53F7\u7801\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01"
|
|
1314
|
+
};
|
|
1315
|
+
var RegTelePhone = {
|
|
1316
|
+
pattern: /^[\\+\-\\(\\)\\(\\)\d]{1,20}$/,
|
|
1317
|
+
message: "\u7535\u8BDD\u53F7\u7801\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01"
|
|
1318
|
+
};
|
|
1319
|
+
var RegTaxNo = {
|
|
1320
|
+
pattern: /^[A-Z0-9]{15}$|^[A-Z0-9]{18}$|^[A-Z0-9]{20}$/,
|
|
1321
|
+
message: "\u7A0E\u53F7\u683C\u5F0F\u6709\u8BEF\uFF01"
|
|
1322
|
+
};
|
|
1323
|
+
var RegBankCardNo = {
|
|
1324
|
+
pattern: /^[0-9]*$/,
|
|
1325
|
+
message: "\u94F6\u884C\u5361\u53F7\u683C\u5F0F\u6709\u8BEF\uFF01"
|
|
1326
|
+
};
|
|
1327
|
+
var RegIdentityCardNo = {
|
|
1328
|
+
pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
|
|
1329
|
+
message: "\u8EAB\u4EFD\u8BC1\u53F7\u683C\u5F0F\u6709\u8BEF\uFF01"
|
|
1330
|
+
};
|
|
1331
|
+
var RegNumNo = {
|
|
1332
|
+
pattern: /^[0-9]*$/,
|
|
1333
|
+
message: "\u683C\u5F0F\u6709\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01"
|
|
1334
|
+
};
|
|
1335
|
+
var RegSmsCode = {
|
|
1336
|
+
pattern: /^[0-9]{6}$/,
|
|
1337
|
+
message: "\u9A8C\u8BC1\u7801\u4E3A6\u4F4D\u6570\u5B57"
|
|
1338
|
+
};
|
|
1339
|
+
var RegEmail = {
|
|
1340
|
+
pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
|
|
1341
|
+
message: "\u90AE\u7BB1\u683C\u5F0F\u6709\u8BEF\uFF01"
|
|
1342
|
+
};
|
|
1343
|
+
var RegDetailAddress = {
|
|
1344
|
+
pattern: /.*(街|路|村|乡|镇|道|巷|号).*/,
|
|
1345
|
+
message: "\u5FC5\u987B\u5305\u542B\u201C\u8857\u3001\u8DEF\u3001\u6751\u3001\u4E61\u3001\u9547\u3001\u9053\u3001\u5DF7\u3001\u53F7\u201D\u7B49\u5173\u952E\u8BCD\u4E4B\u4E00"
|
|
1346
|
+
};
|
|
1347
|
+
var PhoneOrMobileValidator = (errMessage = "\u8054\u7CFB\u7535\u8BDD\u683C\u5F0F\u4E0D\u6B63\u786E") => ({
|
|
1348
|
+
validator: (_, value) => !value || RegFixedTelePhone.pattern.test(value) || RegMobile.pattern.test(value) ? Promise.resolve() : Promise.reject(new Error(errMessage))
|
|
1349
|
+
});
|
|
1350
|
+
var ThanNumValidator = ({
|
|
1351
|
+
min,
|
|
1352
|
+
max,
|
|
1353
|
+
equalMin = false,
|
|
1354
|
+
equalMax = false,
|
|
1355
|
+
errMessage,
|
|
1356
|
+
maxErrMessage,
|
|
1357
|
+
minErrMessage
|
|
1358
|
+
}) => ({
|
|
1359
|
+
validator: (_, value) => {
|
|
1360
|
+
if (!value) {
|
|
1361
|
+
return Promise.resolve();
|
|
1362
|
+
}
|
|
1363
|
+
if (isNumberNoNaN(parseFloat(min))) {
|
|
1364
|
+
if (!(Number(value) > Number(min) || equalMin && Number(value) === Number(min))) {
|
|
1365
|
+
return Promise.reject(new Error(minErrMessage || errMessage || `\u4E0D\u80FD\u5C0F\u4E8E${equalMin ? "" : "\u7B49\u4E8E"}${min}`));
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
if (isNumberNoNaN(parseFloat(max))) {
|
|
1369
|
+
if (!(Number(value) < Number(max) || equalMax && Number(value) === Number(max))) {
|
|
1370
|
+
return Promise.reject(new Error(maxErrMessage || errMessage || `\u4E0D\u80FD\u5927\u4E8E${equalMax ? "" : "\u7B49\u4E8E"}${max}`));
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
return Promise.resolve();
|
|
995
1374
|
}
|
|
996
|
-
}
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
}
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1375
|
+
});
|
|
1376
|
+
var ThanNumLengthValidator = ({
|
|
1377
|
+
length,
|
|
1378
|
+
decimalsLength,
|
|
1379
|
+
integerLength,
|
|
1380
|
+
lengthErrMessage,
|
|
1381
|
+
decimalsLengthErrMessage,
|
|
1382
|
+
integerLengthErrMessage
|
|
1383
|
+
}) => ({
|
|
1384
|
+
validator: (_, value) => {
|
|
1385
|
+
if (!value) {
|
|
1386
|
+
return Promise.resolve();
|
|
1387
|
+
}
|
|
1388
|
+
if (isNumber(length)) {
|
|
1389
|
+
if (precision(value) > length) {
|
|
1390
|
+
return Promise.reject(new Error(lengthErrMessage || `\u603B\u4F4D\u6570\u4E0D\u80FD\u8D85\u8FC7${length}\u4F4D`));
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
if (isNumber(integerLength)) {
|
|
1394
|
+
if (precision(value) - decimalPlaces(value) > integerLength) {
|
|
1395
|
+
return Promise.reject(new Error(integerLengthErrMessage || `\u6574\u6570\u4F4D\u4E0D\u80FD\u8D85\u8FC7${integerLength}\u4F4D`));
|
|
1396
|
+
}
|
|
1397
|
+
}
|
|
1398
|
+
if (isNumber(decimalsLength)) {
|
|
1399
|
+
if (decimalPlaces(value) > decimalsLength) {
|
|
1400
|
+
return Promise.reject(new Error(decimalsLengthErrMessage || `\u5C0F\u6570\u4F4D\u4E0D\u80FD\u8D85\u8FC7${decimalsLength}\u4F4D`));
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
return Promise.resolve();
|
|
1404
|
+
}
|
|
1405
|
+
});
|
|
1406
|
+
var MultiEmailValidator = (max) => ({
|
|
1407
|
+
validator: (_, value) => {
|
|
1408
|
+
if (value) {
|
|
1409
|
+
const emailArr = value.split(",").map((v) => v.trim()).filter((v) => v);
|
|
1410
|
+
if (emailArr.length > max) return Promise.reject(new Error(`\u6700\u591A\u8F93\u5165${max}\u4E2A\u90AE\u7BB1`));
|
|
1411
|
+
const noEmailArr = emailArr.filter((email) => !RegEmail.pattern.test(email));
|
|
1412
|
+
if (noEmailArr.length) return Promise.reject(new Error(RegEmail.message));
|
|
1413
|
+
}
|
|
1414
|
+
return Promise.resolve();
|
|
1415
|
+
}
|
|
1416
|
+
});
|
|
1417
|
+
var HttpStatus = {
|
|
1418
|
+
/** 服务器错误 */
|
|
1419
|
+
ERROR: 500,
|
|
1420
|
+
/** 缺少参数或参数错误 */
|
|
1421
|
+
MISSING_PARAMETER: 400,
|
|
1422
|
+
/** 未授权,需要用户验证 */
|
|
1423
|
+
UNAUTHORIZED: 401,
|
|
1424
|
+
/** 禁止访问,服务器理解请求但拒绝执行 */
|
|
1425
|
+
FORBIDDEN: 403,
|
|
1426
|
+
/** 请求的资源未找到 */
|
|
1427
|
+
NOT_FOUND: 404
|
|
1428
|
+
};
|
|
1429
|
+
var BusinessCode = {
|
|
1430
|
+
/** 请求成功 */
|
|
1431
|
+
OK: 200,
|
|
1432
|
+
/** 权限拒绝,没有足够的权限执行操作 */
|
|
1433
|
+
PERMISSION_DENIED: 13001
|
|
1434
|
+
};
|
|
1435
|
+
var showError = (showError2) => showError2 !== false;
|
|
1436
|
+
function createRequest(config) {
|
|
1018
1437
|
const instance = axios__default.default.create({
|
|
1019
|
-
baseURL,
|
|
1020
|
-
|
|
1438
|
+
baseURL: "/api",
|
|
1439
|
+
// 默认基础URL
|
|
1440
|
+
timeout: 6e4,
|
|
1441
|
+
// 请求超时时间设为60秒
|
|
1442
|
+
...config
|
|
1443
|
+
// 合并传入的配置项
|
|
1021
1444
|
});
|
|
1022
1445
|
instance.interceptors.request.use(
|
|
1023
|
-
function(
|
|
1024
|
-
|
|
1025
|
-
return config;
|
|
1446
|
+
function(config2) {
|
|
1447
|
+
return config2;
|
|
1026
1448
|
},
|
|
1027
1449
|
function(error) {
|
|
1028
1450
|
return Promise.reject(error);
|
|
@@ -1031,49 +1453,80 @@ function createRequest(baseURL = "/api") {
|
|
|
1031
1453
|
instance.interceptors.response.use(
|
|
1032
1454
|
function(response) {
|
|
1033
1455
|
if (isBlob(response.data)) return response;
|
|
1034
|
-
if (response.data?.code !== OK) {
|
|
1035
|
-
const isPermission = response.data?.code === PERMISSION_DENIED;
|
|
1036
|
-
if (response.config?.showError
|
|
1037
|
-
|
|
1456
|
+
if (response.data?.code !== BusinessCode.OK) {
|
|
1457
|
+
const isPermission = response.data?.code === BusinessCode.PERMISSION_DENIED;
|
|
1458
|
+
if (showError(response.config?.showError)) {
|
|
1459
|
+
cachedMessage({
|
|
1038
1460
|
title: isPermission ? "" : void 0,
|
|
1039
1461
|
content: response.data.message,
|
|
1040
1462
|
duration: isPermission ? 0 : 3
|
|
1041
1463
|
});
|
|
1042
1464
|
}
|
|
1043
|
-
return Promise.reject(response
|
|
1465
|
+
return Promise.reject(response);
|
|
1044
1466
|
}
|
|
1045
1467
|
return response;
|
|
1046
1468
|
},
|
|
1047
1469
|
function(err) {
|
|
1048
|
-
const showError = err?.config?.showError !== false;
|
|
1049
1470
|
if (!err.response) {
|
|
1050
|
-
if (showError)
|
|
1471
|
+
if (showError(err?.config?.showError)) cachedMessage({ content: "\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC", type: "error" });
|
|
1051
1472
|
} else {
|
|
1052
1473
|
switch (err.response?.status) {
|
|
1053
|
-
case UNAUTHORIZED:
|
|
1054
|
-
if (showError)
|
|
1055
|
-
redirectUrl();
|
|
1474
|
+
case HttpStatus.UNAUTHORIZED:
|
|
1475
|
+
if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message, type: "error" });
|
|
1056
1476
|
break;
|
|
1057
1477
|
default:
|
|
1058
|
-
if (showError)
|
|
1478
|
+
if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message || "\u8BF7\u6C42\u9519\u8BEF\uFF01", type: "error" });
|
|
1059
1479
|
}
|
|
1060
1480
|
}
|
|
1061
1481
|
return Promise.reject(err);
|
|
1062
1482
|
}
|
|
1063
1483
|
);
|
|
1064
1484
|
return {
|
|
1485
|
+
/**
|
|
1486
|
+
* 返回原始 axios 实例
|
|
1487
|
+
* 可以用于添加拦截器等
|
|
1488
|
+
*/
|
|
1489
|
+
instance,
|
|
1490
|
+
/**
|
|
1491
|
+
* 发送 GET 请求
|
|
1492
|
+
* @param url - 请求地址
|
|
1493
|
+
* @param params - 查询参数
|
|
1494
|
+
* @param options - 额外的请求配置
|
|
1495
|
+
* @returns Promise<any> 响应数据
|
|
1496
|
+
*/
|
|
1065
1497
|
get: async (url, params, options) => {
|
|
1066
1498
|
const res = await instance({ method: "get", url, params, ...options });
|
|
1067
1499
|
return res.data;
|
|
1068
1500
|
},
|
|
1501
|
+
/**
|
|
1502
|
+
* 发送 POST 请求
|
|
1503
|
+
* @param url - 请求地址
|
|
1504
|
+
* @param data - 请求体数据
|
|
1505
|
+
* @param options - 额外的请求配置
|
|
1506
|
+
* @returns Promise<any> 响应数据
|
|
1507
|
+
*/
|
|
1069
1508
|
post: async (url, data, options) => {
|
|
1070
1509
|
const res = await instance({ method: "post", url, data, ...options });
|
|
1071
1510
|
return res.data;
|
|
1072
1511
|
},
|
|
1512
|
+
/**
|
|
1513
|
+
* 发送 PUT 请求
|
|
1514
|
+
* @param url - 请求地址
|
|
1515
|
+
* @param data - 请求体数据
|
|
1516
|
+
* @param options - 额外的请求配置
|
|
1517
|
+
* @returns Promise<any> 响应数据
|
|
1518
|
+
*/
|
|
1073
1519
|
put: async (url, data, options) => {
|
|
1074
1520
|
const res = await instance({ method: "put", url, data, ...options });
|
|
1075
1521
|
return res.data;
|
|
1076
1522
|
},
|
|
1523
|
+
/**
|
|
1524
|
+
* 发送 DELETE 请求
|
|
1525
|
+
* @param url - 请求地址
|
|
1526
|
+
* @param data - 请求体数据
|
|
1527
|
+
* @param options - 额外的请求配置
|
|
1528
|
+
* @returns Promise<any> 响应数据
|
|
1529
|
+
*/
|
|
1077
1530
|
delete: async (url, data, options) => {
|
|
1078
1531
|
const res = await instance({ method: "delete", url, data, ...options });
|
|
1079
1532
|
return res.data;
|
|
@@ -1081,8 +1534,66 @@ function createRequest(baseURL = "/api") {
|
|
|
1081
1534
|
};
|
|
1082
1535
|
}
|
|
1083
1536
|
|
|
1537
|
+
// src/utils/storage.ts
|
|
1538
|
+
function getDeviceId(DEVICEID_KEY) {
|
|
1539
|
+
let deviceId = localStorage.getItem(DEVICEID_KEY);
|
|
1540
|
+
if (deviceId) {
|
|
1541
|
+
return deviceId;
|
|
1542
|
+
}
|
|
1543
|
+
deviceId = genNonDuplicateID();
|
|
1544
|
+
localStorage.setItem(DEVICEID_KEY, deviceId);
|
|
1545
|
+
return deviceId;
|
|
1546
|
+
}
|
|
1547
|
+
function createSecureManager({ key, storage = localStorage, aesKey }) {
|
|
1548
|
+
const set = (data) => {
|
|
1549
|
+
if (isNullOrUnDef(data)) return;
|
|
1550
|
+
storage.setItem(key, aesKey ? aesEncrypt(data, aesKey) : isString(data) ? data : JSON.stringify(data));
|
|
1551
|
+
};
|
|
1552
|
+
const get = () => {
|
|
1553
|
+
const cipher = storage.getItem(key);
|
|
1554
|
+
if (!cipher) {
|
|
1555
|
+
return null;
|
|
1556
|
+
}
|
|
1557
|
+
if (aesKey) {
|
|
1558
|
+
return aesDecrypt(cipher, aesKey);
|
|
1559
|
+
}
|
|
1560
|
+
try {
|
|
1561
|
+
return JSON.parse(cipher);
|
|
1562
|
+
} catch (e) {
|
|
1563
|
+
console.log("Failed to parse stored data:", e);
|
|
1564
|
+
return cipher;
|
|
1565
|
+
}
|
|
1566
|
+
};
|
|
1567
|
+
const clear = () => storage.removeItem(key);
|
|
1568
|
+
return {
|
|
1569
|
+
set,
|
|
1570
|
+
get,
|
|
1571
|
+
clear
|
|
1572
|
+
};
|
|
1573
|
+
}
|
|
1574
|
+
function createTokenManager({ key, storage = localStorage }) {
|
|
1575
|
+
const tokenManager = createSecureManager({ key, storage });
|
|
1576
|
+
const getFromUrl = () => {
|
|
1577
|
+
const searchParams = new URLSearchParams(location.search);
|
|
1578
|
+
return searchParams.get(key);
|
|
1579
|
+
};
|
|
1580
|
+
const get = () => {
|
|
1581
|
+
const urlToken = getFromUrl();
|
|
1582
|
+
if (urlToken) {
|
|
1583
|
+
tokenManager.set(urlToken);
|
|
1584
|
+
return urlToken;
|
|
1585
|
+
}
|
|
1586
|
+
return tokenManager.get();
|
|
1587
|
+
};
|
|
1588
|
+
return {
|
|
1589
|
+
set: tokenManager.set,
|
|
1590
|
+
get,
|
|
1591
|
+
clear: tokenManager.clear
|
|
1592
|
+
};
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1084
1595
|
// src/hooks/webSocket/useWebSocket.ts
|
|
1085
|
-
var
|
|
1596
|
+
var useWebSocket_default = ({
|
|
1086
1597
|
url,
|
|
1087
1598
|
onMessage,
|
|
1088
1599
|
onClose,
|
|
@@ -1090,11 +1601,8 @@ var useWebSocket = ({
|
|
|
1090
1601
|
heartbeatMessage = "ping",
|
|
1091
1602
|
clientHeartbeat = true,
|
|
1092
1603
|
reconnectInterval = 5e3,
|
|
1093
|
-
// 默认重连间隔为 5 秒
|
|
1094
1604
|
maxReconnectAttempts,
|
|
1095
|
-
// 不设置默认值为无限重连
|
|
1096
1605
|
isReconnect = true
|
|
1097
|
-
// 默认开启重连机制
|
|
1098
1606
|
}) => {
|
|
1099
1607
|
const socketRef = React16.useRef(null);
|
|
1100
1608
|
const heartbeatIntervalRef = React16.useRef(null);
|
|
@@ -1118,6 +1626,7 @@ var useWebSocket = ({
|
|
|
1118
1626
|
const stopHeartbeat = () => {
|
|
1119
1627
|
if (heartbeatIntervalRef.current) {
|
|
1120
1628
|
clearInterval(heartbeatIntervalRef.current);
|
|
1629
|
+
heartbeatIntervalRef.current = null;
|
|
1121
1630
|
}
|
|
1122
1631
|
};
|
|
1123
1632
|
const stopReconnectTimer = () => {
|
|
@@ -1205,19 +1714,22 @@ var useWebSocket = ({
|
|
|
1205
1714
|
stopReconnectTimer();
|
|
1206
1715
|
};
|
|
1207
1716
|
}, [url]);
|
|
1208
|
-
const sendMessage = (
|
|
1717
|
+
const sendMessage = (message3) => {
|
|
1209
1718
|
if (socketRef.current?.readyState === WebSocket.OPEN) {
|
|
1210
|
-
socketRef.current.send(
|
|
1719
|
+
socketRef.current.send(message3);
|
|
1211
1720
|
stopHeartbeat();
|
|
1212
1721
|
startHeartbeat(socketRef.current);
|
|
1722
|
+
} else {
|
|
1723
|
+
console.warn("WebSocket \u672A\u8FDE\u63A5\uFF0C\u65E0\u6CD5\u53D1\u9001\u6D88\u606F:", message3);
|
|
1213
1724
|
}
|
|
1214
1725
|
};
|
|
1215
1726
|
return {
|
|
1727
|
+
/** 发送消息方法 */
|
|
1216
1728
|
sendMessage,
|
|
1729
|
+
/** Socket 连接状态 */
|
|
1217
1730
|
socketReadyState
|
|
1218
1731
|
};
|
|
1219
1732
|
};
|
|
1220
|
-
var useWebSocket_default = useWebSocket;
|
|
1221
1733
|
var ProtectedView = ({
|
|
1222
1734
|
passwordStatus,
|
|
1223
1735
|
verifyPassword,
|
|
@@ -1243,8 +1755,8 @@ var ProtectedView = ({
|
|
|
1243
1755
|
var PdfPreview_default = ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumbnails = true, onSetPassword, onSetPageNo }) => {
|
|
1244
1756
|
const embedRef = React16.useRef(null);
|
|
1245
1757
|
const [sizes, setSizes] = React16.useState([0]);
|
|
1246
|
-
const [, setDocLoaded, getDocLoaded] =
|
|
1247
|
-
const [currentPage, setCurrentPage, getCurrentPage] =
|
|
1758
|
+
const [, setDocLoaded, getDocLoaded] = useRefState_default(false);
|
|
1759
|
+
const [currentPage, setCurrentPage, getCurrentPage] = useRefState_default(void 0);
|
|
1248
1760
|
const [temporaryPassword, setTemporaryPassword] = React16.useState("");
|
|
1249
1761
|
const jumpToPageNo = React16.useRef();
|
|
1250
1762
|
const onVerifyPasswordEnd = (password2) => {
|
|
@@ -1290,25 +1802,25 @@ var PdfPreview_default = ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumb
|
|
|
1290
1802
|
}, 0);
|
|
1291
1803
|
}, [pageNo]);
|
|
1292
1804
|
const renderError = (error) => {
|
|
1293
|
-
let
|
|
1805
|
+
let message3 = "";
|
|
1294
1806
|
switch (error.name) {
|
|
1295
1807
|
case "InvalidPDFException":
|
|
1296
|
-
|
|
1808
|
+
message3 = "\u6587\u4EF6\u65E0\u6548\u6216\u5DF2\u635F\u574F";
|
|
1297
1809
|
break;
|
|
1298
1810
|
case "MissingPDFException":
|
|
1299
|
-
|
|
1811
|
+
message3 = "\u6587\u4EF6\u4E0D\u5B58\u5728";
|
|
1300
1812
|
break;
|
|
1301
1813
|
case "UnexpectedResponseException":
|
|
1302
|
-
|
|
1814
|
+
message3 = "\u610F\u5916\u7684\u670D\u52A1\u5668\u54CD\u5E94";
|
|
1303
1815
|
break;
|
|
1304
1816
|
// case 'CMapReaderFactory not initialized':
|
|
1305
1817
|
// message = '字体映射文件加载失败,请刷新页面重试'
|
|
1306
1818
|
// break
|
|
1307
1819
|
default:
|
|
1308
|
-
|
|
1820
|
+
message3 = "\u65E0\u6CD5\u52A0\u8F7D\u6587\u6863";
|
|
1309
1821
|
break;
|
|
1310
1822
|
}
|
|
1311
|
-
return /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { className: "height-full", justify: "center", align: "center", children: /* @__PURE__ */ jsxRuntime.jsx(antd.Alert, { message:
|
|
1823
|
+
return /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { className: "height-full", justify: "center", align: "center", children: /* @__PURE__ */ jsxRuntime.jsx(antd.Alert, { message: message3, type: "error", showIcon: true }) });
|
|
1312
1824
|
};
|
|
1313
1825
|
const onPageChange = (e) => {
|
|
1314
1826
|
let newCurrentPage = e.currentPage;
|
|
@@ -1451,10 +1963,10 @@ var FilePreviewDrawer_default = ({
|
|
|
1451
1963
|
var styles_module_default2 = {
|
|
1452
1964
|
iframe: "styles_module_iframe"
|
|
1453
1965
|
};
|
|
1454
|
-
var Iframe_default = React16.forwardRef(({ id, src, className, onLoad }, ref) => {
|
|
1966
|
+
var Iframe_default = React16.forwardRef(({ defaultMainSource, id, src, className, onLoad }, ref) => {
|
|
1455
1967
|
const [loading, setLoading] = React16.useState(false);
|
|
1456
1968
|
const finalSrc = React16.useMemo(() => {
|
|
1457
|
-
return buildUrlParams({ v: Date.now() }, addUrlLastSlash(
|
|
1969
|
+
return buildUrlParams({ v: Date.now() }, addUrlLastSlash(setUrlMainSource(src, location.href, defaultMainSource)));
|
|
1458
1970
|
}, [src]);
|
|
1459
1971
|
const onHandleLoad = () => {
|
|
1460
1972
|
setLoading(false);
|
|
@@ -1463,7 +1975,17 @@ var Iframe_default = React16.forwardRef(({ id, src, className, onLoad }, ref) =>
|
|
|
1463
1975
|
React16.useEffect(() => {
|
|
1464
1976
|
setLoading(true);
|
|
1465
1977
|
}, [src]);
|
|
1466
|
-
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(antd.Spin, { spinning: loading, wrapperClassName: "full-spin", tip: "\u52A0\u8F7D\u4E2D...", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1978
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(antd.Spin, { spinning: loading, wrapperClassName: "full-spin", tip: "\u52A0\u8F7D\u4E2D...", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1979
|
+
"iframe",
|
|
1980
|
+
{
|
|
1981
|
+
id,
|
|
1982
|
+
ref,
|
|
1983
|
+
src: finalSrc,
|
|
1984
|
+
className: classNames2__default.default(styles_module_default2.iframe, className),
|
|
1985
|
+
onLoad: onHandleLoad,
|
|
1986
|
+
allow: "clipboard-write"
|
|
1987
|
+
}
|
|
1988
|
+
) }) });
|
|
1467
1989
|
});
|
|
1468
1990
|
var Link = TiptapLink__default.default.extend({
|
|
1469
1991
|
inclusive: false,
|
|
@@ -5116,7 +5638,7 @@ var MarkdownEditor_default = ({
|
|
|
5116
5638
|
editor?.commands.setContent(value);
|
|
5117
5639
|
lastContentRef.current = value;
|
|
5118
5640
|
}, [value, editor]);
|
|
5119
|
-
const onPageChange =
|
|
5641
|
+
const onPageChange = useDebounce_default((pageIndex) => {
|
|
5120
5642
|
onScrollPage?.(parseInt(pageIndex ?? "0"));
|
|
5121
5643
|
}, 300);
|
|
5122
5644
|
React16.useEffect(() => {
|
|
@@ -5239,7 +5761,7 @@ function renderDefault(DefaultComponent, ref, props) {
|
|
|
5239
5761
|
if (!DefaultComponent) return null;
|
|
5240
5762
|
return isRenderFn(DefaultComponent) ? /* @__PURE__ */ jsxRuntime.jsx(DefaultComponent, { ref, ...props }) : DefaultComponent;
|
|
5241
5763
|
}
|
|
5242
|
-
var
|
|
5764
|
+
var RenderWrapper_default = React16.forwardRef(function RenderWrapper({ control = true, ctx, DefaultComponent }, ref) {
|
|
5243
5765
|
if (control === false || isNull(control)) return null;
|
|
5244
5766
|
if (control === true || control === void 0) {
|
|
5245
5767
|
return renderDefault(DefaultComponent, ref);
|
|
@@ -5269,43 +5791,57 @@ function propsMerge(control, props) {
|
|
|
5269
5791
|
return null;
|
|
5270
5792
|
}
|
|
5271
5793
|
var UserAvatar_default = ({ size, avatarSrc, userName }) => {
|
|
5272
|
-
return avatarSrc ? /* @__PURE__ */ jsxRuntime.jsx(antd.Avatar, { size, src: avatarSrc }) : /* @__PURE__ */ jsxRuntime.jsx(antd.Avatar, { size, className: "cursor-pointer", style: { backgroundColor:
|
|
5794
|
+
return avatarSrc ? /* @__PURE__ */ jsxRuntime.jsx(antd.Avatar, { size, src: avatarSrc }) : /* @__PURE__ */ jsxRuntime.jsx(antd.Avatar, { size, className: "cursor-pointer", style: { backgroundColor: "var(--ant-color-primary)" }, children: userName?.slice(0, 1)?.toLocaleUpperCase() });
|
|
5273
5795
|
};
|
|
5274
5796
|
|
|
5275
5797
|
exports.AudioPlayer = AudioPlayer_default;
|
|
5276
|
-
exports.
|
|
5277
|
-
exports.
|
|
5278
|
-
exports.
|
|
5279
|
-
exports.
|
|
5798
|
+
exports.BusinessCode = BusinessCode;
|
|
5799
|
+
exports.DEFAULT_DATE_FORMAT = DEFAULT_DATE_FORMAT;
|
|
5800
|
+
exports.DEFAULT_DATE_TIME_FORMAT = DEFAULT_DATE_TIME_FORMAT;
|
|
5801
|
+
exports.DEFAULT_YEAR_MONTH_DAY_FORMAT = DEFAULT_YEAR_MONTH_DAY_FORMAT;
|
|
5802
|
+
exports.DEFAULT_YEAR_MONTH_FORMAT = DEFAULT_YEAR_MONTH_FORMAT;
|
|
5280
5803
|
exports.FileIcon = FileIcon_default;
|
|
5281
5804
|
exports.FilePreview = FilePreview_default;
|
|
5282
5805
|
exports.FilePreviewDrawer = FilePreviewDrawer_default;
|
|
5806
|
+
exports.HttpStatus = HttpStatus;
|
|
5283
5807
|
exports.Iframe = Iframe_default;
|
|
5284
5808
|
exports.LazyComponent = LazyComponent_default;
|
|
5285
|
-
exports.LgPrimaryColor = LgPrimaryColor;
|
|
5286
|
-
exports.MISSING_PARAMETER = MISSING_PARAMETER;
|
|
5287
5809
|
exports.MarkdownEditor = MarkdownEditor_default;
|
|
5288
5810
|
exports.MarkdownPreview = MarkdownPreview_default;
|
|
5289
|
-
exports.
|
|
5290
|
-
exports.OK = OK;
|
|
5291
|
-
exports.PERMISSION_DENIED = PERMISSION_DENIED;
|
|
5811
|
+
exports.MultiEmailValidator = MultiEmailValidator;
|
|
5292
5812
|
exports.PdfPreview = PdfPreview_default;
|
|
5813
|
+
exports.PhoneOrMobileValidator = PhoneOrMobileValidator;
|
|
5814
|
+
exports.RegBankCardNo = RegBankCardNo;
|
|
5815
|
+
exports.RegDetailAddress = RegDetailAddress;
|
|
5816
|
+
exports.RegEmail = RegEmail;
|
|
5817
|
+
exports.RegFixedTelePhone = RegFixedTelePhone;
|
|
5818
|
+
exports.RegIdentityCardNo = RegIdentityCardNo;
|
|
5819
|
+
exports.RegMobile = RegMobile;
|
|
5820
|
+
exports.RegNumNo = RegNumNo;
|
|
5821
|
+
exports.RegSmsCode = RegSmsCode;
|
|
5822
|
+
exports.RegTaxNo = RegTaxNo;
|
|
5823
|
+
exports.RegTelePhone = RegTelePhone;
|
|
5293
5824
|
exports.RenderMarkdown = RenderMarkdown_default;
|
|
5294
|
-
exports.RenderWrapper =
|
|
5295
|
-
exports.
|
|
5296
|
-
exports.
|
|
5825
|
+
exports.RenderWrapper = RenderWrapper_default;
|
|
5826
|
+
exports.ThanNumLengthValidator = ThanNumLengthValidator;
|
|
5827
|
+
exports.ThanNumValidator = ThanNumValidator;
|
|
5297
5828
|
exports.UserAvatar = UserAvatar_default;
|
|
5298
5829
|
exports.VideoPlayer = VideoPlayer_default;
|
|
5299
5830
|
exports.absVal = absVal;
|
|
5300
5831
|
exports.addUrlLastSlash = addUrlLastSlash;
|
|
5832
|
+
exports.aesDecrypt = aesDecrypt;
|
|
5833
|
+
exports.aesEncrypt = aesEncrypt;
|
|
5301
5834
|
exports.arrToObj = arrToObj;
|
|
5302
5835
|
exports.buildUrlParams = buildUrlParams;
|
|
5836
|
+
exports.cachedMessage = cachedMessage;
|
|
5303
5837
|
exports.calculate = calculate;
|
|
5304
|
-
exports.clearCurrentUser = clearCurrentUser;
|
|
5305
|
-
exports.clearToken = clearToken;
|
|
5306
5838
|
exports.compareNum = compareNum;
|
|
5839
|
+
exports.convertCurrency = convertCurrency;
|
|
5840
|
+
exports.convertNewlineToBr = convertNewlineToBr;
|
|
5307
5841
|
exports.copyText = copyText;
|
|
5308
5842
|
exports.createRequest = createRequest;
|
|
5843
|
+
exports.createSecureManager = createSecureManager;
|
|
5844
|
+
exports.createTokenManager = createTokenManager;
|
|
5309
5845
|
exports.decimalPlaces = decimalPlaces;
|
|
5310
5846
|
exports.deepCopy = deepCopy;
|
|
5311
5847
|
exports.deepEqual = deepEqual;
|
|
@@ -5314,27 +5850,25 @@ exports.dividedBy = dividedBy;
|
|
|
5314
5850
|
exports.downloadFile = downloadFile;
|
|
5315
5851
|
exports.emit = emit;
|
|
5316
5852
|
exports.emitToChild = emitToChild;
|
|
5853
|
+
exports.executeScript = executeScript;
|
|
5317
5854
|
exports.formatDate = formatDate;
|
|
5318
5855
|
exports.formatNumberWithCommas = formatNumberWithCommas;
|
|
5319
5856
|
exports.genNonDuplicateID = genNonDuplicateID;
|
|
5320
5857
|
exports.generateRandomNumbers = generateRandomNumbers;
|
|
5321
|
-
exports.
|
|
5858
|
+
exports.getAllUrlParams = getAllUrlParams;
|
|
5322
5859
|
exports.getDeviceId = getDeviceId;
|
|
5323
5860
|
exports.getEndOfTimestamp = getEndOfTimestamp;
|
|
5324
5861
|
exports.getFileName = getFileName;
|
|
5325
5862
|
exports.getFileSuffixName = getFileSuffixName;
|
|
5326
|
-
exports.
|
|
5863
|
+
exports.getRowSpanCount = getRowSpanCount;
|
|
5327
5864
|
exports.getStartOfTimestamp = getStartOfTimestamp;
|
|
5328
5865
|
exports.getTimestamp = getTimestamp;
|
|
5329
|
-
exports.getToken = getToken;
|
|
5330
|
-
exports.getUrlMainSource = getUrlMainSource;
|
|
5331
|
-
exports.getUrlToken = getUrlToken;
|
|
5332
5866
|
exports.getWebSocketUrl = getWebSocketUrl;
|
|
5867
|
+
exports.importThirdPartyFile = importThirdPartyFile;
|
|
5333
5868
|
exports.is = is;
|
|
5334
5869
|
exports.isArray = isArray;
|
|
5335
5870
|
exports.isBlob = isBlob;
|
|
5336
5871
|
exports.isBoolean = isBoolean;
|
|
5337
|
-
exports.isClient = isClient;
|
|
5338
5872
|
exports.isDate = isDate;
|
|
5339
5873
|
exports.isDef = isDef;
|
|
5340
5874
|
exports.isElement = isElement;
|
|
@@ -5344,6 +5878,7 @@ exports.isExpire = isExpire;
|
|
|
5344
5878
|
exports.isExternal = isExternal;
|
|
5345
5879
|
exports.isFunction = isFunction;
|
|
5346
5880
|
exports.isInteger = isInteger;
|
|
5881
|
+
exports.isJson = isJson;
|
|
5347
5882
|
exports.isLocalhost = isLocalhost;
|
|
5348
5883
|
exports.isMap = isMap;
|
|
5349
5884
|
exports.isNegative = isNegative;
|
|
@@ -5353,33 +5888,35 @@ exports.isNumber = isNumber;
|
|
|
5353
5888
|
exports.isNumberNoNaN = isNumberNoNaN;
|
|
5354
5889
|
exports.isObject = isObject;
|
|
5355
5890
|
exports.isPromise = isPromise;
|
|
5891
|
+
exports.isReferenceType = isReferenceType;
|
|
5356
5892
|
exports.isRegExp = isRegExp;
|
|
5357
|
-
exports.
|
|
5893
|
+
exports.isScriptSafe = isScriptSafe;
|
|
5894
|
+
exports.isSet = isSet;
|
|
5358
5895
|
exports.isString = isString;
|
|
5359
5896
|
exports.isUnDef = isUnDef;
|
|
5360
5897
|
exports.isWindow = isWindow;
|
|
5361
5898
|
exports.minus = minus;
|
|
5362
|
-
exports.nsSetInterval = nsSetInterval;
|
|
5363
5899
|
exports.objToOptions = objToOptions;
|
|
5364
5900
|
exports.plus = plus;
|
|
5365
5901
|
exports.precision = precision;
|
|
5902
|
+
exports.processItemList = processItemList;
|
|
5366
5903
|
exports.propsMerge = propsMerge;
|
|
5367
|
-
exports.
|
|
5368
|
-
exports.
|
|
5904
|
+
exports.setInterval = setInterval2;
|
|
5905
|
+
exports.setUrlMainSource = setUrlMainSource;
|
|
5369
5906
|
exports.shouldRender = shouldRender;
|
|
5370
|
-
exports.textAreaView = textAreaView;
|
|
5371
|
-
exports.themeConfig = themeConfig;
|
|
5372
5907
|
exports.times = times;
|
|
5373
5908
|
exports.toFixed = toFixed;
|
|
5374
5909
|
exports.transform = transform;
|
|
5375
5910
|
exports.transforms = transforms;
|
|
5376
|
-
exports.
|
|
5377
|
-
exports.
|
|
5378
|
-
exports.
|
|
5379
|
-
exports.
|
|
5380
|
-
exports.
|
|
5381
|
-
exports.
|
|
5382
|
-
exports.
|
|
5911
|
+
exports.useAutoRefresh = useAutoRefresh_default;
|
|
5912
|
+
exports.useCountDown = useCountDown_default;
|
|
5913
|
+
exports.useCreateValtioContext = useCreateValtioContext_default;
|
|
5914
|
+
exports.useDebounce = useDebounce_default;
|
|
5915
|
+
exports.useDeepEffect = useDeepEffect_default;
|
|
5916
|
+
exports.useIframeRelayBridge = useIframeRelayBridge_default;
|
|
5917
|
+
exports.useRefState = useRefState_default;
|
|
5918
|
+
exports.useSyncInput = useSyncInput_default;
|
|
5919
|
+
exports.useThrottle = useThrottle_default;
|
|
5383
5920
|
exports.useWebSocket = useWebSocket_default;
|
|
5384
5921
|
//# sourceMappingURL=index.cjs.js.map
|
|
5385
5922
|
//# sourceMappingURL=index.cjs.js.map
|