@zero-library/common 2.1.11 → 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 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);
@@ -378,7 +377,7 @@ function isNumber(val) {
378
377
  return is(val, "Number");
379
378
  }
380
379
  function isNumberNoNaN(val) {
381
- return is(val, "Number") && !isNaN(val);
380
+ return isNumber(val) && !isNaN(val);
382
381
  }
383
382
  function isString(val) {
384
383
  return is(val, "String");
@@ -399,7 +398,7 @@ function isArray(val) {
399
398
  return Array.isArray(val);
400
399
  }
401
400
  function isEmpty(val) {
402
- if (isArray(val) || isString(val)) {
401
+ if (isString(val) || isArray(val)) {
403
402
  return val.length === 0;
404
403
  }
405
404
  if (isNullOrUnDef(val)) {
@@ -411,28 +410,89 @@ function isEmpty(val) {
411
410
  return isEmptyObj(val);
412
411
  }
413
412
  function isWindow(val) {
414
- return typeof window !== "undefined" && is(val, "Window");
413
+ return is(val, "Window");
415
414
  }
416
415
  function isElement(val) {
417
- return isObject(val) && !!val.tagName;
416
+ return isObject(val) && !!val?.tagName;
418
417
  }
419
418
  function isMap(val) {
420
419
  return is(val, "Map");
421
420
  }
422
- var isServer = typeof window === "undefined";
423
- var isClient = !isServer;
421
+ function isSet(val) {
422
+ return is(val, "Set");
423
+ }
424
424
  var isExternal = (path) => {
425
- return /^(https?:|mailto:|tel:)/.test(path);
425
+ if (!isString(path)) return false;
426
+ return /^(https?:|mailto:|tel:|ftp:)/.test(path);
426
427
  };
427
428
  var isBlob = (val) => {
428
429
  return is(val, "Blob");
429
430
  };
430
431
  var isLocalhost = (host) => {
431
- return /^(localhost:)/.test(host || location.host);
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
+ }
432
492
  };
433
493
 
434
494
  // src/hooks/iframe/useIframeRelayBridge.ts
435
- function useIframeRelayBridge(allowedOrigins = ["*"]) {
495
+ var useIframeRelayBridge_default = (allowedOrigins = ["*"]) => {
436
496
  const handlers = React16.useRef({});
437
497
  React16.useEffect(() => {
438
498
  const onMessage = (evt) => {
@@ -459,8 +519,64 @@ function useIframeRelayBridge(allowedOrigins = ["*"]) {
459
519
  handlers.current[type] = (handlers.current[type] || []).filter((fn) => fn !== handler);
460
520
  }
461
521
  return { on, off };
462
- }
463
- function useCreateValtioContext() {
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 = () => {
464
580
  const Context = React16.createContext(null);
465
581
  const ValtioProvider = ({ store, children }) => /* @__PURE__ */ jsxRuntime.jsx(Context.Provider, { value: store, children });
466
582
  const useValtioStore = () => {
@@ -474,8 +590,8 @@ function useCreateValtioContext() {
474
590
  // 导出 Context 以便外部使用
475
591
  Context
476
592
  };
477
- }
478
- function useDebounce(func, wait = 400) {
593
+ };
594
+ var useDebounce_default = (func, wait = 400) => {
479
595
  const { current } = React16.useRef({ func, timeOut: null });
480
596
  React16.useEffect(() => {
481
597
  current.func = func;
@@ -510,97 +626,155 @@ function useDebounce(func, wait = 400) {
510
626
  debounce.flush = flush;
511
627
  debounce.cancel = cancel;
512
628
  return React16.useCallback(debounce, []);
513
- }
514
- var deepCopy = (obj, isJson = true) => {
515
- if (!isArray(obj) && !isObject(obj)) return obj;
516
- if (isJson) return JSON.parse(JSON.stringify(obj));
517
- const result = isArray(obj) ? [] : {};
518
- for (const key in obj) {
519
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
520
- 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);
521
636
  }
522
637
  }
523
- return result;
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);
524
683
  };
525
684
  function deepEqual(a, b) {
526
- if (Object.is(a, b)) return true;
527
- if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
528
- if (a instanceof RegExp && b instanceof RegExp) return a.toString() === b.toString();
529
- if (a instanceof Map && b instanceof Map) {
530
- if (a.size !== b.size) return false;
531
- for (const [key, val] of a.entries()) {
532
- if (!b.has(key) || !deepEqual(val, b.get(key))) return false;
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);
533
696
  }
534
- return true;
535
- }
536
- if (a instanceof Set && b instanceof Set) {
537
- if (a.size !== b.size) return false;
538
- for (const val of a.values()) {
539
- if (!b.has(val)) return false;
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;
540
706
  }
541
- return true;
542
- }
543
- if (Array.isArray(a) && Array.isArray(b)) {
544
- if (a.length !== b.length) return false;
545
- return a.every((item, i) => deepEqual(item, b[i]));
546
- }
547
- if (typeof a === "function" && typeof b === "function") return a.toString() === b.toString();
548
- if (isObject(a) && isObject(b)) {
549
- const keysA = Object.keys(a);
550
- const keysB = Object.keys(b);
551
- if (keysA.length !== keysB.length) return false;
552
- for (const key of keysA) {
553
- 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;
554
714
  }
555
- return true;
556
- }
557
- return false;
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);
558
733
  }
559
734
  var deepMerge = (base, override) => {
735
+ if (!base || !override) {
736
+ return base || override || {};
737
+ }
560
738
  const result = { ...base };
561
739
  Object.keys(override || {}).forEach((key) => {
562
740
  const baseValue = base[key];
563
741
  const overrideValue = override[key];
564
- if (typeof baseValue === "object" && baseValue !== null && !isArray(baseValue) && typeof overrideValue === "object" && overrideValue !== null && !isArray(overrideValue)) {
742
+ if (isObject(baseValue) && isObject(overrideValue)) {
565
743
  result[key] = deepMerge(baseValue, overrideValue);
566
- } else if (overrideValue !== void 0) {
744
+ } else if (isDef(overrideValue)) {
567
745
  result[key] = overrideValue;
568
746
  }
569
747
  });
570
748
  return result;
571
749
  };
572
- var objToOptions = (obj) => {
573
- 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) => ({
574
752
  label: obj[key],
575
- value: Number(key)
753
+ value: isNaN(Number(key)) ? key : Number(key)
576
754
  }));
577
755
  };
578
756
  var arrToObj = (arr = [], key) => {
579
757
  const obj = {};
580
- arr?.forEach((item) => {
758
+ arr.forEach((item) => {
581
759
  obj[item[key]] = item;
582
760
  });
583
761
  return obj;
584
762
  };
585
- var nsSetInterval = (fn, t) => {
763
+ var setInterval2 = (fn, t) => {
586
764
  let timer = null;
587
- let isCancelled = false;
588
- const interval = () => {
765
+ let running = true;
766
+ const loop = () => {
589
767
  timer = setTimeout(async () => {
590
- if (isCancelled) {
591
- return;
592
- }
768
+ if (!running) return;
593
769
  await fn();
594
- if (!isCancelled) {
595
- interval();
596
- }
770
+ if (running) loop();
597
771
  }, t);
598
772
  };
599
- interval();
773
+ loop();
600
774
  return {
601
- isRun: () => !!timer,
775
+ isRun: () => running,
602
776
  cancel: () => {
603
- isCancelled = true;
777
+ running = false;
604
778
  if (timer) {
605
779
  clearTimeout(timer);
606
780
  timer = null;
@@ -609,18 +783,13 @@ var nsSetInterval = (fn, t) => {
609
783
  };
610
784
  };
611
785
  var genNonDuplicateID = () => {
612
- let idStr = Date.now().toString(36);
613
- idStr += Math.random().toString(36).substr(2);
614
- return idStr;
786
+ return crypto.randomUUID();
615
787
  };
616
- var copyText = (text, prompt = "\u590D\u5236\u6210\u529F") => {
617
- if (navigator.clipboard && window.isSecureContext) {
618
- navigator.clipboard.writeText(text).then(() => {
619
- if (prompt) {
620
- antd.message.success(prompt);
621
- }
622
- });
623
- } else {
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) {
624
793
  const textArea = document.createElement("textarea");
625
794
  textArea.value = text;
626
795
  textArea.style.position = "absolute";
@@ -630,10 +799,8 @@ var copyText = (text, prompt = "\u590D\u5236\u6210\u529F") => {
630
799
  document.body.appendChild(textArea);
631
800
  textArea.focus();
632
801
  textArea.select();
633
- const bol = document.execCommand("copy");
634
- if (bol && prompt) {
635
- antd.message.success(prompt);
636
- }
802
+ const ok = document.execCommand("copy");
803
+ if (ok && prompt) antd.message.success(prompt);
637
804
  textArea.remove();
638
805
  }
639
806
  };
@@ -658,25 +825,71 @@ var getFileName = (filePath) => {
658
825
  var getFileSuffixName = (fileName) => {
659
826
  return fileName.split(".").pop() || "";
660
827
  };
661
- var textAreaView = (con) => {
828
+ var convertNewlineToBr = (con) => {
662
829
  return con ? con.replace(/\r\n/g, "\n").replace(/\n/g, "<br/>") : "";
663
830
  };
664
- var buildUrlParams = (obj, url) => {
665
- const params = Object.entries(obj).filter(([, value]) => !isNullOrUnDef(value)).map(([key, value]) => {
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;
666
873
  if (isArray(value)) {
667
- return value.filter((v) => !isNullOrUnDef(v)).map((v) => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`).join("&");
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));
668
883
  }
669
- return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
670
- }).join("&");
671
- if (url) {
672
- const separator = url.includes("?") ? "&" : "?";
673
- return `${url}${separator}${params}`;
674
884
  }
675
- return params;
885
+ const query = params.toString();
886
+ if (!base) return query;
887
+ const cleanBase = base.split("?")[0];
888
+ return `${cleanBase}${query ? `?${query}` : ""}${hash}`;
676
889
  };
677
890
  var downloadFile = (url, name) => {
678
891
  const a = document.createElement("a");
679
- a.download = name || "\u56FE\u7247\u4E0B\u8F7D";
892
+ a.download = name || "\u6587\u4EF6";
680
893
  a.href = url;
681
894
  document.body.appendChild(a);
682
895
  a.click();
@@ -684,31 +897,28 @@ var downloadFile = (url, name) => {
684
897
  window.URL.revokeObjectURL(url);
685
898
  };
686
899
  var addUrlLastSlash = (url = "") => {
687
- const u = new URL(url, "https://logosdata.cn");
688
- let pathname = u.pathname;
689
- if (!pathname.endsWith("/")) {
690
- pathname += "/";
691
- }
692
- u.pathname = pathname;
693
- 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}`;
694
903
  };
695
- var getUrlMainSource = (url, preHref) => {
696
- if (!preHref) return url;
697
- let newUrl = "";
698
- const preHrefUrl = new URL(preHref);
904
+ var setUrlMainSource = (url, preHref, defaultMainSource) => {
699
905
  const urlParts = url.split("?");
700
906
  const srcParams = new URLSearchParams(urlParts[1] || "");
701
907
  if (srcParams.has("mainSource")) {
702
- newUrl = url;
703
- } else {
704
- const mainSource = preHrefUrl.searchParams.get("mainSource");
705
- if (mainSource) {
706
- newUrl = buildUrlParams({ mainSource }, url);
707
- } else {
708
- newUrl = url;
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) {
709
919
  }
710
920
  }
711
- return newUrl;
921
+ return buildUrlParams({ mainSource: mainSourceValue }, url);
712
922
  };
713
923
  var getWebSocketUrl = (path, customHost) => {
714
924
  const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
@@ -732,9 +942,178 @@ function transform(source, fieldMap) {
732
942
  function transforms(sources, fieldMap) {
733
943
  return sources?.map((source) => transform(source, fieldMap)) || [];
734
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
+ }
735
1114
 
736
1115
  // src/hooks/useDeepEffect.ts
737
- function useDeepEffect(effect, deps) {
1116
+ var useDeepEffect_default = (effect, deps) => {
738
1117
  const prevDepsRef = React16.useRef();
739
1118
  const depsChanged = !prevDepsRef.current || deps.length !== prevDepsRef.current.length || deps.some((dep, i) => !deepEqual(dep, prevDepsRef.current[i]));
740
1119
  React16.useEffect(() => {
@@ -743,8 +1122,8 @@ function useDeepEffect(effect, deps) {
743
1122
  return effect();
744
1123
  }
745
1124
  }, [depsChanged]);
746
- }
747
- function useRefState(init) {
1125
+ };
1126
+ var useRefState_default = (init) => {
748
1127
  const [state, setState] = React16.useState(init);
749
1128
  const stateRef = React16.useRef(init);
750
1129
  const setProxy = (newVal) => {
@@ -753,8 +1132,8 @@ function useRefState(init) {
753
1132
  };
754
1133
  const getState = () => stateRef.current;
755
1134
  return [state, setProxy, getState];
756
- }
757
- var useSyncInput = (storeValue, setStoreValue) => {
1135
+ };
1136
+ var useSyncInput_default = (storeValue, setStoreValue) => {
758
1137
  const [inputValue, setInputValue] = React16.useState(storeValue);
759
1138
  React16.useEffect(() => {
760
1139
  if (storeValue !== inputValue) {
@@ -770,7 +1149,7 @@ var useSyncInput = (storeValue, setStoreValue) => {
770
1149
  setInputValue: handleValueChange
771
1150
  };
772
1151
  };
773
- function useThrottle(func, wait) {
1152
+ var useThrottle_default = (func, wait) => {
774
1153
  const { current } = React16.useRef({ func, timeOut: null });
775
1154
  React16.useEffect(() => {
776
1155
  current.func = func;
@@ -804,18 +1183,20 @@ function useThrottle(func, wait) {
804
1183
  throttle.flush = flush;
805
1184
  throttle.cancel = cancel;
806
1185
  return React16.useCallback(throttle, []);
807
- }
1186
+ };
808
1187
  dayjs__default.default.extend(relativeTime__default.default);
809
- var DateFormatType = "YYYY-MM-DD HH:mm:ss";
810
- var DateFormatType2 = "YYYY-MM-DD";
811
- var UNIT = "date";
812
- var getStartOfTimestamp = (date, unit = UNIT) => {
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) => {
813
1194
  return dayjs__default.default(date).startOf(unit).valueOf();
814
1195
  };
815
- var getEndOfTimestamp = (date, unit = UNIT) => {
1196
+ var getEndOfTimestamp = (date, unit = DEFAULT_UNIT) => {
816
1197
  return dayjs__default.default(date).endOf(unit).valueOf();
817
1198
  };
818
- var formatDate = (date, fmt = DateFormatType) => {
1199
+ var formatDate = (date, fmt = DEFAULT_DATE_TIME_FORMAT) => {
819
1200
  if (date) {
820
1201
  return dayjs__default.default(date).format(fmt);
821
1202
  }
@@ -827,33 +1208,6 @@ var getTimestamp = (date) => {
827
1208
  var isExpire = (date) => {
828
1209
  return dayjs__default.default(date).isBefore(getStartOfTimestamp());
829
1210
  };
830
- var USER_KEY = "NS-USER";
831
- function setCurrentUser(userInfo) {
832
- const cipherText = AES__default.default.encrypt(JSON.stringify(userInfo), "((#II))").toString();
833
- sessionStorage.setItem(USER_KEY, cipherText);
834
- }
835
- function getCurrentUser() {
836
- const userInfoJson = sessionStorage.getItem(USER_KEY);
837
- if (userInfoJson) {
838
- const bytes = AES__default.default.decrypt(userInfoJson, "((#II))");
839
- const originalText = bytes.toString(encUtf8__default.default);
840
- return JSON.parse(originalText);
841
- }
842
- return null;
843
- }
844
- function clearCurrentUser() {
845
- sessionStorage.removeItem(USER_KEY);
846
- }
847
- var DEVICEID_KEY = "NS-DEVICE-ID";
848
- function getDeviceId() {
849
- let deviceId = localStorage.getItem(DEVICEID_KEY);
850
- if (deviceId) {
851
- return deviceId;
852
- }
853
- deviceId = genNonDuplicateID();
854
- localStorage.setItem(DEVICEID_KEY, deviceId);
855
- return deviceId;
856
- }
857
1211
  var OperatorToMethodName = {
858
1212
  "+": "plus",
859
1213
  "-": "minus",
@@ -906,115 +1260,191 @@ var isInteger = (num) => {
906
1260
  var isNegative = (num) => {
907
1261
  return new Decimal__default.default(num).isNegative();
908
1262
  };
909
-
910
- // src/utils/theme.ts
911
- var getPrimaryColor = () => {
912
- const searchParams = new URLSearchParams(location.search);
913
- const mainSource = searchParams.get("mainSource") || "cube-uc";
914
- if (mainSource === "cube-uc") {
915
- return "#34AFBE";
916
- } else if (mainSource === "uc") {
917
- return "#FA541C";
918
- }
919
- };
920
- var LgPrimaryColor = getPrimaryColor();
921
- var themeConfig = {
922
- token: { colorPrimary: LgPrimaryColor, colorLink: LgPrimaryColor },
923
- cssVar: true
924
- };
925
-
926
- // src/utils/message.ts
927
- var cacheMessage = () => {
928
- const contents = {};
1263
+ var createCachedMessage = () => {
1264
+ const messageCache = {};
929
1265
  return ({ title = "\u63D0\u793A", content, type = "warning", duration = 3, onClose, isCache = true, isOnly = false }) => {
930
1266
  if (!content) return;
931
- const key = isOnly ? "cache-key" : content;
932
- const onClose2 = () => {
933
- delete contents[key];
1267
+ const cacheKey = isOnly ? "unique-message-key" : content;
1268
+ const handleClose = () => {
1269
+ delete messageCache[cacheKey];
934
1270
  onClose?.();
935
1271
  };
936
- if (isCache && contents[key]) ; else {
937
- if (isCache) {
938
- contents[key] = getTimestamp();
939
- }
940
- if (duration) {
941
- if (content.length > 30) {
942
- antd.notification[type]({
943
- message: title,
944
- description: content,
945
- placement: "top",
946
- duration,
947
- onClose: onClose2
948
- });
949
- } else {
950
- lib.message[type]({
951
- content,
952
- duration,
953
- onClose: onClose2
954
- });
955
- }
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
+ });
956
1285
  } else {
957
- antd.Modal[type]({
958
- title,
1286
+ antd.message[type]({
959
1287
  content,
960
- okButtonProps: { style: { background: LgPrimaryColor, outline: "none" } },
961
- afterClose: onClose2
1288
+ duration,
1289
+ onClose: handleClose
962
1290
  });
963
1291
  }
1292
+ } else {
1293
+ antd.Modal[type]({
1294
+ title,
1295
+ content,
1296
+ closable: true,
1297
+ centered: true,
1298
+ footer: null,
1299
+ afterClose: handleClose
1300
+ });
964
1301
  }
965
1302
  };
966
1303
  };
967
- var showMessage = cacheMessage();
1304
+ var cachedMessage = createCachedMessage();
968
1305
 
969
- // src/utils/session.ts
970
- var TOKEN_KEY = "NS-TOKEN";
971
- function setToken(accessToken) {
972
- localStorage.setItem(TOKEN_KEY, accessToken);
973
- }
974
- function getUrlToken() {
975
- const searchParams = new URLSearchParams(location.search);
976
- const token = searchParams.get(TOKEN_KEY);
977
- return token || "";
978
- }
979
- function getToken() {
980
- const token = getUrlToken();
981
- if (!token) {
982
- const token2 = localStorage.getItem(TOKEN_KEY);
983
- return token2 || "";
984
- } else {
985
- setToken(token);
986
- return token;
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();
987
1374
  }
988
- }
989
- function clearToken() {
990
- localStorage.removeItem(TOKEN_KEY);
991
- }
992
- var SIGNPATH = "SIGNPATH";
993
- function getSignPath() {
994
- const path = localStorage.getItem(SIGNPATH);
995
- return `${path || "/sign-in"}`;
996
- }
997
-
998
- // src/utils/request.ts
999
- var OK = 200;
1000
- var ERROR = 500;
1001
- var MISSING_PARAMETER = 400;
1002
- var UNAUTHORIZED = 401;
1003
- var FORBIDDEN = 403;
1004
- var NOT_FOUND = 404;
1005
- var PERMISSION_DENIED = 13001;
1006
- function createRequest(baseURL = "/api") {
1007
- const redirectUrl = () => {
1008
- emit("jumpLink", { url: `/uc${getSignPath()}` });
1009
- };
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) {
1010
1437
  const instance = axios__default.default.create({
1011
- baseURL,
1012
- timeout: 6e4
1438
+ baseURL: "/api",
1439
+ // 默认基础URL
1440
+ timeout: 6e4,
1441
+ // 请求超时时间设为60秒
1442
+ ...config
1443
+ // 合并传入的配置项
1013
1444
  });
1014
1445
  instance.interceptors.request.use(
1015
- function(config) {
1016
- config.headers[TOKEN_KEY] = getToken();
1017
- return config;
1446
+ function(config2) {
1447
+ return config2;
1018
1448
  },
1019
1449
  function(error) {
1020
1450
  return Promise.reject(error);
@@ -1023,31 +1453,29 @@ function createRequest(baseURL = "/api") {
1023
1453
  instance.interceptors.response.use(
1024
1454
  function(response) {
1025
1455
  if (isBlob(response.data)) return response;
1026
- if (response.data?.code !== OK) {
1027
- const isPermission = response.data?.code === PERMISSION_DENIED;
1028
- if (response.config?.showError !== false) {
1029
- showMessage({
1456
+ if (response.data?.code !== BusinessCode.OK) {
1457
+ const isPermission = response.data?.code === BusinessCode.PERMISSION_DENIED;
1458
+ if (showError(response.config?.showError)) {
1459
+ cachedMessage({
1030
1460
  title: isPermission ? "" : void 0,
1031
1461
  content: response.data.message,
1032
1462
  duration: isPermission ? 0 : 3
1033
1463
  });
1034
1464
  }
1035
- return Promise.reject(response.data);
1465
+ return Promise.reject(response);
1036
1466
  }
1037
1467
  return response;
1038
1468
  },
1039
1469
  function(err) {
1040
- const showError = err?.config?.showError !== false;
1041
1470
  if (!err.response) {
1042
- if (showError) showMessage({ content: "\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC", type: "error" });
1471
+ if (showError(err?.config?.showError)) cachedMessage({ content: "\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC", type: "error" });
1043
1472
  } else {
1044
1473
  switch (err.response?.status) {
1045
- case UNAUTHORIZED:
1046
- if (showError) showMessage({ content: err.response?.data.message, type: "error" });
1047
- redirectUrl();
1474
+ case HttpStatus.UNAUTHORIZED:
1475
+ if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message, type: "error" });
1048
1476
  break;
1049
1477
  default:
1050
- if (showError) showMessage({ content: err.response?.data.message || "\u8BF7\u6C42\u9519\u8BEF\uFF01", type: "error" });
1478
+ if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message || "\u8BF7\u6C42\u9519\u8BEF\uFF01", type: "error" });
1051
1479
  }
1052
1480
  }
1053
1481
  return Promise.reject(err);
@@ -1055,44 +1483,49 @@ function createRequest(baseURL = "/api") {
1055
1483
  );
1056
1484
  return {
1057
1485
  /**
1058
- * GET 请求方法
1486
+ * 返回原始 axios 实例
1487
+ * 可以用于添加拦截器等
1488
+ */
1489
+ instance,
1490
+ /**
1491
+ * 发送 GET 请求
1059
1492
  * @param url - 请求地址
1060
1493
  * @param params - 查询参数
1061
- * @param options - Axios 配置选项
1062
- * @returns 响应数据
1494
+ * @param options - 额外的请求配置
1495
+ * @returns Promise<any> 响应数据
1063
1496
  */
1064
1497
  get: async (url, params, options) => {
1065
1498
  const res = await instance({ method: "get", url, params, ...options });
1066
1499
  return res.data;
1067
1500
  },
1068
1501
  /**
1069
- * POST 请求方法
1502
+ * 发送 POST 请求
1070
1503
  * @param url - 请求地址
1071
- * @param data - 请求数据
1072
- * @param options - Axios 配置选项
1073
- * @returns 响应数据
1504
+ * @param data - 请求体数据
1505
+ * @param options - 额外的请求配置
1506
+ * @returns Promise<any> 响应数据
1074
1507
  */
1075
1508
  post: async (url, data, options) => {
1076
1509
  const res = await instance({ method: "post", url, data, ...options });
1077
1510
  return res.data;
1078
1511
  },
1079
1512
  /**
1080
- * PUT 请求方法
1513
+ * 发送 PUT 请求
1081
1514
  * @param url - 请求地址
1082
- * @param data - 请求数据
1083
- * @param options - Axios 配置选项
1084
- * @returns 响应数据
1515
+ * @param data - 请求体数据
1516
+ * @param options - 额外的请求配置
1517
+ * @returns Promise<any> 响应数据
1085
1518
  */
1086
1519
  put: async (url, data, options) => {
1087
1520
  const res = await instance({ method: "put", url, data, ...options });
1088
1521
  return res.data;
1089
1522
  },
1090
1523
  /**
1091
- * DELETE 请求方法
1524
+ * 发送 DELETE 请求
1092
1525
  * @param url - 请求地址
1093
- * @param data - 请求数据
1094
- * @param options - Axios 配置选项
1095
- * @returns 响应数据
1526
+ * @param data - 请求体数据
1527
+ * @param options - 额外的请求配置
1528
+ * @returns Promise<any> 响应数据
1096
1529
  */
1097
1530
  delete: async (url, data, options) => {
1098
1531
  const res = await instance({ method: "delete", url, data, ...options });
@@ -1101,8 +1534,66 @@ function createRequest(baseURL = "/api") {
1101
1534
  };
1102
1535
  }
1103
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
+
1104
1595
  // src/hooks/webSocket/useWebSocket.ts
1105
- var useWebSocket = ({
1596
+ var useWebSocket_default = ({
1106
1597
  url,
1107
1598
  onMessage,
1108
1599
  onClose,
@@ -1110,11 +1601,8 @@ var useWebSocket = ({
1110
1601
  heartbeatMessage = "ping",
1111
1602
  clientHeartbeat = true,
1112
1603
  reconnectInterval = 5e3,
1113
- // 默认重连间隔为 5 秒
1114
1604
  maxReconnectAttempts,
1115
- // 不设置默认值为无限重连
1116
1605
  isReconnect = true
1117
- // 默认开启重连机制
1118
1606
  }) => {
1119
1607
  const socketRef = React16.useRef(null);
1120
1608
  const heartbeatIntervalRef = React16.useRef(null);
@@ -1138,6 +1626,7 @@ var useWebSocket = ({
1138
1626
  const stopHeartbeat = () => {
1139
1627
  if (heartbeatIntervalRef.current) {
1140
1628
  clearInterval(heartbeatIntervalRef.current);
1629
+ heartbeatIntervalRef.current = null;
1141
1630
  }
1142
1631
  };
1143
1632
  const stopReconnectTimer = () => {
@@ -1230,14 +1719,17 @@ var useWebSocket = ({
1230
1719
  socketRef.current.send(message3);
1231
1720
  stopHeartbeat();
1232
1721
  startHeartbeat(socketRef.current);
1722
+ } else {
1723
+ console.warn("WebSocket \u672A\u8FDE\u63A5\uFF0C\u65E0\u6CD5\u53D1\u9001\u6D88\u606F:", message3);
1233
1724
  }
1234
1725
  };
1235
1726
  return {
1727
+ /** 发送消息方法 */
1236
1728
  sendMessage,
1729
+ /** Socket 连接状态 */
1237
1730
  socketReadyState
1238
1731
  };
1239
1732
  };
1240
- var useWebSocket_default = useWebSocket;
1241
1733
  var ProtectedView = ({
1242
1734
  passwordStatus,
1243
1735
  verifyPassword,
@@ -1263,8 +1755,8 @@ var ProtectedView = ({
1263
1755
  var PdfPreview_default = ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumbnails = true, onSetPassword, onSetPageNo }) => {
1264
1756
  const embedRef = React16.useRef(null);
1265
1757
  const [sizes, setSizes] = React16.useState([0]);
1266
- const [, setDocLoaded, getDocLoaded] = useRefState(false);
1267
- const [currentPage, setCurrentPage, getCurrentPage] = useRefState(void 0);
1758
+ const [, setDocLoaded, getDocLoaded] = useRefState_default(false);
1759
+ const [currentPage, setCurrentPage, getCurrentPage] = useRefState_default(void 0);
1268
1760
  const [temporaryPassword, setTemporaryPassword] = React16.useState("");
1269
1761
  const jumpToPageNo = React16.useRef();
1270
1762
  const onVerifyPasswordEnd = (password2) => {
@@ -1471,10 +1963,10 @@ var FilePreviewDrawer_default = ({
1471
1963
  var styles_module_default2 = {
1472
1964
  iframe: "styles_module_iframe"
1473
1965
  };
1474
- var Iframe_default = React16.forwardRef(({ id, src, className, onLoad }, ref) => {
1966
+ var Iframe_default = React16.forwardRef(({ defaultMainSource, id, src, className, onLoad }, ref) => {
1475
1967
  const [loading, setLoading] = React16.useState(false);
1476
1968
  const finalSrc = React16.useMemo(() => {
1477
- return buildUrlParams({ v: Date.now() }, addUrlLastSlash(getUrlMainSource(src, location.href)));
1969
+ return buildUrlParams({ v: Date.now() }, addUrlLastSlash(setUrlMainSource(src, location.href, defaultMainSource)));
1478
1970
  }, [src]);
1479
1971
  const onHandleLoad = () => {
1480
1972
  setLoading(false);
@@ -1483,7 +1975,17 @@ var Iframe_default = React16.forwardRef(({ id, src, className, onLoad }, ref) =>
1483
1975
  React16.useEffect(() => {
1484
1976
  setLoading(true);
1485
1977
  }, [src]);
1486
- 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("iframe", { id, ref, src: finalSrc, className: classNames2__default.default(styles_module_default2.iframe, className), onLoad: onHandleLoad }) }) });
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
+ ) }) });
1487
1989
  });
1488
1990
  var Link = TiptapLink__default.default.extend({
1489
1991
  inclusive: false,
@@ -5136,7 +5638,7 @@ var MarkdownEditor_default = ({
5136
5638
  editor?.commands.setContent(value);
5137
5639
  lastContentRef.current = value;
5138
5640
  }, [value, editor]);
5139
- const onPageChange = useDebounce((pageIndex) => {
5641
+ const onPageChange = useDebounce_default((pageIndex) => {
5140
5642
  onScrollPage?.(parseInt(pageIndex ?? "0"));
5141
5643
  }, 300);
5142
5644
  React16.useEffect(() => {
@@ -5259,7 +5761,7 @@ function renderDefault(DefaultComponent, ref, props) {
5259
5761
  if (!DefaultComponent) return null;
5260
5762
  return isRenderFn(DefaultComponent) ? /* @__PURE__ */ jsxRuntime.jsx(DefaultComponent, { ref, ...props }) : DefaultComponent;
5261
5763
  }
5262
- var RenderWrapper = React16.forwardRef(function RenderWrapper2({ control = true, ctx, DefaultComponent }, ref) {
5764
+ var RenderWrapper_default = React16.forwardRef(function RenderWrapper({ control = true, ctx, DefaultComponent }, ref) {
5263
5765
  if (control === false || isNull(control)) return null;
5264
5766
  if (control === true || control === void 0) {
5265
5767
  return renderDefault(DefaultComponent, ref);
@@ -5293,39 +5795,53 @@ var UserAvatar_default = ({ size, avatarSrc, userName }) => {
5293
5795
  };
5294
5796
 
5295
5797
  exports.AudioPlayer = AudioPlayer_default;
5296
- exports.DateFormatType = DateFormatType;
5297
- exports.DateFormatType2 = DateFormatType2;
5298
- exports.ERROR = ERROR;
5299
- exports.FORBIDDEN = FORBIDDEN;
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;
5300
5803
  exports.FileIcon = FileIcon_default;
5301
5804
  exports.FilePreview = FilePreview_default;
5302
5805
  exports.FilePreviewDrawer = FilePreviewDrawer_default;
5806
+ exports.HttpStatus = HttpStatus;
5303
5807
  exports.Iframe = Iframe_default;
5304
5808
  exports.LazyComponent = LazyComponent_default;
5305
- exports.LgPrimaryColor = LgPrimaryColor;
5306
- exports.MISSING_PARAMETER = MISSING_PARAMETER;
5307
5809
  exports.MarkdownEditor = MarkdownEditor_default;
5308
5810
  exports.MarkdownPreview = MarkdownPreview_default;
5309
- exports.NOT_FOUND = NOT_FOUND;
5310
- exports.OK = OK;
5311
- exports.PERMISSION_DENIED = PERMISSION_DENIED;
5811
+ exports.MultiEmailValidator = MultiEmailValidator;
5312
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;
5313
5824
  exports.RenderMarkdown = RenderMarkdown_default;
5314
- exports.RenderWrapper = RenderWrapper;
5315
- exports.TOKEN_KEY = TOKEN_KEY;
5316
- exports.UNAUTHORIZED = UNAUTHORIZED;
5825
+ exports.RenderWrapper = RenderWrapper_default;
5826
+ exports.ThanNumLengthValidator = ThanNumLengthValidator;
5827
+ exports.ThanNumValidator = ThanNumValidator;
5317
5828
  exports.UserAvatar = UserAvatar_default;
5318
5829
  exports.VideoPlayer = VideoPlayer_default;
5319
5830
  exports.absVal = absVal;
5320
5831
  exports.addUrlLastSlash = addUrlLastSlash;
5832
+ exports.aesDecrypt = aesDecrypt;
5833
+ exports.aesEncrypt = aesEncrypt;
5321
5834
  exports.arrToObj = arrToObj;
5322
5835
  exports.buildUrlParams = buildUrlParams;
5836
+ exports.cachedMessage = cachedMessage;
5323
5837
  exports.calculate = calculate;
5324
- exports.clearCurrentUser = clearCurrentUser;
5325
- exports.clearToken = clearToken;
5326
5838
  exports.compareNum = compareNum;
5839
+ exports.convertCurrency = convertCurrency;
5840
+ exports.convertNewlineToBr = convertNewlineToBr;
5327
5841
  exports.copyText = copyText;
5328
5842
  exports.createRequest = createRequest;
5843
+ exports.createSecureManager = createSecureManager;
5844
+ exports.createTokenManager = createTokenManager;
5329
5845
  exports.decimalPlaces = decimalPlaces;
5330
5846
  exports.deepCopy = deepCopy;
5331
5847
  exports.deepEqual = deepEqual;
@@ -5334,27 +5850,25 @@ exports.dividedBy = dividedBy;
5334
5850
  exports.downloadFile = downloadFile;
5335
5851
  exports.emit = emit;
5336
5852
  exports.emitToChild = emitToChild;
5853
+ exports.executeScript = executeScript;
5337
5854
  exports.formatDate = formatDate;
5338
5855
  exports.formatNumberWithCommas = formatNumberWithCommas;
5339
5856
  exports.genNonDuplicateID = genNonDuplicateID;
5340
5857
  exports.generateRandomNumbers = generateRandomNumbers;
5341
- exports.getCurrentUser = getCurrentUser;
5858
+ exports.getAllUrlParams = getAllUrlParams;
5342
5859
  exports.getDeviceId = getDeviceId;
5343
5860
  exports.getEndOfTimestamp = getEndOfTimestamp;
5344
5861
  exports.getFileName = getFileName;
5345
5862
  exports.getFileSuffixName = getFileSuffixName;
5346
- exports.getSignPath = getSignPath;
5863
+ exports.getRowSpanCount = getRowSpanCount;
5347
5864
  exports.getStartOfTimestamp = getStartOfTimestamp;
5348
5865
  exports.getTimestamp = getTimestamp;
5349
- exports.getToken = getToken;
5350
- exports.getUrlMainSource = getUrlMainSource;
5351
- exports.getUrlToken = getUrlToken;
5352
5866
  exports.getWebSocketUrl = getWebSocketUrl;
5867
+ exports.importThirdPartyFile = importThirdPartyFile;
5353
5868
  exports.is = is;
5354
5869
  exports.isArray = isArray;
5355
5870
  exports.isBlob = isBlob;
5356
5871
  exports.isBoolean = isBoolean;
5357
- exports.isClient = isClient;
5358
5872
  exports.isDate = isDate;
5359
5873
  exports.isDef = isDef;
5360
5874
  exports.isElement = isElement;
@@ -5364,6 +5878,7 @@ exports.isExpire = isExpire;
5364
5878
  exports.isExternal = isExternal;
5365
5879
  exports.isFunction = isFunction;
5366
5880
  exports.isInteger = isInteger;
5881
+ exports.isJson = isJson;
5367
5882
  exports.isLocalhost = isLocalhost;
5368
5883
  exports.isMap = isMap;
5369
5884
  exports.isNegative = isNegative;
@@ -5373,33 +5888,35 @@ exports.isNumber = isNumber;
5373
5888
  exports.isNumberNoNaN = isNumberNoNaN;
5374
5889
  exports.isObject = isObject;
5375
5890
  exports.isPromise = isPromise;
5891
+ exports.isReferenceType = isReferenceType;
5376
5892
  exports.isRegExp = isRegExp;
5377
- exports.isServer = isServer;
5893
+ exports.isScriptSafe = isScriptSafe;
5894
+ exports.isSet = isSet;
5378
5895
  exports.isString = isString;
5379
5896
  exports.isUnDef = isUnDef;
5380
5897
  exports.isWindow = isWindow;
5381
5898
  exports.minus = minus;
5382
- exports.nsSetInterval = nsSetInterval;
5383
5899
  exports.objToOptions = objToOptions;
5384
5900
  exports.plus = plus;
5385
5901
  exports.precision = precision;
5902
+ exports.processItemList = processItemList;
5386
5903
  exports.propsMerge = propsMerge;
5387
- exports.setCurrentUser = setCurrentUser;
5388
- exports.setToken = setToken;
5904
+ exports.setInterval = setInterval2;
5905
+ exports.setUrlMainSource = setUrlMainSource;
5389
5906
  exports.shouldRender = shouldRender;
5390
- exports.textAreaView = textAreaView;
5391
- exports.themeConfig = themeConfig;
5392
5907
  exports.times = times;
5393
5908
  exports.toFixed = toFixed;
5394
5909
  exports.transform = transform;
5395
5910
  exports.transforms = transforms;
5396
- exports.useCreateValtioContext = useCreateValtioContext;
5397
- exports.useDebounce = useDebounce;
5398
- exports.useDeepEffect = useDeepEffect;
5399
- exports.useIframeRelayBridge = useIframeRelayBridge;
5400
- exports.useRefState = useRefState;
5401
- exports.useSyncInput = useSyncInput;
5402
- exports.useThrottle = useThrottle;
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;
5403
5920
  exports.useWebSocket = useWebSocket_default;
5404
5921
  //# sourceMappingURL=index.cjs.js.map
5405
5922
  //# sourceMappingURL=index.cjs.js.map