@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.esm.js
CHANGED
|
@@ -2,7 +2,7 @@ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
|
2
2
|
import { FileUnknownOutlined, FileZipOutlined, FileMarkdownOutlined, FileGifOutlined, FileImageOutlined, FileJpgOutlined, NotificationOutlined, VideoCameraOutlined, FilePptOutlined, FileExcelOutlined, FileWordOutlined, FilePdfOutlined, FileTextOutlined } from '@ant-design/icons';
|
|
3
3
|
import * as React16 from 'react';
|
|
4
4
|
import { forwardRef, useState, useMemo, useEffect, lazy, Suspense, useRef, createContext, useCallback, useContext } from 'react';
|
|
5
|
-
import { Spin, Result, Splitter, Empty, Image, Flex, Drawer, Tag, Avatar, Alert,
|
|
5
|
+
import { Spin, Result, message, notification, Modal, Splitter, Empty, Image, Flex, Drawer, Tag, Avatar, Alert, Form, Input, Button } from 'antd';
|
|
6
6
|
import parse from 'html-react-parser';
|
|
7
7
|
import { jsonrepair } from 'jsonrepair';
|
|
8
8
|
import markdownit from 'markdown-it';
|
|
@@ -13,13 +13,12 @@ import { zoomPlugin } from '@react-pdf-viewer/zoom';
|
|
|
13
13
|
import '@react-pdf-viewer/core/lib/styles/index.css';
|
|
14
14
|
import zh_CN from '@react-pdf-viewer/locales/lib/zh_CN.json';
|
|
15
15
|
import '@react-pdf-viewer/page-navigation/lib/styles/index.css';
|
|
16
|
-
import dayjs from 'dayjs';
|
|
17
|
-
import relativeTime from 'dayjs/plugin/relativeTime';
|
|
18
16
|
import AES from 'crypto-js/aes';
|
|
19
17
|
import encUtf8 from 'crypto-js/enc-utf8';
|
|
18
|
+
import dayjs from 'dayjs';
|
|
19
|
+
import relativeTime from 'dayjs/plugin/relativeTime';
|
|
20
20
|
import Decimal from 'decimal.js';
|
|
21
21
|
import axios from 'axios';
|
|
22
|
-
import { message } from 'antd/lib';
|
|
23
22
|
import '@react-pdf-viewer/thumbnail/lib/styles/index.css';
|
|
24
23
|
import '@react-pdf-viewer/zoom/lib/styles/index.css';
|
|
25
24
|
import classNames2 from 'classnames';
|
|
@@ -59,24 +58,8 @@ var AudioPlayer_default = ({ fileUrl }) => {
|
|
|
59
58
|
"\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301 audio \u6807\u7B7E\u3002"
|
|
60
59
|
] });
|
|
61
60
|
};
|
|
62
|
-
|
|
63
|
-
// src/utils/theme.ts
|
|
64
|
-
var getPrimaryColor = () => {
|
|
65
|
-
const searchParams = new URLSearchParams(location.search);
|
|
66
|
-
const mainSource = searchParams.get("mainSource") || "cube-uc";
|
|
67
|
-
if (mainSource === "cube-uc") {
|
|
68
|
-
return "#34AFBE";
|
|
69
|
-
} else if (mainSource === "uc") {
|
|
70
|
-
return "#FA541C";
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
var LgPrimaryColor = getPrimaryColor();
|
|
74
|
-
var themeConfig = {
|
|
75
|
-
token: { colorPrimary: LgPrimaryColor, colorLink: LgPrimaryColor },
|
|
76
|
-
cssVar: true
|
|
77
|
-
};
|
|
78
61
|
var FileIcon_default = ({ suffix, fontSize = 22 }) => {
|
|
79
|
-
const styles = { fontSize, color:
|
|
62
|
+
const styles = { fontSize, color: "var(--ant-color-primary)" };
|
|
80
63
|
const Icon = useMemo(() => {
|
|
81
64
|
switch (suffix?.toUpperCase()) {
|
|
82
65
|
case "TXT":
|
|
@@ -171,7 +154,7 @@ function highlightKeywords(html, keywords) {
|
|
|
171
154
|
function makePlaceholder(id) {
|
|
172
155
|
return `__ALERT_DATA_${id}__`;
|
|
173
156
|
}
|
|
174
|
-
function
|
|
157
|
+
function alertMarkClean(src) {
|
|
175
158
|
let pos = 0;
|
|
176
159
|
let id = 0;
|
|
177
160
|
let out = "";
|
|
@@ -187,17 +170,13 @@ function extractAlertPlaceholders(src) {
|
|
|
187
170
|
const relAfter = afterStart.slice(":::alert".length);
|
|
188
171
|
const matchLineEnd = relAfter.search(/\s*:::\s*/);
|
|
189
172
|
let endIdx = -1;
|
|
173
|
+
let isNoEnd = 1;
|
|
190
174
|
if (matchLineEnd !== -1) {
|
|
191
|
-
endIdx = start + ":::alert".length + matchLineEnd
|
|
175
|
+
endIdx = start + ":::alert".length + matchLineEnd;
|
|
176
|
+
isNoEnd = 0;
|
|
192
177
|
} else {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
out += src.slice(start);
|
|
196
|
-
pos = src.length;
|
|
197
|
-
break;
|
|
198
|
-
} else {
|
|
199
|
-
endIdx = fallback;
|
|
200
|
-
}
|
|
178
|
+
endIdx = src.length;
|
|
179
|
+
isNoEnd = 1;
|
|
201
180
|
}
|
|
202
181
|
const inner = src.slice(start + ":::alert".length, endIdx).trim();
|
|
203
182
|
const typeMatch = inner.match(/type\s*=\s*(?:(['"])(.*?)\1|(\S+))/);
|
|
@@ -209,8 +188,8 @@ function extractAlertPlaceholders(src) {
|
|
|
209
188
|
}
|
|
210
189
|
const ph = makePlaceholder(id++);
|
|
211
190
|
placeholders.set(ph, rawData);
|
|
212
|
-
const typeText = type ? `
|
|
213
|
-
out += `:::alert${typeText} data="${ph}" :::`;
|
|
191
|
+
const typeText = type ? `type=${JSON.stringify(type)}` : "";
|
|
192
|
+
out += `:::alert ${typeText} data="${ph}" loading="${isNoEnd}" :::`;
|
|
214
193
|
const realClose = src.indexOf(":::", endIdx);
|
|
215
194
|
pos = realClose === -1 ? endIdx : realClose + 3;
|
|
216
195
|
}
|
|
@@ -239,33 +218,23 @@ try {
|
|
|
239
218
|
var RenderMarkdown_default = ({ content = "", searchValue, customComponents, onChange, onPartialChange }) => {
|
|
240
219
|
const reactContent = useMemo(() => {
|
|
241
220
|
if (!content) return null;
|
|
242
|
-
|
|
243
|
-
const openCount = (fixedContent.match(/:::alert\b/g) || []).length;
|
|
244
|
-
const closeCount = (fixedContent.match(/\s*:::\s*/gm) || []).length - openCount;
|
|
245
|
-
let incomplete = false;
|
|
246
|
-
if (openCount > closeCount) {
|
|
247
|
-
incomplete = true;
|
|
248
|
-
fixedContent += " :::";
|
|
249
|
-
}
|
|
250
|
-
const { text: preprocessed, placeholders } = extractAlertPlaceholders(fixedContent);
|
|
221
|
+
const { text: preprocessed, placeholders } = alertMarkClean(content);
|
|
251
222
|
let rawHtml = md.render(preprocessed);
|
|
252
223
|
rawHtml = searchValue ? highlightKeywords(rawHtml, [searchValue]) : rawHtml;
|
|
253
224
|
let lazyIndex = -1;
|
|
254
|
-
const allLazyMatches = [...rawHtml.matchAll(/<lazy-component/gi)];
|
|
255
|
-
const lastLazyIndex = allLazyMatches.length - 1;
|
|
256
225
|
return parse(rawHtml, {
|
|
257
226
|
replace: (domNode) => {
|
|
258
227
|
if (domNode.name === "lazy-component") {
|
|
259
228
|
lazyIndex++;
|
|
260
229
|
const el = domNode;
|
|
261
230
|
const type = el.attribs.type;
|
|
231
|
+
const loading = !!Number(el.attribs.loading);
|
|
262
232
|
const dataAttr = el.attribs.data || "";
|
|
263
233
|
let data = {};
|
|
264
234
|
if (/^__ALERT_DATA_\d+__$/.test(dataAttr)) {
|
|
265
235
|
const raw = placeholders.get(dataAttr) ?? "";
|
|
266
236
|
data = parseData(raw);
|
|
267
237
|
}
|
|
268
|
-
const loading = incomplete && lazyIndex === lastLazyIndex;
|
|
269
238
|
return /* @__PURE__ */ jsx(
|
|
270
239
|
LazyComponent_default,
|
|
271
240
|
{
|
|
@@ -370,7 +339,7 @@ function isNumber(val) {
|
|
|
370
339
|
return is(val, "Number");
|
|
371
340
|
}
|
|
372
341
|
function isNumberNoNaN(val) {
|
|
373
|
-
return
|
|
342
|
+
return isNumber(val) && !isNaN(val);
|
|
374
343
|
}
|
|
375
344
|
function isString(val) {
|
|
376
345
|
return is(val, "String");
|
|
@@ -391,7 +360,7 @@ function isArray(val) {
|
|
|
391
360
|
return Array.isArray(val);
|
|
392
361
|
}
|
|
393
362
|
function isEmpty(val) {
|
|
394
|
-
if (
|
|
363
|
+
if (isString(val) || isArray(val)) {
|
|
395
364
|
return val.length === 0;
|
|
396
365
|
}
|
|
397
366
|
if (isNullOrUnDef(val)) {
|
|
@@ -403,28 +372,89 @@ function isEmpty(val) {
|
|
|
403
372
|
return isEmptyObj(val);
|
|
404
373
|
}
|
|
405
374
|
function isWindow(val) {
|
|
406
|
-
return
|
|
375
|
+
return is(val, "Window");
|
|
407
376
|
}
|
|
408
377
|
function isElement(val) {
|
|
409
|
-
return isObject(val) && !!val
|
|
378
|
+
return isObject(val) && !!val?.tagName;
|
|
410
379
|
}
|
|
411
380
|
function isMap(val) {
|
|
412
381
|
return is(val, "Map");
|
|
413
382
|
}
|
|
414
|
-
|
|
415
|
-
|
|
383
|
+
function isSet(val) {
|
|
384
|
+
return is(val, "Set");
|
|
385
|
+
}
|
|
416
386
|
var isExternal = (path) => {
|
|
417
|
-
|
|
387
|
+
if (!isString(path)) return false;
|
|
388
|
+
return /^(https?:|mailto:|tel:|ftp:)/.test(path);
|
|
418
389
|
};
|
|
419
390
|
var isBlob = (val) => {
|
|
420
391
|
return is(val, "Blob");
|
|
421
392
|
};
|
|
422
393
|
var isLocalhost = (host) => {
|
|
423
|
-
|
|
394
|
+
const targetHost = host || location.host;
|
|
395
|
+
return /^(localhost|127\.0\.0\.1|0\.0\.0\.0|\[?::1\]?)(:\d+)?$/.test(targetHost);
|
|
396
|
+
};
|
|
397
|
+
function isReferenceType(val) {
|
|
398
|
+
return typeof val === "object" && !isNull(val) || isFunction(val);
|
|
399
|
+
}
|
|
400
|
+
var isScriptSafe = (script) => {
|
|
401
|
+
if (isString(script)) {
|
|
402
|
+
const unsafeKeywords = [
|
|
403
|
+
"eval",
|
|
404
|
+
// 动态执行代码,极高风险
|
|
405
|
+
"new Function",
|
|
406
|
+
// 动态创建函数,高风险
|
|
407
|
+
"setTimeout",
|
|
408
|
+
// 可能被用于延迟恶意代码执行
|
|
409
|
+
"setInterval",
|
|
410
|
+
// 可能被用于持续执行恶意代码
|
|
411
|
+
"window",
|
|
412
|
+
// 访问全局窗口对象
|
|
413
|
+
"document",
|
|
414
|
+
// 访问文档对象,可能操作DOM
|
|
415
|
+
"location",
|
|
416
|
+
// 可能被用于钓鱼攻击或重定向
|
|
417
|
+
"navigator",
|
|
418
|
+
// 访问浏览器信息
|
|
419
|
+
"localStorage",
|
|
420
|
+
// 访问本地存储数据
|
|
421
|
+
"sessionStorage",
|
|
422
|
+
// 访问会话存储数据
|
|
423
|
+
"history",
|
|
424
|
+
// 可能被用于操纵浏览历史
|
|
425
|
+
"fetch",
|
|
426
|
+
// 发起网络请求
|
|
427
|
+
"XMLHttpRequest",
|
|
428
|
+
// 发起 AJAX 请求
|
|
429
|
+
"WebSocket",
|
|
430
|
+
// 建立 WebSocket 连接
|
|
431
|
+
"alert",
|
|
432
|
+
// 弹出警告框(可能用于社会工程学攻击)
|
|
433
|
+
"confirm",
|
|
434
|
+
// 弹出确认框(可能用于社会工程学攻击)
|
|
435
|
+
"prompt"
|
|
436
|
+
// 弹出输入框(可能用于社会工程学攻击)
|
|
437
|
+
// 'console' // 控制台对象(通常被注释掉)
|
|
438
|
+
];
|
|
439
|
+
const regex = new RegExp(`\\b(${unsafeKeywords.join("|")})\\b`, "i");
|
|
440
|
+
if (regex.test(script)) {
|
|
441
|
+
return false;
|
|
442
|
+
}
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
return false;
|
|
446
|
+
};
|
|
447
|
+
var isJson = (text = "") => {
|
|
448
|
+
try {
|
|
449
|
+
const parsed = JSON.parse(text);
|
|
450
|
+
return isObject(parsed) || isArray(parsed);
|
|
451
|
+
} catch {
|
|
452
|
+
return false;
|
|
453
|
+
}
|
|
424
454
|
};
|
|
425
455
|
|
|
426
456
|
// src/hooks/iframe/useIframeRelayBridge.ts
|
|
427
|
-
|
|
457
|
+
var useIframeRelayBridge_default = (allowedOrigins = ["*"]) => {
|
|
428
458
|
const handlers = useRef({});
|
|
429
459
|
useEffect(() => {
|
|
430
460
|
const onMessage = (evt) => {
|
|
@@ -451,8 +481,64 @@ function useIframeRelayBridge(allowedOrigins = ["*"]) {
|
|
|
451
481
|
handlers.current[type] = (handlers.current[type] || []).filter((fn) => fn !== handler);
|
|
452
482
|
}
|
|
453
483
|
return { on, off };
|
|
454
|
-
}
|
|
455
|
-
|
|
484
|
+
};
|
|
485
|
+
var useAutoRefresh_default = (listenValue, shouldRefresh, callback, delay = 1e4) => {
|
|
486
|
+
const timerRef = useRef(null);
|
|
487
|
+
const shouldRefreshRef = useRef(shouldRefresh);
|
|
488
|
+
const callbackRef = useRef(callback);
|
|
489
|
+
const [num, setNum] = useState(0);
|
|
490
|
+
useEffect(() => {
|
|
491
|
+
shouldRefreshRef.current = shouldRefresh;
|
|
492
|
+
callbackRef.current = callback;
|
|
493
|
+
}, [shouldRefresh, callback]);
|
|
494
|
+
useEffect(() => {
|
|
495
|
+
if (timerRef.current) {
|
|
496
|
+
clearTimeout(timerRef.current);
|
|
497
|
+
timerRef.current = null;
|
|
498
|
+
}
|
|
499
|
+
if (shouldRefreshRef.current(listenValue)) {
|
|
500
|
+
timerRef.current = setTimeout(async () => {
|
|
501
|
+
await callbackRef.current();
|
|
502
|
+
setNum(num + 1);
|
|
503
|
+
}, delay);
|
|
504
|
+
}
|
|
505
|
+
return () => {
|
|
506
|
+
if (timerRef.current) {
|
|
507
|
+
clearTimeout(timerRef.current);
|
|
508
|
+
}
|
|
509
|
+
};
|
|
510
|
+
}, [listenValue, delay, num]);
|
|
511
|
+
};
|
|
512
|
+
var useCountDown_default = (callback) => {
|
|
513
|
+
const [count, setCount] = useState(0);
|
|
514
|
+
const [startCount, setStartCount] = useState(0);
|
|
515
|
+
const timer = useRef(null);
|
|
516
|
+
const pause = () => {
|
|
517
|
+
clearInterval(timer.current);
|
|
518
|
+
timer.current = null;
|
|
519
|
+
};
|
|
520
|
+
const start = (initialValue = 60) => {
|
|
521
|
+
pause();
|
|
522
|
+
setCount(initialValue);
|
|
523
|
+
setStartCount((startCount2) => startCount2 + 1);
|
|
524
|
+
timer.current = setInterval(() => {
|
|
525
|
+
setCount((count2) => count2 - 1);
|
|
526
|
+
}, 1e3);
|
|
527
|
+
};
|
|
528
|
+
useEffect(() => {
|
|
529
|
+
return () => {
|
|
530
|
+
pause();
|
|
531
|
+
};
|
|
532
|
+
}, []);
|
|
533
|
+
useEffect(() => {
|
|
534
|
+
if (count === 0 && startCount !== 0) {
|
|
535
|
+
pause();
|
|
536
|
+
callback?.();
|
|
537
|
+
}
|
|
538
|
+
}, [count]);
|
|
539
|
+
return { count, start, pause, startCount };
|
|
540
|
+
};
|
|
541
|
+
var useCreateValtioContext_default = () => {
|
|
456
542
|
const Context = createContext(null);
|
|
457
543
|
const ValtioProvider = ({ store, children }) => /* @__PURE__ */ jsx(Context.Provider, { value: store, children });
|
|
458
544
|
const useValtioStore = () => {
|
|
@@ -462,11 +548,12 @@ function useCreateValtioContext() {
|
|
|
462
548
|
};
|
|
463
549
|
return {
|
|
464
550
|
ValtioProvider,
|
|
465
|
-
useValtioStore
|
|
466
|
-
// Context
|
|
551
|
+
useValtioStore,
|
|
552
|
+
// 导出 Context 以便外部使用
|
|
553
|
+
Context
|
|
467
554
|
};
|
|
468
|
-
}
|
|
469
|
-
|
|
555
|
+
};
|
|
556
|
+
var useDebounce_default = (func, wait = 400) => {
|
|
470
557
|
const { current } = useRef({ func, timeOut: null });
|
|
471
558
|
useEffect(() => {
|
|
472
559
|
current.func = func;
|
|
@@ -501,99 +588,155 @@ function useDebounce(func, wait = 400) {
|
|
|
501
588
|
debounce.flush = flush;
|
|
502
589
|
debounce.cancel = cancel;
|
|
503
590
|
return useCallback(debounce, []);
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
for (const key in obj) {
|
|
512
|
-
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
513
|
-
result[key] = deepCopy(obj[key], isJson);
|
|
591
|
+
};
|
|
592
|
+
var deepCopy = (obj, isJson2 = true) => {
|
|
593
|
+
if (isJson2) {
|
|
594
|
+
try {
|
|
595
|
+
return JSON.parse(JSON.stringify(obj));
|
|
596
|
+
} catch {
|
|
597
|
+
return deepCopy(obj, false);
|
|
514
598
|
}
|
|
515
599
|
}
|
|
516
|
-
|
|
600
|
+
const visited = /* @__PURE__ */ new WeakMap();
|
|
601
|
+
const cloneRecursively = (value) => {
|
|
602
|
+
if (isNullOrUnDef(value)) return value;
|
|
603
|
+
const type = typeof value;
|
|
604
|
+
if (type !== "object") return value;
|
|
605
|
+
if (visited.has(value)) {
|
|
606
|
+
return visited.get(value);
|
|
607
|
+
}
|
|
608
|
+
if (isDate(value)) return new Date(value);
|
|
609
|
+
if (isRegExp(value)) return new RegExp(value);
|
|
610
|
+
if (isMap(value)) {
|
|
611
|
+
const clonedMap = /* @__PURE__ */ new Map();
|
|
612
|
+
visited.set(value, clonedMap);
|
|
613
|
+
for (const [k, v] of value.entries()) {
|
|
614
|
+
clonedMap.set(cloneRecursively(k), cloneRecursively(v));
|
|
615
|
+
}
|
|
616
|
+
return clonedMap;
|
|
617
|
+
}
|
|
618
|
+
if (isSet(value)) {
|
|
619
|
+
const clonedSet = /* @__PURE__ */ new Set();
|
|
620
|
+
visited.set(value, clonedSet);
|
|
621
|
+
for (const v of value.values()) {
|
|
622
|
+
clonedSet.add(cloneRecursively(v));
|
|
623
|
+
}
|
|
624
|
+
return clonedSet;
|
|
625
|
+
}
|
|
626
|
+
if (isArray(value)) {
|
|
627
|
+
const result = [];
|
|
628
|
+
visited.set(value, result);
|
|
629
|
+
for (let i = 0; i < value.length; i++) {
|
|
630
|
+
result[i] = cloneRecursively(value[i]);
|
|
631
|
+
}
|
|
632
|
+
return result;
|
|
633
|
+
} else {
|
|
634
|
+
const result = {};
|
|
635
|
+
visited.set(value, result);
|
|
636
|
+
for (const key in value) {
|
|
637
|
+
if (Object.prototype.hasOwnProperty.call(value, key)) {
|
|
638
|
+
result[key] = cloneRecursively(value[key]);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
return result;
|
|
642
|
+
}
|
|
643
|
+
};
|
|
644
|
+
return cloneRecursively(obj);
|
|
517
645
|
};
|
|
518
646
|
function deepEqual(a, b) {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
647
|
+
const visited = /* @__PURE__ */ new WeakMap();
|
|
648
|
+
const isEqual = (x, y) => {
|
|
649
|
+
if (Object.is(x, y)) return true;
|
|
650
|
+
if (typeof x === "object" && !isNull(x) && typeof y === "object" && !isNull(y)) {
|
|
651
|
+
if (visited.has(x)) {
|
|
652
|
+
if (visited.get(x).has(y)) return true;
|
|
653
|
+
}
|
|
654
|
+
if (!visited.has(x)) visited.set(x, /* @__PURE__ */ new WeakSet());
|
|
655
|
+
visited.get(x).add(y);
|
|
656
|
+
if (!visited.has(y)) visited.set(y, /* @__PURE__ */ new WeakSet());
|
|
657
|
+
visited.get(y).add(x);
|
|
526
658
|
}
|
|
527
|
-
return
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
659
|
+
if (isDate(x) && isDate(y)) return x.getTime() === y.getTime();
|
|
660
|
+
if (isRegExp(x) && isRegExp(y)) return x.toString() === y.toString();
|
|
661
|
+
if (isMap(x) && isMap(y)) {
|
|
662
|
+
if (x.size !== y.size) return false;
|
|
663
|
+
for (const [key, val] of x.entries()) {
|
|
664
|
+
if (!y.has(key)) return false;
|
|
665
|
+
if (!isEqual(val, y.get(key))) return false;
|
|
666
|
+
}
|
|
667
|
+
return true;
|
|
533
668
|
}
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
if (isObject(a) && isObject(b)) {
|
|
542
|
-
const keysA = Object.keys(a);
|
|
543
|
-
const keysB = Object.keys(b);
|
|
544
|
-
if (keysA.length !== keysB.length) return false;
|
|
545
|
-
for (const key of keysA) {
|
|
546
|
-
if (!deepEqual(a[key], b[key])) return false;
|
|
669
|
+
if (isSet(x) && isSet(y)) {
|
|
670
|
+
if (x.size !== y.size) return false;
|
|
671
|
+
for (const val of x.values()) {
|
|
672
|
+
const hasEqual = Array.from(y.values()).some((bVal) => isEqual(val, bVal));
|
|
673
|
+
if (!hasEqual) return false;
|
|
674
|
+
}
|
|
675
|
+
return true;
|
|
547
676
|
}
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
677
|
+
if (isArray(x) && isArray(y)) {
|
|
678
|
+
if (x.length !== y.length) return false;
|
|
679
|
+
return x.every((item, i) => isEqual(item, y[i]));
|
|
680
|
+
}
|
|
681
|
+
if (isFunction(x) && isFunction(y)) return x === y;
|
|
682
|
+
if (isObject(x) && isObject(y)) {
|
|
683
|
+
const keysA = Object.keys(x);
|
|
684
|
+
const keysB = Object.keys(y);
|
|
685
|
+
if (keysA.length !== keysB.length) return false;
|
|
686
|
+
for (const key of keysA) {
|
|
687
|
+
if (!keysB.includes(key)) return false;
|
|
688
|
+
if (!isEqual(x[key], y[key])) return false;
|
|
689
|
+
}
|
|
690
|
+
return true;
|
|
691
|
+
}
|
|
692
|
+
return false;
|
|
693
|
+
};
|
|
694
|
+
return isEqual(a, b);
|
|
551
695
|
}
|
|
552
696
|
var deepMerge = (base, override) => {
|
|
697
|
+
if (!base || !override) {
|
|
698
|
+
return base || override || {};
|
|
699
|
+
}
|
|
553
700
|
const result = { ...base };
|
|
554
701
|
Object.keys(override || {}).forEach((key) => {
|
|
555
702
|
const baseValue = base[key];
|
|
556
703
|
const overrideValue = override[key];
|
|
557
|
-
if (
|
|
704
|
+
if (isObject(baseValue) && isObject(overrideValue)) {
|
|
558
705
|
result[key] = deepMerge(baseValue, overrideValue);
|
|
559
|
-
} else if (overrideValue
|
|
706
|
+
} else if (isDef(overrideValue)) {
|
|
560
707
|
result[key] = overrideValue;
|
|
561
708
|
}
|
|
562
709
|
});
|
|
563
710
|
return result;
|
|
564
711
|
};
|
|
565
|
-
var objToOptions = (obj) => {
|
|
566
|
-
return Object.keys(obj).map((key) => ({
|
|
712
|
+
var objToOptions = (obj, filter) => {
|
|
713
|
+
return Object.keys(obj).filter((key) => !filter || filter(key, obj[key])).map((key) => ({
|
|
567
714
|
label: obj[key],
|
|
568
|
-
value: Number(key)
|
|
715
|
+
value: isNaN(Number(key)) ? key : Number(key)
|
|
569
716
|
}));
|
|
570
717
|
};
|
|
571
718
|
var arrToObj = (arr = [], key) => {
|
|
572
719
|
const obj = {};
|
|
573
|
-
arr
|
|
720
|
+
arr.forEach((item) => {
|
|
574
721
|
obj[item[key]] = item;
|
|
575
722
|
});
|
|
576
723
|
return obj;
|
|
577
724
|
};
|
|
578
|
-
var
|
|
725
|
+
var setInterval2 = (fn, t) => {
|
|
579
726
|
let timer = null;
|
|
580
|
-
let
|
|
581
|
-
const
|
|
727
|
+
let running = true;
|
|
728
|
+
const loop = () => {
|
|
582
729
|
timer = setTimeout(async () => {
|
|
583
|
-
if (
|
|
584
|
-
return;
|
|
585
|
-
}
|
|
730
|
+
if (!running) return;
|
|
586
731
|
await fn();
|
|
587
|
-
if (
|
|
588
|
-
interval();
|
|
589
|
-
}
|
|
732
|
+
if (running) loop();
|
|
590
733
|
}, t);
|
|
591
734
|
};
|
|
592
|
-
|
|
735
|
+
loop();
|
|
593
736
|
return {
|
|
594
|
-
isRun: () =>
|
|
737
|
+
isRun: () => running,
|
|
595
738
|
cancel: () => {
|
|
596
|
-
|
|
739
|
+
running = false;
|
|
597
740
|
if (timer) {
|
|
598
741
|
clearTimeout(timer);
|
|
599
742
|
timer = null;
|
|
@@ -602,14 +745,13 @@ var nsSetInterval = (fn, t) => {
|
|
|
602
745
|
};
|
|
603
746
|
};
|
|
604
747
|
var genNonDuplicateID = () => {
|
|
605
|
-
|
|
606
|
-
idStr += Math.random().toString(36).substr(2);
|
|
607
|
-
return idStr;
|
|
748
|
+
return crypto.randomUUID();
|
|
608
749
|
};
|
|
609
|
-
var copyText = (text) => {
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
750
|
+
var copyText = async (text, prompt = "\u590D\u5236\u6210\u529F") => {
|
|
751
|
+
try {
|
|
752
|
+
await navigator.clipboard.writeText(text);
|
|
753
|
+
if (prompt) message.success(prompt);
|
|
754
|
+
} catch (e) {
|
|
613
755
|
const textArea = document.createElement("textarea");
|
|
614
756
|
textArea.value = text;
|
|
615
757
|
textArea.style.position = "absolute";
|
|
@@ -619,10 +761,9 @@ var copyText = (text) => {
|
|
|
619
761
|
document.body.appendChild(textArea);
|
|
620
762
|
textArea.focus();
|
|
621
763
|
textArea.select();
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
});
|
|
764
|
+
const ok = document.execCommand("copy");
|
|
765
|
+
if (ok && prompt) message.success(prompt);
|
|
766
|
+
textArea.remove();
|
|
626
767
|
}
|
|
627
768
|
};
|
|
628
769
|
function formatNumberWithCommas(number) {
|
|
@@ -646,25 +787,71 @@ var getFileName = (filePath) => {
|
|
|
646
787
|
var getFileSuffixName = (fileName) => {
|
|
647
788
|
return fileName.split(".").pop() || "";
|
|
648
789
|
};
|
|
649
|
-
var
|
|
790
|
+
var convertNewlineToBr = (con) => {
|
|
650
791
|
return con ? con.replace(/\r\n/g, "\n").replace(/\n/g, "<br/>") : "";
|
|
651
792
|
};
|
|
652
|
-
var
|
|
653
|
-
const
|
|
793
|
+
var getAllUrlParams = (url = "") => {
|
|
794
|
+
const result = {};
|
|
795
|
+
if (!url) return result;
|
|
796
|
+
let query = "";
|
|
797
|
+
try {
|
|
798
|
+
const u = new URL(url, "http://dummy.com");
|
|
799
|
+
query = u.search;
|
|
800
|
+
} catch {
|
|
801
|
+
const qIndex = url.indexOf("?");
|
|
802
|
+
if (qIndex === -1) return result;
|
|
803
|
+
query = url.slice(qIndex);
|
|
804
|
+
}
|
|
805
|
+
const params = new URLSearchParams(query);
|
|
806
|
+
const seen = /* @__PURE__ */ new Set();
|
|
807
|
+
for (const [key, value] of params.entries()) {
|
|
808
|
+
if (seen.has(key)) {
|
|
809
|
+
if (isArray(result[key])) {
|
|
810
|
+
result[key].push(value);
|
|
811
|
+
} else {
|
|
812
|
+
result[key] = [result[key], value];
|
|
813
|
+
}
|
|
814
|
+
} else {
|
|
815
|
+
result[key] = value;
|
|
816
|
+
seen.add(key);
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
return result;
|
|
820
|
+
};
|
|
821
|
+
var buildUrlParams = (obj, url, format = "repeat") => {
|
|
822
|
+
if (!isObject(obj)) return url ?? "";
|
|
823
|
+
let base = url || "";
|
|
824
|
+
let hash = "";
|
|
825
|
+
if (base.includes("#")) {
|
|
826
|
+
const i = base.indexOf("#");
|
|
827
|
+
hash = base.slice(i);
|
|
828
|
+
base = base.slice(0, i);
|
|
829
|
+
}
|
|
830
|
+
const originalParams = getAllUrlParams(base);
|
|
831
|
+
const merged = { ...originalParams, ...obj };
|
|
832
|
+
const params = new URLSearchParams();
|
|
833
|
+
for (const [key, value] of Object.entries(merged)) {
|
|
834
|
+
if (isNullOrUnDef(value)) continue;
|
|
654
835
|
if (isArray(value)) {
|
|
655
|
-
|
|
836
|
+
const list = value.filter((v) => !isNullOrUnDef(v)).map(String);
|
|
837
|
+
if (list.length === 0) continue;
|
|
838
|
+
if (format === "repeat") {
|
|
839
|
+
list.forEach((v) => params.append(key, v));
|
|
840
|
+
} else {
|
|
841
|
+
params.set(key, list.join(","));
|
|
842
|
+
}
|
|
843
|
+
} else {
|
|
844
|
+
params.set(key, String(value));
|
|
656
845
|
}
|
|
657
|
-
return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
|
|
658
|
-
}).join("&");
|
|
659
|
-
if (url) {
|
|
660
|
-
const separator = url.includes("?") ? "&" : "?";
|
|
661
|
-
return `${url}${separator}${params}`;
|
|
662
846
|
}
|
|
663
|
-
|
|
847
|
+
const query = params.toString();
|
|
848
|
+
if (!base) return query;
|
|
849
|
+
const cleanBase = base.split("?")[0];
|
|
850
|
+
return `${cleanBase}${query ? `?${query}` : ""}${hash}`;
|
|
664
851
|
};
|
|
665
852
|
var downloadFile = (url, name) => {
|
|
666
853
|
const a = document.createElement("a");
|
|
667
|
-
a.download = name || "\
|
|
854
|
+
a.download = name || "\u6587\u4EF6";
|
|
668
855
|
a.href = url;
|
|
669
856
|
document.body.appendChild(a);
|
|
670
857
|
a.click();
|
|
@@ -672,31 +859,28 @@ var downloadFile = (url, name) => {
|
|
|
672
859
|
window.URL.revokeObjectURL(url);
|
|
673
860
|
};
|
|
674
861
|
var addUrlLastSlash = (url = "") => {
|
|
675
|
-
const u = new URL(url, "
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
pathname += "/";
|
|
679
|
-
}
|
|
680
|
-
u.pathname = pathname;
|
|
681
|
-
return `${isExternal(url) ? u.origin : ""}${u.pathname}${u.search}${u.hash}`;
|
|
862
|
+
const u = new URL(url, "http://dummy.com");
|
|
863
|
+
if (!u.pathname.endsWith("/")) u.pathname += "/";
|
|
864
|
+
return isExternal(url) ? u.toString() : `${u.pathname}${u.search}${u.hash}`;
|
|
682
865
|
};
|
|
683
|
-
var
|
|
684
|
-
if (!preHref) return url;
|
|
685
|
-
let newUrl = "";
|
|
686
|
-
const preHrefUrl = new URL(preHref);
|
|
866
|
+
var setUrlMainSource = (url, preHref, defaultMainSource) => {
|
|
687
867
|
const urlParts = url.split("?");
|
|
688
868
|
const srcParams = new URLSearchParams(urlParts[1] || "");
|
|
689
869
|
if (srcParams.has("mainSource")) {
|
|
690
|
-
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
870
|
+
return url;
|
|
871
|
+
}
|
|
872
|
+
let mainSourceValue = defaultMainSource;
|
|
873
|
+
if (preHref) {
|
|
874
|
+
try {
|
|
875
|
+
const preHrefUrl = new URL(preHref, "http://dummy.com");
|
|
876
|
+
const preMainSource = preHrefUrl.searchParams.get("mainSource");
|
|
877
|
+
if (preMainSource) {
|
|
878
|
+
mainSourceValue = preMainSource;
|
|
879
|
+
}
|
|
880
|
+
} catch (e) {
|
|
697
881
|
}
|
|
698
882
|
}
|
|
699
|
-
return
|
|
883
|
+
return buildUrlParams({ mainSource: mainSourceValue }, url);
|
|
700
884
|
};
|
|
701
885
|
var getWebSocketUrl = (path, customHost) => {
|
|
702
886
|
const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
|
|
@@ -720,9 +904,178 @@ function transform(source, fieldMap) {
|
|
|
720
904
|
function transforms(sources, fieldMap) {
|
|
721
905
|
return sources?.map((source) => transform(source, fieldMap)) || [];
|
|
722
906
|
}
|
|
907
|
+
var convertCurrency = (money = "") => {
|
|
908
|
+
let newMoney = money;
|
|
909
|
+
const cnNums = ["\u96F6", "\u58F9", "\u8D30", "\u53C1", "\u8086", "\u4F0D", "\u9646", "\u67D2", "\u634C", "\u7396"];
|
|
910
|
+
const cnIntRadice = ["", "\u62FE", "\u4F70", "\u4EDF"];
|
|
911
|
+
const cnIntUnits = ["", "\u4E07", "\u4EBF", "\u5146"];
|
|
912
|
+
const cnDecUnits = ["\u89D2", "\u5206", "\u6BEB", "\u5398"];
|
|
913
|
+
const cnInteger = "\u6574";
|
|
914
|
+
const cnIntLast = "\u5706";
|
|
915
|
+
const minus2 = "(\u8D1F\u6570)";
|
|
916
|
+
let isMinus = false;
|
|
917
|
+
const maxNum = 1e15;
|
|
918
|
+
let integerNum;
|
|
919
|
+
let decimalNum;
|
|
920
|
+
let chineseStr = "";
|
|
921
|
+
let parts;
|
|
922
|
+
if (newMoney === "") {
|
|
923
|
+
return "";
|
|
924
|
+
}
|
|
925
|
+
newMoney = isString(newMoney) ? parseFloat(newMoney) : newMoney;
|
|
926
|
+
if (newMoney < 0) {
|
|
927
|
+
isMinus = true;
|
|
928
|
+
newMoney = Math.abs(newMoney);
|
|
929
|
+
}
|
|
930
|
+
if (newMoney >= maxNum) {
|
|
931
|
+
return "";
|
|
932
|
+
}
|
|
933
|
+
if (newMoney === 0) {
|
|
934
|
+
chineseStr = cnNums[0] + cnIntLast + cnInteger;
|
|
935
|
+
return chineseStr;
|
|
936
|
+
}
|
|
937
|
+
newMoney = newMoney.toString();
|
|
938
|
+
if (newMoney.indexOf(".") === -1) {
|
|
939
|
+
integerNum = newMoney;
|
|
940
|
+
decimalNum = "";
|
|
941
|
+
} else {
|
|
942
|
+
parts = newMoney.split(".");
|
|
943
|
+
integerNum = parts[0];
|
|
944
|
+
decimalNum = parts[1].substr(0, 4);
|
|
945
|
+
}
|
|
946
|
+
if (parseInt(integerNum, 10) > 0) {
|
|
947
|
+
let zeroCount = 0;
|
|
948
|
+
const IntLen = integerNum.length;
|
|
949
|
+
for (let i = 0; i < IntLen; i++) {
|
|
950
|
+
const n = integerNum.substr(i, 1);
|
|
951
|
+
const p = IntLen - i - 1;
|
|
952
|
+
const q = p / 4;
|
|
953
|
+
const m = p % 4;
|
|
954
|
+
if (n === "0") {
|
|
955
|
+
zeroCount++;
|
|
956
|
+
} else {
|
|
957
|
+
if (zeroCount > 0) {
|
|
958
|
+
chineseStr += cnNums[0];
|
|
959
|
+
}
|
|
960
|
+
zeroCount = 0;
|
|
961
|
+
chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
|
|
962
|
+
}
|
|
963
|
+
if (m === 0 && zeroCount < 4) {
|
|
964
|
+
chineseStr += cnIntUnits[q];
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
chineseStr += cnIntLast;
|
|
968
|
+
}
|
|
969
|
+
if (decimalNum !== "") {
|
|
970
|
+
const decLen = decimalNum.length;
|
|
971
|
+
for (let i = 0; i < decLen; i++) {
|
|
972
|
+
const n = decimalNum.substr(i, 1);
|
|
973
|
+
if (n !== "0") {
|
|
974
|
+
chineseStr += cnNums[Number(n)] + cnDecUnits[i];
|
|
975
|
+
} else {
|
|
976
|
+
chineseStr += cnNums[0];
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
if (chineseStr === "") {
|
|
981
|
+
chineseStr += cnNums[0] + cnIntLast + cnInteger;
|
|
982
|
+
} else if (decimalNum === "") {
|
|
983
|
+
chineseStr += cnInteger;
|
|
984
|
+
}
|
|
985
|
+
if (isMinus) {
|
|
986
|
+
chineseStr = minus2 + chineseStr;
|
|
987
|
+
}
|
|
988
|
+
return chineseStr;
|
|
989
|
+
};
|
|
990
|
+
var getRowSpanCount = (data, key, target) => {
|
|
991
|
+
if (!Array.isArray(data)) return 1;
|
|
992
|
+
const newData = data.map((_) => _[key]);
|
|
993
|
+
let preValue = newData[0];
|
|
994
|
+
const res = [[preValue]];
|
|
995
|
+
let index = 0;
|
|
996
|
+
for (let i = 1; i < newData.length; i++) {
|
|
997
|
+
if (newData[i] === preValue) {
|
|
998
|
+
res[index].push(newData[i]);
|
|
999
|
+
} else {
|
|
1000
|
+
index += 1;
|
|
1001
|
+
res[index] = [];
|
|
1002
|
+
res[index].push(newData[i]);
|
|
1003
|
+
preValue = newData[i];
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
const arr = [];
|
|
1007
|
+
res.forEach((_) => {
|
|
1008
|
+
const len = _.length;
|
|
1009
|
+
for (let i = 0; i < len; i++) {
|
|
1010
|
+
arr.push(i === 0 ? len : 0);
|
|
1011
|
+
}
|
|
1012
|
+
});
|
|
1013
|
+
return arr[target];
|
|
1014
|
+
};
|
|
1015
|
+
var importThirdPartyFile = (document2, path) => {
|
|
1016
|
+
const type = path.endsWith(".js") ? "script" : "link";
|
|
1017
|
+
const element = type === "script" ? document2.createElement("script") : document2.createElement("link");
|
|
1018
|
+
if (type === "script") {
|
|
1019
|
+
const scriptElement = element;
|
|
1020
|
+
scriptElement.async = true;
|
|
1021
|
+
scriptElement.src = path;
|
|
1022
|
+
} else {
|
|
1023
|
+
const linkElement = element;
|
|
1024
|
+
linkElement.rel = "stylesheet";
|
|
1025
|
+
linkElement.type = "text/css";
|
|
1026
|
+
linkElement.href = path;
|
|
1027
|
+
}
|
|
1028
|
+
if (document2.head) {
|
|
1029
|
+
document2.head.appendChild(element);
|
|
1030
|
+
}
|
|
1031
|
+
};
|
|
1032
|
+
var processItemList = (items) => {
|
|
1033
|
+
return items.filter((item) => item.hidden !== true).map((item, index) => ({ key: index, ...item }));
|
|
1034
|
+
};
|
|
1035
|
+
var executeScript = (script, params) => {
|
|
1036
|
+
if (isScriptSafe(script)) {
|
|
1037
|
+
const func = new Function(
|
|
1038
|
+
...Object.keys(params),
|
|
1039
|
+
// 参数列表
|
|
1040
|
+
script
|
|
1041
|
+
// 脚本字符串
|
|
1042
|
+
);
|
|
1043
|
+
try {
|
|
1044
|
+
return func(...Object.values(params));
|
|
1045
|
+
} catch (error) {
|
|
1046
|
+
console.error("Error executing script:", error);
|
|
1047
|
+
}
|
|
1048
|
+
} else {
|
|
1049
|
+
console.error("unsafe script");
|
|
1050
|
+
}
|
|
1051
|
+
};
|
|
1052
|
+
function aesEncrypt(data, key) {
|
|
1053
|
+
if (!key) throw new Error("AES Encrypt: key is required");
|
|
1054
|
+
if (isNullOrUnDef(data)) return "";
|
|
1055
|
+
try {
|
|
1056
|
+
const text = JSON.stringify(data);
|
|
1057
|
+
return AES.encrypt(text, key.trim()).toString();
|
|
1058
|
+
} catch (err) {
|
|
1059
|
+
console.error("AES Encrypt error:", err);
|
|
1060
|
+
throw new Error("AES Encrypt failed");
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
function aesDecrypt(data, key) {
|
|
1064
|
+
if (!key) throw new Error("AES Decrypt: key is required");
|
|
1065
|
+
if (!data) return null;
|
|
1066
|
+
try {
|
|
1067
|
+
const bytes = AES.decrypt(data, key.trim());
|
|
1068
|
+
const decoded = bytes.toString(encUtf8);
|
|
1069
|
+
if (!decoded) return null;
|
|
1070
|
+
return JSON.parse(decoded);
|
|
1071
|
+
} catch (err) {
|
|
1072
|
+
console.error("AES Decrypt error:", err);
|
|
1073
|
+
return null;
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
723
1076
|
|
|
724
1077
|
// src/hooks/useDeepEffect.ts
|
|
725
|
-
|
|
1078
|
+
var useDeepEffect_default = (effect, deps) => {
|
|
726
1079
|
const prevDepsRef = useRef();
|
|
727
1080
|
const depsChanged = !prevDepsRef.current || deps.length !== prevDepsRef.current.length || deps.some((dep, i) => !deepEqual(dep, prevDepsRef.current[i]));
|
|
728
1081
|
useEffect(() => {
|
|
@@ -731,8 +1084,8 @@ function useDeepEffect(effect, deps) {
|
|
|
731
1084
|
return effect();
|
|
732
1085
|
}
|
|
733
1086
|
}, [depsChanged]);
|
|
734
|
-
}
|
|
735
|
-
|
|
1087
|
+
};
|
|
1088
|
+
var useRefState_default = (init) => {
|
|
736
1089
|
const [state, setState] = useState(init);
|
|
737
1090
|
const stateRef = useRef(init);
|
|
738
1091
|
const setProxy = (newVal) => {
|
|
@@ -741,8 +1094,8 @@ function useRefState(init) {
|
|
|
741
1094
|
};
|
|
742
1095
|
const getState = () => stateRef.current;
|
|
743
1096
|
return [state, setProxy, getState];
|
|
744
|
-
}
|
|
745
|
-
var
|
|
1097
|
+
};
|
|
1098
|
+
var useSyncInput_default = (storeValue, setStoreValue) => {
|
|
746
1099
|
const [inputValue, setInputValue] = useState(storeValue);
|
|
747
1100
|
useEffect(() => {
|
|
748
1101
|
if (storeValue !== inputValue) {
|
|
@@ -758,7 +1111,7 @@ var useSyncInput = (storeValue, setStoreValue) => {
|
|
|
758
1111
|
setInputValue: handleValueChange
|
|
759
1112
|
};
|
|
760
1113
|
};
|
|
761
|
-
|
|
1114
|
+
var useThrottle_default = (func, wait) => {
|
|
762
1115
|
const { current } = useRef({ func, timeOut: null });
|
|
763
1116
|
useEffect(() => {
|
|
764
1117
|
current.func = func;
|
|
@@ -792,18 +1145,20 @@ function useThrottle(func, wait) {
|
|
|
792
1145
|
throttle.flush = flush;
|
|
793
1146
|
throttle.cancel = cancel;
|
|
794
1147
|
return useCallback(throttle, []);
|
|
795
|
-
}
|
|
1148
|
+
};
|
|
796
1149
|
dayjs.extend(relativeTime);
|
|
797
|
-
var
|
|
798
|
-
var
|
|
799
|
-
var
|
|
800
|
-
var
|
|
1150
|
+
var DEFAULT_DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
|
|
1151
|
+
var DEFAULT_DATE_FORMAT = "YYYY-MM-DD";
|
|
1152
|
+
var DEFAULT_YEAR_MONTH_FORMAT = "YYYY\u5E74MM\u6708";
|
|
1153
|
+
var DEFAULT_YEAR_MONTH_DAY_FORMAT = "YYYY\u5E74MM\u6708DD\u65E5";
|
|
1154
|
+
var DEFAULT_UNIT = "date";
|
|
1155
|
+
var getStartOfTimestamp = (date, unit = DEFAULT_UNIT) => {
|
|
801
1156
|
return dayjs(date).startOf(unit).valueOf();
|
|
802
1157
|
};
|
|
803
|
-
var getEndOfTimestamp = (date, unit =
|
|
1158
|
+
var getEndOfTimestamp = (date, unit = DEFAULT_UNIT) => {
|
|
804
1159
|
return dayjs(date).endOf(unit).valueOf();
|
|
805
1160
|
};
|
|
806
|
-
var formatDate = (date, fmt =
|
|
1161
|
+
var formatDate = (date, fmt = DEFAULT_DATE_TIME_FORMAT) => {
|
|
807
1162
|
if (date) {
|
|
808
1163
|
return dayjs(date).format(fmt);
|
|
809
1164
|
}
|
|
@@ -815,33 +1170,6 @@ var getTimestamp = (date) => {
|
|
|
815
1170
|
var isExpire = (date) => {
|
|
816
1171
|
return dayjs(date).isBefore(getStartOfTimestamp());
|
|
817
1172
|
};
|
|
818
|
-
var USER_KEY = "NS-USER";
|
|
819
|
-
function setCurrentUser(userInfo) {
|
|
820
|
-
const cipherText = AES.encrypt(JSON.stringify(userInfo), "((#II))").toString();
|
|
821
|
-
sessionStorage.setItem(USER_KEY, cipherText);
|
|
822
|
-
}
|
|
823
|
-
function getCurrentUser() {
|
|
824
|
-
const userInfoJson = sessionStorage.getItem(USER_KEY);
|
|
825
|
-
if (userInfoJson) {
|
|
826
|
-
const bytes = AES.decrypt(userInfoJson, "((#II))");
|
|
827
|
-
const originalText = bytes.toString(encUtf8);
|
|
828
|
-
return JSON.parse(originalText);
|
|
829
|
-
}
|
|
830
|
-
return null;
|
|
831
|
-
}
|
|
832
|
-
function clearCurrentUser() {
|
|
833
|
-
sessionStorage.removeItem(USER_KEY);
|
|
834
|
-
}
|
|
835
|
-
var DEVICEID_KEY = "NS-DEVICE-ID";
|
|
836
|
-
function getDeviceId() {
|
|
837
|
-
let deviceId = localStorage.getItem(DEVICEID_KEY);
|
|
838
|
-
if (deviceId) {
|
|
839
|
-
return deviceId;
|
|
840
|
-
}
|
|
841
|
-
deviceId = genNonDuplicateID();
|
|
842
|
-
localStorage.setItem(DEVICEID_KEY, deviceId);
|
|
843
|
-
return deviceId;
|
|
844
|
-
}
|
|
845
1173
|
var OperatorToMethodName = {
|
|
846
1174
|
"+": "plus",
|
|
847
1175
|
"-": "minus",
|
|
@@ -894,97 +1222,191 @@ var isInteger = (num) => {
|
|
|
894
1222
|
var isNegative = (num) => {
|
|
895
1223
|
return new Decimal(num).isNegative();
|
|
896
1224
|
};
|
|
897
|
-
var
|
|
898
|
-
const
|
|
1225
|
+
var createCachedMessage = () => {
|
|
1226
|
+
const messageCache = {};
|
|
899
1227
|
return ({ title = "\u63D0\u793A", content, type = "warning", duration = 3, onClose, isCache = true, isOnly = false }) => {
|
|
900
1228
|
if (!content) return;
|
|
901
|
-
const
|
|
902
|
-
const
|
|
903
|
-
delete
|
|
1229
|
+
const cacheKey = isOnly ? "unique-message-key" : content;
|
|
1230
|
+
const handleClose = () => {
|
|
1231
|
+
delete messageCache[cacheKey];
|
|
904
1232
|
onClose?.();
|
|
905
1233
|
};
|
|
906
|
-
if (isCache &&
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
} else {
|
|
920
|
-
message[type]({
|
|
921
|
-
content,
|
|
922
|
-
duration,
|
|
923
|
-
onClose: onClose2
|
|
924
|
-
});
|
|
925
|
-
}
|
|
1234
|
+
if (isCache && messageCache[cacheKey]) return;
|
|
1235
|
+
if (isCache) {
|
|
1236
|
+
messageCache[cacheKey] = getTimestamp();
|
|
1237
|
+
}
|
|
1238
|
+
if (duration) {
|
|
1239
|
+
if (content.length > 30) {
|
|
1240
|
+
notification[type]({
|
|
1241
|
+
message: title,
|
|
1242
|
+
description: content,
|
|
1243
|
+
placement: "top",
|
|
1244
|
+
duration,
|
|
1245
|
+
onClose: handleClose
|
|
1246
|
+
});
|
|
926
1247
|
} else {
|
|
927
|
-
|
|
928
|
-
title,
|
|
1248
|
+
message[type]({
|
|
929
1249
|
content,
|
|
930
|
-
|
|
931
|
-
|
|
1250
|
+
duration,
|
|
1251
|
+
onClose: handleClose
|
|
932
1252
|
});
|
|
933
1253
|
}
|
|
1254
|
+
} else {
|
|
1255
|
+
Modal[type]({
|
|
1256
|
+
title,
|
|
1257
|
+
content,
|
|
1258
|
+
closable: true,
|
|
1259
|
+
centered: true,
|
|
1260
|
+
footer: null,
|
|
1261
|
+
afterClose: handleClose
|
|
1262
|
+
});
|
|
934
1263
|
}
|
|
935
1264
|
};
|
|
936
1265
|
};
|
|
937
|
-
var
|
|
1266
|
+
var cachedMessage = createCachedMessage();
|
|
938
1267
|
|
|
939
|
-
// src/utils/
|
|
940
|
-
var
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
1268
|
+
// src/utils/pattern.ts
|
|
1269
|
+
var RegMobile = {
|
|
1270
|
+
pattern: /^1[3-9]\d{9}$/,
|
|
1271
|
+
message: "\u624B\u673A\u53F7\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01"
|
|
1272
|
+
};
|
|
1273
|
+
var RegFixedTelePhone = {
|
|
1274
|
+
pattern: /^0\d{2,3}-\d{7,8}$/,
|
|
1275
|
+
message: "\u7535\u8BDD\u53F7\u7801\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01"
|
|
1276
|
+
};
|
|
1277
|
+
var RegTelePhone = {
|
|
1278
|
+
pattern: /^[\\+\-\\(\\)\\(\\)\d]{1,20}$/,
|
|
1279
|
+
message: "\u7535\u8BDD\u53F7\u7801\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01"
|
|
1280
|
+
};
|
|
1281
|
+
var RegTaxNo = {
|
|
1282
|
+
pattern: /^[A-Z0-9]{15}$|^[A-Z0-9]{18}$|^[A-Z0-9]{20}$/,
|
|
1283
|
+
message: "\u7A0E\u53F7\u683C\u5F0F\u6709\u8BEF\uFF01"
|
|
1284
|
+
};
|
|
1285
|
+
var RegBankCardNo = {
|
|
1286
|
+
pattern: /^[0-9]*$/,
|
|
1287
|
+
message: "\u94F6\u884C\u5361\u53F7\u683C\u5F0F\u6709\u8BEF\uFF01"
|
|
1288
|
+
};
|
|
1289
|
+
var RegIdentityCardNo = {
|
|
1290
|
+
pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
|
|
1291
|
+
message: "\u8EAB\u4EFD\u8BC1\u53F7\u683C\u5F0F\u6709\u8BEF\uFF01"
|
|
1292
|
+
};
|
|
1293
|
+
var RegNumNo = {
|
|
1294
|
+
pattern: /^[0-9]*$/,
|
|
1295
|
+
message: "\u683C\u5F0F\u6709\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01"
|
|
1296
|
+
};
|
|
1297
|
+
var RegSmsCode = {
|
|
1298
|
+
pattern: /^[0-9]{6}$/,
|
|
1299
|
+
message: "\u9A8C\u8BC1\u7801\u4E3A6\u4F4D\u6570\u5B57"
|
|
1300
|
+
};
|
|
1301
|
+
var RegEmail = {
|
|
1302
|
+
pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
|
|
1303
|
+
message: "\u90AE\u7BB1\u683C\u5F0F\u6709\u8BEF\uFF01"
|
|
1304
|
+
};
|
|
1305
|
+
var RegDetailAddress = {
|
|
1306
|
+
pattern: /.*(街|路|村|乡|镇|道|巷|号).*/,
|
|
1307
|
+
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"
|
|
1308
|
+
};
|
|
1309
|
+
var PhoneOrMobileValidator = (errMessage = "\u8054\u7CFB\u7535\u8BDD\u683C\u5F0F\u4E0D\u6B63\u786E") => ({
|
|
1310
|
+
validator: (_, value) => !value || RegFixedTelePhone.pattern.test(value) || RegMobile.pattern.test(value) ? Promise.resolve() : Promise.reject(new Error(errMessage))
|
|
1311
|
+
});
|
|
1312
|
+
var ThanNumValidator = ({
|
|
1313
|
+
min,
|
|
1314
|
+
max,
|
|
1315
|
+
equalMin = false,
|
|
1316
|
+
equalMax = false,
|
|
1317
|
+
errMessage,
|
|
1318
|
+
maxErrMessage,
|
|
1319
|
+
minErrMessage
|
|
1320
|
+
}) => ({
|
|
1321
|
+
validator: (_, value) => {
|
|
1322
|
+
if (!value) {
|
|
1323
|
+
return Promise.resolve();
|
|
1324
|
+
}
|
|
1325
|
+
if (isNumberNoNaN(parseFloat(min))) {
|
|
1326
|
+
if (!(Number(value) > Number(min) || equalMin && Number(value) === Number(min))) {
|
|
1327
|
+
return Promise.reject(new Error(minErrMessage || errMessage || `\u4E0D\u80FD\u5C0F\u4E8E${equalMin ? "" : "\u7B49\u4E8E"}${min}`));
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
if (isNumberNoNaN(parseFloat(max))) {
|
|
1331
|
+
if (!(Number(value) < Number(max) || equalMax && Number(value) === Number(max))) {
|
|
1332
|
+
return Promise.reject(new Error(maxErrMessage || errMessage || `\u4E0D\u80FD\u5927\u4E8E${equalMax ? "" : "\u7B49\u4E8E"}${max}`));
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
return Promise.resolve();
|
|
957
1336
|
}
|
|
958
|
-
}
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
1337
|
+
});
|
|
1338
|
+
var ThanNumLengthValidator = ({
|
|
1339
|
+
length,
|
|
1340
|
+
decimalsLength,
|
|
1341
|
+
integerLength,
|
|
1342
|
+
lengthErrMessage,
|
|
1343
|
+
decimalsLengthErrMessage,
|
|
1344
|
+
integerLengthErrMessage
|
|
1345
|
+
}) => ({
|
|
1346
|
+
validator: (_, value) => {
|
|
1347
|
+
if (!value) {
|
|
1348
|
+
return Promise.resolve();
|
|
1349
|
+
}
|
|
1350
|
+
if (isNumber(length)) {
|
|
1351
|
+
if (precision(value) > length) {
|
|
1352
|
+
return Promise.reject(new Error(lengthErrMessage || `\u603B\u4F4D\u6570\u4E0D\u80FD\u8D85\u8FC7${length}\u4F4D`));
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
if (isNumber(integerLength)) {
|
|
1356
|
+
if (precision(value) - decimalPlaces(value) > integerLength) {
|
|
1357
|
+
return Promise.reject(new Error(integerLengthErrMessage || `\u6574\u6570\u4F4D\u4E0D\u80FD\u8D85\u8FC7${integerLength}\u4F4D`));
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
if (isNumber(decimalsLength)) {
|
|
1361
|
+
if (decimalPlaces(value) > decimalsLength) {
|
|
1362
|
+
return Promise.reject(new Error(decimalsLengthErrMessage || `\u5C0F\u6570\u4F4D\u4E0D\u80FD\u8D85\u8FC7${decimalsLength}\u4F4D`));
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
1365
|
+
return Promise.resolve();
|
|
1366
|
+
}
|
|
1367
|
+
});
|
|
1368
|
+
var MultiEmailValidator = (max) => ({
|
|
1369
|
+
validator: (_, value) => {
|
|
1370
|
+
if (value) {
|
|
1371
|
+
const emailArr = value.split(",").map((v) => v.trim()).filter((v) => v);
|
|
1372
|
+
if (emailArr.length > max) return Promise.reject(new Error(`\u6700\u591A\u8F93\u5165${max}\u4E2A\u90AE\u7BB1`));
|
|
1373
|
+
const noEmailArr = emailArr.filter((email) => !RegEmail.pattern.test(email));
|
|
1374
|
+
if (noEmailArr.length) return Promise.reject(new Error(RegEmail.message));
|
|
1375
|
+
}
|
|
1376
|
+
return Promise.resolve();
|
|
1377
|
+
}
|
|
1378
|
+
});
|
|
1379
|
+
var HttpStatus = {
|
|
1380
|
+
/** 服务器错误 */
|
|
1381
|
+
ERROR: 500,
|
|
1382
|
+
/** 缺少参数或参数错误 */
|
|
1383
|
+
MISSING_PARAMETER: 400,
|
|
1384
|
+
/** 未授权,需要用户验证 */
|
|
1385
|
+
UNAUTHORIZED: 401,
|
|
1386
|
+
/** 禁止访问,服务器理解请求但拒绝执行 */
|
|
1387
|
+
FORBIDDEN: 403,
|
|
1388
|
+
/** 请求的资源未找到 */
|
|
1389
|
+
NOT_FOUND: 404
|
|
1390
|
+
};
|
|
1391
|
+
var BusinessCode = {
|
|
1392
|
+
/** 请求成功 */
|
|
1393
|
+
OK: 200,
|
|
1394
|
+
/** 权限拒绝,没有足够的权限执行操作 */
|
|
1395
|
+
PERMISSION_DENIED: 13001
|
|
1396
|
+
};
|
|
1397
|
+
var showError = (showError2) => showError2 !== false;
|
|
1398
|
+
function createRequest(config) {
|
|
980
1399
|
const instance = axios.create({
|
|
981
|
-
baseURL,
|
|
982
|
-
|
|
1400
|
+
baseURL: "/api",
|
|
1401
|
+
// 默认基础URL
|
|
1402
|
+
timeout: 6e4,
|
|
1403
|
+
// 请求超时时间设为60秒
|
|
1404
|
+
...config
|
|
1405
|
+
// 合并传入的配置项
|
|
983
1406
|
});
|
|
984
1407
|
instance.interceptors.request.use(
|
|
985
|
-
function(
|
|
986
|
-
|
|
987
|
-
return config;
|
|
1408
|
+
function(config2) {
|
|
1409
|
+
return config2;
|
|
988
1410
|
},
|
|
989
1411
|
function(error) {
|
|
990
1412
|
return Promise.reject(error);
|
|
@@ -993,49 +1415,80 @@ function createRequest(baseURL = "/api") {
|
|
|
993
1415
|
instance.interceptors.response.use(
|
|
994
1416
|
function(response) {
|
|
995
1417
|
if (isBlob(response.data)) return response;
|
|
996
|
-
if (response.data?.code !== OK) {
|
|
997
|
-
const isPermission = response.data?.code === PERMISSION_DENIED;
|
|
998
|
-
if (response.config?.showError
|
|
999
|
-
|
|
1418
|
+
if (response.data?.code !== BusinessCode.OK) {
|
|
1419
|
+
const isPermission = response.data?.code === BusinessCode.PERMISSION_DENIED;
|
|
1420
|
+
if (showError(response.config?.showError)) {
|
|
1421
|
+
cachedMessage({
|
|
1000
1422
|
title: isPermission ? "" : void 0,
|
|
1001
1423
|
content: response.data.message,
|
|
1002
1424
|
duration: isPermission ? 0 : 3
|
|
1003
1425
|
});
|
|
1004
1426
|
}
|
|
1005
|
-
return Promise.reject(response
|
|
1427
|
+
return Promise.reject(response);
|
|
1006
1428
|
}
|
|
1007
1429
|
return response;
|
|
1008
1430
|
},
|
|
1009
1431
|
function(err) {
|
|
1010
|
-
const showError = err?.config?.showError !== false;
|
|
1011
1432
|
if (!err.response) {
|
|
1012
|
-
if (showError)
|
|
1433
|
+
if (showError(err?.config?.showError)) cachedMessage({ content: "\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC", type: "error" });
|
|
1013
1434
|
} else {
|
|
1014
1435
|
switch (err.response?.status) {
|
|
1015
|
-
case UNAUTHORIZED:
|
|
1016
|
-
if (showError)
|
|
1017
|
-
redirectUrl();
|
|
1436
|
+
case HttpStatus.UNAUTHORIZED:
|
|
1437
|
+
if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message, type: "error" });
|
|
1018
1438
|
break;
|
|
1019
1439
|
default:
|
|
1020
|
-
if (showError)
|
|
1440
|
+
if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message || "\u8BF7\u6C42\u9519\u8BEF\uFF01", type: "error" });
|
|
1021
1441
|
}
|
|
1022
1442
|
}
|
|
1023
1443
|
return Promise.reject(err);
|
|
1024
1444
|
}
|
|
1025
1445
|
);
|
|
1026
1446
|
return {
|
|
1447
|
+
/**
|
|
1448
|
+
* 返回原始 axios 实例
|
|
1449
|
+
* 可以用于添加拦截器等
|
|
1450
|
+
*/
|
|
1451
|
+
instance,
|
|
1452
|
+
/**
|
|
1453
|
+
* 发送 GET 请求
|
|
1454
|
+
* @param url - 请求地址
|
|
1455
|
+
* @param params - 查询参数
|
|
1456
|
+
* @param options - 额外的请求配置
|
|
1457
|
+
* @returns Promise<any> 响应数据
|
|
1458
|
+
*/
|
|
1027
1459
|
get: async (url, params, options) => {
|
|
1028
1460
|
const res = await instance({ method: "get", url, params, ...options });
|
|
1029
1461
|
return res.data;
|
|
1030
1462
|
},
|
|
1463
|
+
/**
|
|
1464
|
+
* 发送 POST 请求
|
|
1465
|
+
* @param url - 请求地址
|
|
1466
|
+
* @param data - 请求体数据
|
|
1467
|
+
* @param options - 额外的请求配置
|
|
1468
|
+
* @returns Promise<any> 响应数据
|
|
1469
|
+
*/
|
|
1031
1470
|
post: async (url, data, options) => {
|
|
1032
1471
|
const res = await instance({ method: "post", url, data, ...options });
|
|
1033
1472
|
return res.data;
|
|
1034
1473
|
},
|
|
1474
|
+
/**
|
|
1475
|
+
* 发送 PUT 请求
|
|
1476
|
+
* @param url - 请求地址
|
|
1477
|
+
* @param data - 请求体数据
|
|
1478
|
+
* @param options - 额外的请求配置
|
|
1479
|
+
* @returns Promise<any> 响应数据
|
|
1480
|
+
*/
|
|
1035
1481
|
put: async (url, data, options) => {
|
|
1036
1482
|
const res = await instance({ method: "put", url, data, ...options });
|
|
1037
1483
|
return res.data;
|
|
1038
1484
|
},
|
|
1485
|
+
/**
|
|
1486
|
+
* 发送 DELETE 请求
|
|
1487
|
+
* @param url - 请求地址
|
|
1488
|
+
* @param data - 请求体数据
|
|
1489
|
+
* @param options - 额外的请求配置
|
|
1490
|
+
* @returns Promise<any> 响应数据
|
|
1491
|
+
*/
|
|
1039
1492
|
delete: async (url, data, options) => {
|
|
1040
1493
|
const res = await instance({ method: "delete", url, data, ...options });
|
|
1041
1494
|
return res.data;
|
|
@@ -1043,8 +1496,66 @@ function createRequest(baseURL = "/api") {
|
|
|
1043
1496
|
};
|
|
1044
1497
|
}
|
|
1045
1498
|
|
|
1499
|
+
// src/utils/storage.ts
|
|
1500
|
+
function getDeviceId(DEVICEID_KEY) {
|
|
1501
|
+
let deviceId = localStorage.getItem(DEVICEID_KEY);
|
|
1502
|
+
if (deviceId) {
|
|
1503
|
+
return deviceId;
|
|
1504
|
+
}
|
|
1505
|
+
deviceId = genNonDuplicateID();
|
|
1506
|
+
localStorage.setItem(DEVICEID_KEY, deviceId);
|
|
1507
|
+
return deviceId;
|
|
1508
|
+
}
|
|
1509
|
+
function createSecureManager({ key, storage = localStorage, aesKey }) {
|
|
1510
|
+
const set = (data) => {
|
|
1511
|
+
if (isNullOrUnDef(data)) return;
|
|
1512
|
+
storage.setItem(key, aesKey ? aesEncrypt(data, aesKey) : isString(data) ? data : JSON.stringify(data));
|
|
1513
|
+
};
|
|
1514
|
+
const get = () => {
|
|
1515
|
+
const cipher = storage.getItem(key);
|
|
1516
|
+
if (!cipher) {
|
|
1517
|
+
return null;
|
|
1518
|
+
}
|
|
1519
|
+
if (aesKey) {
|
|
1520
|
+
return aesDecrypt(cipher, aesKey);
|
|
1521
|
+
}
|
|
1522
|
+
try {
|
|
1523
|
+
return JSON.parse(cipher);
|
|
1524
|
+
} catch (e) {
|
|
1525
|
+
console.log("Failed to parse stored data:", e);
|
|
1526
|
+
return cipher;
|
|
1527
|
+
}
|
|
1528
|
+
};
|
|
1529
|
+
const clear = () => storage.removeItem(key);
|
|
1530
|
+
return {
|
|
1531
|
+
set,
|
|
1532
|
+
get,
|
|
1533
|
+
clear
|
|
1534
|
+
};
|
|
1535
|
+
}
|
|
1536
|
+
function createTokenManager({ key, storage = localStorage }) {
|
|
1537
|
+
const tokenManager = createSecureManager({ key, storage });
|
|
1538
|
+
const getFromUrl = () => {
|
|
1539
|
+
const searchParams = new URLSearchParams(location.search);
|
|
1540
|
+
return searchParams.get(key);
|
|
1541
|
+
};
|
|
1542
|
+
const get = () => {
|
|
1543
|
+
const urlToken = getFromUrl();
|
|
1544
|
+
if (urlToken) {
|
|
1545
|
+
tokenManager.set(urlToken);
|
|
1546
|
+
return urlToken;
|
|
1547
|
+
}
|
|
1548
|
+
return tokenManager.get();
|
|
1549
|
+
};
|
|
1550
|
+
return {
|
|
1551
|
+
set: tokenManager.set,
|
|
1552
|
+
get,
|
|
1553
|
+
clear: tokenManager.clear
|
|
1554
|
+
};
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1046
1557
|
// src/hooks/webSocket/useWebSocket.ts
|
|
1047
|
-
var
|
|
1558
|
+
var useWebSocket_default = ({
|
|
1048
1559
|
url,
|
|
1049
1560
|
onMessage,
|
|
1050
1561
|
onClose,
|
|
@@ -1052,11 +1563,8 @@ var useWebSocket = ({
|
|
|
1052
1563
|
heartbeatMessage = "ping",
|
|
1053
1564
|
clientHeartbeat = true,
|
|
1054
1565
|
reconnectInterval = 5e3,
|
|
1055
|
-
// 默认重连间隔为 5 秒
|
|
1056
1566
|
maxReconnectAttempts,
|
|
1057
|
-
// 不设置默认值为无限重连
|
|
1058
1567
|
isReconnect = true
|
|
1059
|
-
// 默认开启重连机制
|
|
1060
1568
|
}) => {
|
|
1061
1569
|
const socketRef = useRef(null);
|
|
1062
1570
|
const heartbeatIntervalRef = useRef(null);
|
|
@@ -1080,6 +1588,7 @@ var useWebSocket = ({
|
|
|
1080
1588
|
const stopHeartbeat = () => {
|
|
1081
1589
|
if (heartbeatIntervalRef.current) {
|
|
1082
1590
|
clearInterval(heartbeatIntervalRef.current);
|
|
1591
|
+
heartbeatIntervalRef.current = null;
|
|
1083
1592
|
}
|
|
1084
1593
|
};
|
|
1085
1594
|
const stopReconnectTimer = () => {
|
|
@@ -1167,19 +1676,22 @@ var useWebSocket = ({
|
|
|
1167
1676
|
stopReconnectTimer();
|
|
1168
1677
|
};
|
|
1169
1678
|
}, [url]);
|
|
1170
|
-
const sendMessage = (
|
|
1679
|
+
const sendMessage = (message3) => {
|
|
1171
1680
|
if (socketRef.current?.readyState === WebSocket.OPEN) {
|
|
1172
|
-
socketRef.current.send(
|
|
1681
|
+
socketRef.current.send(message3);
|
|
1173
1682
|
stopHeartbeat();
|
|
1174
1683
|
startHeartbeat(socketRef.current);
|
|
1684
|
+
} else {
|
|
1685
|
+
console.warn("WebSocket \u672A\u8FDE\u63A5\uFF0C\u65E0\u6CD5\u53D1\u9001\u6D88\u606F:", message3);
|
|
1175
1686
|
}
|
|
1176
1687
|
};
|
|
1177
1688
|
return {
|
|
1689
|
+
/** 发送消息方法 */
|
|
1178
1690
|
sendMessage,
|
|
1691
|
+
/** Socket 连接状态 */
|
|
1179
1692
|
socketReadyState
|
|
1180
1693
|
};
|
|
1181
1694
|
};
|
|
1182
|
-
var useWebSocket_default = useWebSocket;
|
|
1183
1695
|
var ProtectedView = ({
|
|
1184
1696
|
passwordStatus,
|
|
1185
1697
|
verifyPassword,
|
|
@@ -1205,8 +1717,8 @@ var ProtectedView = ({
|
|
|
1205
1717
|
var PdfPreview_default = ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumbnails = true, onSetPassword, onSetPageNo }) => {
|
|
1206
1718
|
const embedRef = useRef(null);
|
|
1207
1719
|
const [sizes, setSizes] = useState([0]);
|
|
1208
|
-
const [, setDocLoaded, getDocLoaded] =
|
|
1209
|
-
const [currentPage, setCurrentPage, getCurrentPage] =
|
|
1720
|
+
const [, setDocLoaded, getDocLoaded] = useRefState_default(false);
|
|
1721
|
+
const [currentPage, setCurrentPage, getCurrentPage] = useRefState_default(void 0);
|
|
1210
1722
|
const [temporaryPassword, setTemporaryPassword] = useState("");
|
|
1211
1723
|
const jumpToPageNo = useRef();
|
|
1212
1724
|
const onVerifyPasswordEnd = (password2) => {
|
|
@@ -1252,25 +1764,25 @@ var PdfPreview_default = ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumb
|
|
|
1252
1764
|
}, 0);
|
|
1253
1765
|
}, [pageNo]);
|
|
1254
1766
|
const renderError = (error) => {
|
|
1255
|
-
let
|
|
1767
|
+
let message3 = "";
|
|
1256
1768
|
switch (error.name) {
|
|
1257
1769
|
case "InvalidPDFException":
|
|
1258
|
-
|
|
1770
|
+
message3 = "\u6587\u4EF6\u65E0\u6548\u6216\u5DF2\u635F\u574F";
|
|
1259
1771
|
break;
|
|
1260
1772
|
case "MissingPDFException":
|
|
1261
|
-
|
|
1773
|
+
message3 = "\u6587\u4EF6\u4E0D\u5B58\u5728";
|
|
1262
1774
|
break;
|
|
1263
1775
|
case "UnexpectedResponseException":
|
|
1264
|
-
|
|
1776
|
+
message3 = "\u610F\u5916\u7684\u670D\u52A1\u5668\u54CD\u5E94";
|
|
1265
1777
|
break;
|
|
1266
1778
|
// case 'CMapReaderFactory not initialized':
|
|
1267
1779
|
// message = '字体映射文件加载失败,请刷新页面重试'
|
|
1268
1780
|
// break
|
|
1269
1781
|
default:
|
|
1270
|
-
|
|
1782
|
+
message3 = "\u65E0\u6CD5\u52A0\u8F7D\u6587\u6863";
|
|
1271
1783
|
break;
|
|
1272
1784
|
}
|
|
1273
|
-
return /* @__PURE__ */ jsx(Flex, { className: "height-full", justify: "center", align: "center", children: /* @__PURE__ */ jsx(Alert, { message:
|
|
1785
|
+
return /* @__PURE__ */ jsx(Flex, { className: "height-full", justify: "center", align: "center", children: /* @__PURE__ */ jsx(Alert, { message: message3, type: "error", showIcon: true }) });
|
|
1274
1786
|
};
|
|
1275
1787
|
const onPageChange = (e) => {
|
|
1276
1788
|
let newCurrentPage = e.currentPage;
|
|
@@ -1413,10 +1925,10 @@ var FilePreviewDrawer_default = ({
|
|
|
1413
1925
|
var styles_module_default2 = {
|
|
1414
1926
|
iframe: "styles_module_iframe"
|
|
1415
1927
|
};
|
|
1416
|
-
var Iframe_default = forwardRef(({ id, src, className, onLoad }, ref) => {
|
|
1928
|
+
var Iframe_default = forwardRef(({ defaultMainSource, id, src, className, onLoad }, ref) => {
|
|
1417
1929
|
const [loading, setLoading] = useState(false);
|
|
1418
1930
|
const finalSrc = useMemo(() => {
|
|
1419
|
-
return buildUrlParams({ v: Date.now() }, addUrlLastSlash(
|
|
1931
|
+
return buildUrlParams({ v: Date.now() }, addUrlLastSlash(setUrlMainSource(src, location.href, defaultMainSource)));
|
|
1420
1932
|
}, [src]);
|
|
1421
1933
|
const onHandleLoad = () => {
|
|
1422
1934
|
setLoading(false);
|
|
@@ -1425,7 +1937,17 @@ var Iframe_default = forwardRef(({ id, src, className, onLoad }, ref) => {
|
|
|
1425
1937
|
useEffect(() => {
|
|
1426
1938
|
setLoading(true);
|
|
1427
1939
|
}, [src]);
|
|
1428
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Spin, { spinning: loading, wrapperClassName: "full-spin", tip: "\u52A0\u8F7D\u4E2D...", children: /* @__PURE__ */ jsx(
|
|
1940
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Spin, { spinning: loading, wrapperClassName: "full-spin", tip: "\u52A0\u8F7D\u4E2D...", children: /* @__PURE__ */ jsx(
|
|
1941
|
+
"iframe",
|
|
1942
|
+
{
|
|
1943
|
+
id,
|
|
1944
|
+
ref,
|
|
1945
|
+
src: finalSrc,
|
|
1946
|
+
className: classNames2(styles_module_default2.iframe, className),
|
|
1947
|
+
onLoad: onHandleLoad,
|
|
1948
|
+
allow: "clipboard-write"
|
|
1949
|
+
}
|
|
1950
|
+
) }) });
|
|
1429
1951
|
});
|
|
1430
1952
|
var Link = TiptapLink.extend({
|
|
1431
1953
|
inclusive: false,
|
|
@@ -5078,7 +5600,7 @@ var MarkdownEditor_default = ({
|
|
|
5078
5600
|
editor?.commands.setContent(value);
|
|
5079
5601
|
lastContentRef.current = value;
|
|
5080
5602
|
}, [value, editor]);
|
|
5081
|
-
const onPageChange =
|
|
5603
|
+
const onPageChange = useDebounce_default((pageIndex) => {
|
|
5082
5604
|
onScrollPage?.(parseInt(pageIndex ?? "0"));
|
|
5083
5605
|
}, 300);
|
|
5084
5606
|
useEffect(() => {
|
|
@@ -5201,7 +5723,7 @@ function renderDefault(DefaultComponent, ref, props) {
|
|
|
5201
5723
|
if (!DefaultComponent) return null;
|
|
5202
5724
|
return isRenderFn(DefaultComponent) ? /* @__PURE__ */ jsx(DefaultComponent, { ref, ...props }) : DefaultComponent;
|
|
5203
5725
|
}
|
|
5204
|
-
var
|
|
5726
|
+
var RenderWrapper_default = forwardRef(function RenderWrapper({ control = true, ctx, DefaultComponent }, ref) {
|
|
5205
5727
|
if (control === false || isNull(control)) return null;
|
|
5206
5728
|
if (control === true || control === void 0) {
|
|
5207
5729
|
return renderDefault(DefaultComponent, ref);
|
|
@@ -5231,9 +5753,9 @@ function propsMerge(control, props) {
|
|
|
5231
5753
|
return null;
|
|
5232
5754
|
}
|
|
5233
5755
|
var UserAvatar_default = ({ size, avatarSrc, userName }) => {
|
|
5234
|
-
return avatarSrc ? /* @__PURE__ */ jsx(Avatar, { size, src: avatarSrc }) : /* @__PURE__ */ jsx(Avatar, { size, className: "cursor-pointer", style: { backgroundColor:
|
|
5756
|
+
return avatarSrc ? /* @__PURE__ */ jsx(Avatar, { size, src: avatarSrc }) : /* @__PURE__ */ jsx(Avatar, { size, className: "cursor-pointer", style: { backgroundColor: "var(--ant-color-primary)" }, children: userName?.slice(0, 1)?.toLocaleUpperCase() });
|
|
5235
5757
|
};
|
|
5236
5758
|
|
|
5237
|
-
export { AudioPlayer_default as AudioPlayer,
|
|
5759
|
+
export { AudioPlayer_default as AudioPlayer, BusinessCode, DEFAULT_DATE_FORMAT, DEFAULT_DATE_TIME_FORMAT, DEFAULT_YEAR_MONTH_DAY_FORMAT, DEFAULT_YEAR_MONTH_FORMAT, FileIcon_default as FileIcon, FilePreview_default as FilePreview, FilePreviewDrawer_default as FilePreviewDrawer, HttpStatus, Iframe_default as Iframe, LazyComponent_default as LazyComponent, MarkdownEditor_default as MarkdownEditor, MarkdownPreview_default as MarkdownPreview, MultiEmailValidator, PdfPreview_default as PdfPreview, PhoneOrMobileValidator, RegBankCardNo, RegDetailAddress, RegEmail, RegFixedTelePhone, RegIdentityCardNo, RegMobile, RegNumNo, RegSmsCode, RegTaxNo, RegTelePhone, RenderMarkdown_default as RenderMarkdown, RenderWrapper_default as RenderWrapper, ThanNumLengthValidator, ThanNumValidator, UserAvatar_default as UserAvatar, VideoPlayer_default as VideoPlayer, absVal, addUrlLastSlash, aesDecrypt, aesEncrypt, arrToObj, buildUrlParams, cachedMessage, calculate, compareNum, convertCurrency, convertNewlineToBr, copyText, createRequest, createSecureManager, createTokenManager, decimalPlaces, deepCopy, deepEqual, deepMerge, dividedBy, downloadFile, emit, emitToChild, executeScript, formatDate, formatNumberWithCommas, genNonDuplicateID, generateRandomNumbers, getAllUrlParams, getDeviceId, getEndOfTimestamp, getFileName, getFileSuffixName, getRowSpanCount, getStartOfTimestamp, getTimestamp, getWebSocketUrl, importThirdPartyFile, is, isArray, isBlob, isBoolean, isDate, isDef, isElement, isEmpty, isEmptyObj, isExpire, isExternal, isFunction, isInteger, isJson, isLocalhost, isMap, isNegative, isNull, isNullOrUnDef, isNumber, isNumberNoNaN, isObject, isPromise, isReferenceType, isRegExp, isScriptSafe, isSet, isString, isUnDef, isWindow, minus, objToOptions, plus, precision, processItemList, propsMerge, setInterval2 as setInterval, setUrlMainSource, shouldRender, times, toFixed, transform, transforms, useAutoRefresh_default as useAutoRefresh, useCountDown_default as useCountDown, useCreateValtioContext_default as useCreateValtioContext, useDebounce_default as useDebounce, useDeepEffect_default as useDeepEffect, useIframeRelayBridge_default as useIframeRelayBridge, useRefState_default as useRefState, useSyncInput_default as useSyncInput, useThrottle_default as useThrottle, useWebSocket_default as useWebSocket };
|
|
5238
5760
|
//# sourceMappingURL=index.esm.js.map
|
|
5239
5761
|
//# sourceMappingURL=index.esm.js.map
|