@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.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, message, Splitter, Empty, Image, Flex, Drawer, Tag, Avatar, Alert, notification, Modal, Form, Input, Button } from 'antd';
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 as message$1 } 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';
@@ -340,7 +339,7 @@ function isNumber(val) {
340
339
  return is(val, "Number");
341
340
  }
342
341
  function isNumberNoNaN(val) {
343
- return is(val, "Number") && !isNaN(val);
342
+ return isNumber(val) && !isNaN(val);
344
343
  }
345
344
  function isString(val) {
346
345
  return is(val, "String");
@@ -361,7 +360,7 @@ function isArray(val) {
361
360
  return Array.isArray(val);
362
361
  }
363
362
  function isEmpty(val) {
364
- if (isArray(val) || isString(val)) {
363
+ if (isString(val) || isArray(val)) {
365
364
  return val.length === 0;
366
365
  }
367
366
  if (isNullOrUnDef(val)) {
@@ -373,28 +372,89 @@ function isEmpty(val) {
373
372
  return isEmptyObj(val);
374
373
  }
375
374
  function isWindow(val) {
376
- return typeof window !== "undefined" && is(val, "Window");
375
+ return is(val, "Window");
377
376
  }
378
377
  function isElement(val) {
379
- return isObject(val) && !!val.tagName;
378
+ return isObject(val) && !!val?.tagName;
380
379
  }
381
380
  function isMap(val) {
382
381
  return is(val, "Map");
383
382
  }
384
- var isServer = typeof window === "undefined";
385
- var isClient = !isServer;
383
+ function isSet(val) {
384
+ return is(val, "Set");
385
+ }
386
386
  var isExternal = (path) => {
387
- return /^(https?:|mailto:|tel:)/.test(path);
387
+ if (!isString(path)) return false;
388
+ return /^(https?:|mailto:|tel:|ftp:)/.test(path);
388
389
  };
389
390
  var isBlob = (val) => {
390
391
  return is(val, "Blob");
391
392
  };
392
393
  var isLocalhost = (host) => {
393
- return /^(localhost:)/.test(host || location.host);
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
+ }
394
454
  };
395
455
 
396
456
  // src/hooks/iframe/useIframeRelayBridge.ts
397
- function useIframeRelayBridge(allowedOrigins = ["*"]) {
457
+ var useIframeRelayBridge_default = (allowedOrigins = ["*"]) => {
398
458
  const handlers = useRef({});
399
459
  useEffect(() => {
400
460
  const onMessage = (evt) => {
@@ -421,8 +481,64 @@ function useIframeRelayBridge(allowedOrigins = ["*"]) {
421
481
  handlers.current[type] = (handlers.current[type] || []).filter((fn) => fn !== handler);
422
482
  }
423
483
  return { on, off };
424
- }
425
- function useCreateValtioContext() {
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 = () => {
426
542
  const Context = createContext(null);
427
543
  const ValtioProvider = ({ store, children }) => /* @__PURE__ */ jsx(Context.Provider, { value: store, children });
428
544
  const useValtioStore = () => {
@@ -436,8 +552,8 @@ function useCreateValtioContext() {
436
552
  // 导出 Context 以便外部使用
437
553
  Context
438
554
  };
439
- }
440
- function useDebounce(func, wait = 400) {
555
+ };
556
+ var useDebounce_default = (func, wait = 400) => {
441
557
  const { current } = useRef({ func, timeOut: null });
442
558
  useEffect(() => {
443
559
  current.func = func;
@@ -472,97 +588,155 @@ function useDebounce(func, wait = 400) {
472
588
  debounce.flush = flush;
473
589
  debounce.cancel = cancel;
474
590
  return useCallback(debounce, []);
475
- }
476
- var deepCopy = (obj, isJson = true) => {
477
- if (!isArray(obj) && !isObject(obj)) return obj;
478
- if (isJson) return JSON.parse(JSON.stringify(obj));
479
- const result = isArray(obj) ? [] : {};
480
- for (const key in obj) {
481
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
482
- 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);
483
598
  }
484
599
  }
485
- return result;
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);
486
645
  };
487
646
  function deepEqual(a, b) {
488
- if (Object.is(a, b)) return true;
489
- if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
490
- if (a instanceof RegExp && b instanceof RegExp) return a.toString() === b.toString();
491
- if (a instanceof Map && b instanceof Map) {
492
- if (a.size !== b.size) return false;
493
- for (const [key, val] of a.entries()) {
494
- if (!b.has(key) || !deepEqual(val, b.get(key))) return false;
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);
495
658
  }
496
- return true;
497
- }
498
- if (a instanceof Set && b instanceof Set) {
499
- if (a.size !== b.size) return false;
500
- for (const val of a.values()) {
501
- if (!b.has(val)) return false;
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;
502
668
  }
503
- return true;
504
- }
505
- if (Array.isArray(a) && Array.isArray(b)) {
506
- if (a.length !== b.length) return false;
507
- return a.every((item, i) => deepEqual(item, b[i]));
508
- }
509
- if (typeof a === "function" && typeof b === "function") return a.toString() === b.toString();
510
- if (isObject(a) && isObject(b)) {
511
- const keysA = Object.keys(a);
512
- const keysB = Object.keys(b);
513
- if (keysA.length !== keysB.length) return false;
514
- for (const key of keysA) {
515
- 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;
516
676
  }
517
- return true;
518
- }
519
- return false;
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);
520
695
  }
521
696
  var deepMerge = (base, override) => {
697
+ if (!base || !override) {
698
+ return base || override || {};
699
+ }
522
700
  const result = { ...base };
523
701
  Object.keys(override || {}).forEach((key) => {
524
702
  const baseValue = base[key];
525
703
  const overrideValue = override[key];
526
- if (typeof baseValue === "object" && baseValue !== null && !isArray(baseValue) && typeof overrideValue === "object" && overrideValue !== null && !isArray(overrideValue)) {
704
+ if (isObject(baseValue) && isObject(overrideValue)) {
527
705
  result[key] = deepMerge(baseValue, overrideValue);
528
- } else if (overrideValue !== void 0) {
706
+ } else if (isDef(overrideValue)) {
529
707
  result[key] = overrideValue;
530
708
  }
531
709
  });
532
710
  return result;
533
711
  };
534
- var objToOptions = (obj) => {
535
- 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) => ({
536
714
  label: obj[key],
537
- value: Number(key)
715
+ value: isNaN(Number(key)) ? key : Number(key)
538
716
  }));
539
717
  };
540
718
  var arrToObj = (arr = [], key) => {
541
719
  const obj = {};
542
- arr?.forEach((item) => {
720
+ arr.forEach((item) => {
543
721
  obj[item[key]] = item;
544
722
  });
545
723
  return obj;
546
724
  };
547
- var nsSetInterval = (fn, t) => {
725
+ var setInterval2 = (fn, t) => {
548
726
  let timer = null;
549
- let isCancelled = false;
550
- const interval = () => {
727
+ let running = true;
728
+ const loop = () => {
551
729
  timer = setTimeout(async () => {
552
- if (isCancelled) {
553
- return;
554
- }
730
+ if (!running) return;
555
731
  await fn();
556
- if (!isCancelled) {
557
- interval();
558
- }
732
+ if (running) loop();
559
733
  }, t);
560
734
  };
561
- interval();
735
+ loop();
562
736
  return {
563
- isRun: () => !!timer,
737
+ isRun: () => running,
564
738
  cancel: () => {
565
- isCancelled = true;
739
+ running = false;
566
740
  if (timer) {
567
741
  clearTimeout(timer);
568
742
  timer = null;
@@ -571,18 +745,13 @@ var nsSetInterval = (fn, t) => {
571
745
  };
572
746
  };
573
747
  var genNonDuplicateID = () => {
574
- let idStr = Date.now().toString(36);
575
- idStr += Math.random().toString(36).substr(2);
576
- return idStr;
748
+ return crypto.randomUUID();
577
749
  };
578
- var copyText = (text, prompt = "\u590D\u5236\u6210\u529F") => {
579
- if (navigator.clipboard && window.isSecureContext) {
580
- navigator.clipboard.writeText(text).then(() => {
581
- if (prompt) {
582
- message.success(prompt);
583
- }
584
- });
585
- } else {
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) {
586
755
  const textArea = document.createElement("textarea");
587
756
  textArea.value = text;
588
757
  textArea.style.position = "absolute";
@@ -592,10 +761,8 @@ var copyText = (text, prompt = "\u590D\u5236\u6210\u529F") => {
592
761
  document.body.appendChild(textArea);
593
762
  textArea.focus();
594
763
  textArea.select();
595
- const bol = document.execCommand("copy");
596
- if (bol && prompt) {
597
- message.success(prompt);
598
- }
764
+ const ok = document.execCommand("copy");
765
+ if (ok && prompt) message.success(prompt);
599
766
  textArea.remove();
600
767
  }
601
768
  };
@@ -620,25 +787,71 @@ var getFileName = (filePath) => {
620
787
  var getFileSuffixName = (fileName) => {
621
788
  return fileName.split(".").pop() || "";
622
789
  };
623
- var textAreaView = (con) => {
790
+ var convertNewlineToBr = (con) => {
624
791
  return con ? con.replace(/\r\n/g, "\n").replace(/\n/g, "<br/>") : "";
625
792
  };
626
- var buildUrlParams = (obj, url) => {
627
- const params = Object.entries(obj).filter(([, value]) => !isNullOrUnDef(value)).map(([key, value]) => {
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;
628
835
  if (isArray(value)) {
629
- return value.filter((v) => !isNullOrUnDef(v)).map((v) => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`).join("&");
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));
630
845
  }
631
- return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
632
- }).join("&");
633
- if (url) {
634
- const separator = url.includes("?") ? "&" : "?";
635
- return `${url}${separator}${params}`;
636
846
  }
637
- return params;
847
+ const query = params.toString();
848
+ if (!base) return query;
849
+ const cleanBase = base.split("?")[0];
850
+ return `${cleanBase}${query ? `?${query}` : ""}${hash}`;
638
851
  };
639
852
  var downloadFile = (url, name) => {
640
853
  const a = document.createElement("a");
641
- a.download = name || "\u56FE\u7247\u4E0B\u8F7D";
854
+ a.download = name || "\u6587\u4EF6";
642
855
  a.href = url;
643
856
  document.body.appendChild(a);
644
857
  a.click();
@@ -646,31 +859,28 @@ var downloadFile = (url, name) => {
646
859
  window.URL.revokeObjectURL(url);
647
860
  };
648
861
  var addUrlLastSlash = (url = "") => {
649
- const u = new URL(url, "https://logosdata.cn");
650
- let pathname = u.pathname;
651
- if (!pathname.endsWith("/")) {
652
- pathname += "/";
653
- }
654
- u.pathname = pathname;
655
- 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}`;
656
865
  };
657
- var getUrlMainSource = (url, preHref) => {
658
- if (!preHref) return url;
659
- let newUrl = "";
660
- const preHrefUrl = new URL(preHref);
866
+ var setUrlMainSource = (url, preHref, defaultMainSource) => {
661
867
  const urlParts = url.split("?");
662
868
  const srcParams = new URLSearchParams(urlParts[1] || "");
663
869
  if (srcParams.has("mainSource")) {
664
- newUrl = url;
665
- } else {
666
- const mainSource = preHrefUrl.searchParams.get("mainSource");
667
- if (mainSource) {
668
- newUrl = buildUrlParams({ mainSource }, url);
669
- } else {
670
- newUrl = url;
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) {
671
881
  }
672
882
  }
673
- return newUrl;
883
+ return buildUrlParams({ mainSource: mainSourceValue }, url);
674
884
  };
675
885
  var getWebSocketUrl = (path, customHost) => {
676
886
  const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
@@ -694,9 +904,178 @@ function transform(source, fieldMap) {
694
904
  function transforms(sources, fieldMap) {
695
905
  return sources?.map((source) => transform(source, fieldMap)) || [];
696
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
+ }
697
1076
 
698
1077
  // src/hooks/useDeepEffect.ts
699
- function useDeepEffect(effect, deps) {
1078
+ var useDeepEffect_default = (effect, deps) => {
700
1079
  const prevDepsRef = useRef();
701
1080
  const depsChanged = !prevDepsRef.current || deps.length !== prevDepsRef.current.length || deps.some((dep, i) => !deepEqual(dep, prevDepsRef.current[i]));
702
1081
  useEffect(() => {
@@ -705,8 +1084,8 @@ function useDeepEffect(effect, deps) {
705
1084
  return effect();
706
1085
  }
707
1086
  }, [depsChanged]);
708
- }
709
- function useRefState(init) {
1087
+ };
1088
+ var useRefState_default = (init) => {
710
1089
  const [state, setState] = useState(init);
711
1090
  const stateRef = useRef(init);
712
1091
  const setProxy = (newVal) => {
@@ -715,8 +1094,8 @@ function useRefState(init) {
715
1094
  };
716
1095
  const getState = () => stateRef.current;
717
1096
  return [state, setProxy, getState];
718
- }
719
- var useSyncInput = (storeValue, setStoreValue) => {
1097
+ };
1098
+ var useSyncInput_default = (storeValue, setStoreValue) => {
720
1099
  const [inputValue, setInputValue] = useState(storeValue);
721
1100
  useEffect(() => {
722
1101
  if (storeValue !== inputValue) {
@@ -732,7 +1111,7 @@ var useSyncInput = (storeValue, setStoreValue) => {
732
1111
  setInputValue: handleValueChange
733
1112
  };
734
1113
  };
735
- function useThrottle(func, wait) {
1114
+ var useThrottle_default = (func, wait) => {
736
1115
  const { current } = useRef({ func, timeOut: null });
737
1116
  useEffect(() => {
738
1117
  current.func = func;
@@ -766,18 +1145,20 @@ function useThrottle(func, wait) {
766
1145
  throttle.flush = flush;
767
1146
  throttle.cancel = cancel;
768
1147
  return useCallback(throttle, []);
769
- }
1148
+ };
770
1149
  dayjs.extend(relativeTime);
771
- var DateFormatType = "YYYY-MM-DD HH:mm:ss";
772
- var DateFormatType2 = "YYYY-MM-DD";
773
- var UNIT = "date";
774
- var getStartOfTimestamp = (date, unit = UNIT) => {
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) => {
775
1156
  return dayjs(date).startOf(unit).valueOf();
776
1157
  };
777
- var getEndOfTimestamp = (date, unit = UNIT) => {
1158
+ var getEndOfTimestamp = (date, unit = DEFAULT_UNIT) => {
778
1159
  return dayjs(date).endOf(unit).valueOf();
779
1160
  };
780
- var formatDate = (date, fmt = DateFormatType) => {
1161
+ var formatDate = (date, fmt = DEFAULT_DATE_TIME_FORMAT) => {
781
1162
  if (date) {
782
1163
  return dayjs(date).format(fmt);
783
1164
  }
@@ -789,33 +1170,6 @@ var getTimestamp = (date) => {
789
1170
  var isExpire = (date) => {
790
1171
  return dayjs(date).isBefore(getStartOfTimestamp());
791
1172
  };
792
- var USER_KEY = "NS-USER";
793
- function setCurrentUser(userInfo) {
794
- const cipherText = AES.encrypt(JSON.stringify(userInfo), "((#II))").toString();
795
- sessionStorage.setItem(USER_KEY, cipherText);
796
- }
797
- function getCurrentUser() {
798
- const userInfoJson = sessionStorage.getItem(USER_KEY);
799
- if (userInfoJson) {
800
- const bytes = AES.decrypt(userInfoJson, "((#II))");
801
- const originalText = bytes.toString(encUtf8);
802
- return JSON.parse(originalText);
803
- }
804
- return null;
805
- }
806
- function clearCurrentUser() {
807
- sessionStorage.removeItem(USER_KEY);
808
- }
809
- var DEVICEID_KEY = "NS-DEVICE-ID";
810
- function getDeviceId() {
811
- let deviceId = localStorage.getItem(DEVICEID_KEY);
812
- if (deviceId) {
813
- return deviceId;
814
- }
815
- deviceId = genNonDuplicateID();
816
- localStorage.setItem(DEVICEID_KEY, deviceId);
817
- return deviceId;
818
- }
819
1173
  var OperatorToMethodName = {
820
1174
  "+": "plus",
821
1175
  "-": "minus",
@@ -868,115 +1222,191 @@ var isInteger = (num) => {
868
1222
  var isNegative = (num) => {
869
1223
  return new Decimal(num).isNegative();
870
1224
  };
871
-
872
- // src/utils/theme.ts
873
- var getPrimaryColor = () => {
874
- const searchParams = new URLSearchParams(location.search);
875
- const mainSource = searchParams.get("mainSource") || "cube-uc";
876
- if (mainSource === "cube-uc") {
877
- return "#34AFBE";
878
- } else if (mainSource === "uc") {
879
- return "#FA541C";
880
- }
881
- };
882
- var LgPrimaryColor = getPrimaryColor();
883
- var themeConfig = {
884
- token: { colorPrimary: LgPrimaryColor, colorLink: LgPrimaryColor },
885
- cssVar: true
886
- };
887
-
888
- // src/utils/message.ts
889
- var cacheMessage = () => {
890
- const contents = {};
1225
+ var createCachedMessage = () => {
1226
+ const messageCache = {};
891
1227
  return ({ title = "\u63D0\u793A", content, type = "warning", duration = 3, onClose, isCache = true, isOnly = false }) => {
892
1228
  if (!content) return;
893
- const key = isOnly ? "cache-key" : content;
894
- const onClose2 = () => {
895
- delete contents[key];
1229
+ const cacheKey = isOnly ? "unique-message-key" : content;
1230
+ const handleClose = () => {
1231
+ delete messageCache[cacheKey];
896
1232
  onClose?.();
897
1233
  };
898
- if (isCache && contents[key]) ; else {
899
- if (isCache) {
900
- contents[key] = getTimestamp();
901
- }
902
- if (duration) {
903
- if (content.length > 30) {
904
- notification[type]({
905
- message: title,
906
- description: content,
907
- placement: "top",
908
- duration,
909
- onClose: onClose2
910
- });
911
- } else {
912
- message$1[type]({
913
- content,
914
- duration,
915
- onClose: onClose2
916
- });
917
- }
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
+ });
918
1247
  } else {
919
- Modal[type]({
920
- title,
1248
+ message[type]({
921
1249
  content,
922
- okButtonProps: { style: { background: LgPrimaryColor, outline: "none" } },
923
- afterClose: onClose2
1250
+ duration,
1251
+ onClose: handleClose
924
1252
  });
925
1253
  }
1254
+ } else {
1255
+ Modal[type]({
1256
+ title,
1257
+ content,
1258
+ closable: true,
1259
+ centered: true,
1260
+ footer: null,
1261
+ afterClose: handleClose
1262
+ });
926
1263
  }
927
1264
  };
928
1265
  };
929
- var showMessage = cacheMessage();
1266
+ var cachedMessage = createCachedMessage();
930
1267
 
931
- // src/utils/session.ts
932
- var TOKEN_KEY = "NS-TOKEN";
933
- function setToken(accessToken) {
934
- localStorage.setItem(TOKEN_KEY, accessToken);
935
- }
936
- function getUrlToken() {
937
- const searchParams = new URLSearchParams(location.search);
938
- const token = searchParams.get(TOKEN_KEY);
939
- return token || "";
940
- }
941
- function getToken() {
942
- const token = getUrlToken();
943
- if (!token) {
944
- const token2 = localStorage.getItem(TOKEN_KEY);
945
- return token2 || "";
946
- } else {
947
- setToken(token);
948
- return token;
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();
949
1336
  }
950
- }
951
- function clearToken() {
952
- localStorage.removeItem(TOKEN_KEY);
953
- }
954
- var SIGNPATH = "SIGNPATH";
955
- function getSignPath() {
956
- const path = localStorage.getItem(SIGNPATH);
957
- return `${path || "/sign-in"}`;
958
- }
959
-
960
- // src/utils/request.ts
961
- var OK = 200;
962
- var ERROR = 500;
963
- var MISSING_PARAMETER = 400;
964
- var UNAUTHORIZED = 401;
965
- var FORBIDDEN = 403;
966
- var NOT_FOUND = 404;
967
- var PERMISSION_DENIED = 13001;
968
- function createRequest(baseURL = "/api") {
969
- const redirectUrl = () => {
970
- emit("jumpLink", { url: `/uc${getSignPath()}` });
971
- };
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) {
972
1399
  const instance = axios.create({
973
- baseURL,
974
- timeout: 6e4
1400
+ baseURL: "/api",
1401
+ // 默认基础URL
1402
+ timeout: 6e4,
1403
+ // 请求超时时间设为60秒
1404
+ ...config
1405
+ // 合并传入的配置项
975
1406
  });
976
1407
  instance.interceptors.request.use(
977
- function(config) {
978
- config.headers[TOKEN_KEY] = getToken();
979
- return config;
1408
+ function(config2) {
1409
+ return config2;
980
1410
  },
981
1411
  function(error) {
982
1412
  return Promise.reject(error);
@@ -985,31 +1415,29 @@ function createRequest(baseURL = "/api") {
985
1415
  instance.interceptors.response.use(
986
1416
  function(response) {
987
1417
  if (isBlob(response.data)) return response;
988
- if (response.data?.code !== OK) {
989
- const isPermission = response.data?.code === PERMISSION_DENIED;
990
- if (response.config?.showError !== false) {
991
- showMessage({
1418
+ if (response.data?.code !== BusinessCode.OK) {
1419
+ const isPermission = response.data?.code === BusinessCode.PERMISSION_DENIED;
1420
+ if (showError(response.config?.showError)) {
1421
+ cachedMessage({
992
1422
  title: isPermission ? "" : void 0,
993
1423
  content: response.data.message,
994
1424
  duration: isPermission ? 0 : 3
995
1425
  });
996
1426
  }
997
- return Promise.reject(response.data);
1427
+ return Promise.reject(response);
998
1428
  }
999
1429
  return response;
1000
1430
  },
1001
1431
  function(err) {
1002
- const showError = err?.config?.showError !== false;
1003
1432
  if (!err.response) {
1004
- if (showError) showMessage({ content: "\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC", type: "error" });
1433
+ if (showError(err?.config?.showError)) cachedMessage({ content: "\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC", type: "error" });
1005
1434
  } else {
1006
1435
  switch (err.response?.status) {
1007
- case UNAUTHORIZED:
1008
- if (showError) showMessage({ content: err.response?.data.message, type: "error" });
1009
- redirectUrl();
1436
+ case HttpStatus.UNAUTHORIZED:
1437
+ if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message, type: "error" });
1010
1438
  break;
1011
1439
  default:
1012
- if (showError) showMessage({ content: err.response?.data.message || "\u8BF7\u6C42\u9519\u8BEF\uFF01", type: "error" });
1440
+ if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message || "\u8BF7\u6C42\u9519\u8BEF\uFF01", type: "error" });
1013
1441
  }
1014
1442
  }
1015
1443
  return Promise.reject(err);
@@ -1017,44 +1445,49 @@ function createRequest(baseURL = "/api") {
1017
1445
  );
1018
1446
  return {
1019
1447
  /**
1020
- * GET 请求方法
1448
+ * 返回原始 axios 实例
1449
+ * 可以用于添加拦截器等
1450
+ */
1451
+ instance,
1452
+ /**
1453
+ * 发送 GET 请求
1021
1454
  * @param url - 请求地址
1022
1455
  * @param params - 查询参数
1023
- * @param options - Axios 配置选项
1024
- * @returns 响应数据
1456
+ * @param options - 额外的请求配置
1457
+ * @returns Promise<any> 响应数据
1025
1458
  */
1026
1459
  get: async (url, params, options) => {
1027
1460
  const res = await instance({ method: "get", url, params, ...options });
1028
1461
  return res.data;
1029
1462
  },
1030
1463
  /**
1031
- * POST 请求方法
1464
+ * 发送 POST 请求
1032
1465
  * @param url - 请求地址
1033
- * @param data - 请求数据
1034
- * @param options - Axios 配置选项
1035
- * @returns 响应数据
1466
+ * @param data - 请求体数据
1467
+ * @param options - 额外的请求配置
1468
+ * @returns Promise<any> 响应数据
1036
1469
  */
1037
1470
  post: async (url, data, options) => {
1038
1471
  const res = await instance({ method: "post", url, data, ...options });
1039
1472
  return res.data;
1040
1473
  },
1041
1474
  /**
1042
- * PUT 请求方法
1475
+ * 发送 PUT 请求
1043
1476
  * @param url - 请求地址
1044
- * @param data - 请求数据
1045
- * @param options - Axios 配置选项
1046
- * @returns 响应数据
1477
+ * @param data - 请求体数据
1478
+ * @param options - 额外的请求配置
1479
+ * @returns Promise<any> 响应数据
1047
1480
  */
1048
1481
  put: async (url, data, options) => {
1049
1482
  const res = await instance({ method: "put", url, data, ...options });
1050
1483
  return res.data;
1051
1484
  },
1052
1485
  /**
1053
- * DELETE 请求方法
1486
+ * 发送 DELETE 请求
1054
1487
  * @param url - 请求地址
1055
- * @param data - 请求数据
1056
- * @param options - Axios 配置选项
1057
- * @returns 响应数据
1488
+ * @param data - 请求体数据
1489
+ * @param options - 额外的请求配置
1490
+ * @returns Promise<any> 响应数据
1058
1491
  */
1059
1492
  delete: async (url, data, options) => {
1060
1493
  const res = await instance({ method: "delete", url, data, ...options });
@@ -1063,8 +1496,66 @@ function createRequest(baseURL = "/api") {
1063
1496
  };
1064
1497
  }
1065
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
+
1066
1557
  // src/hooks/webSocket/useWebSocket.ts
1067
- var useWebSocket = ({
1558
+ var useWebSocket_default = ({
1068
1559
  url,
1069
1560
  onMessage,
1070
1561
  onClose,
@@ -1072,11 +1563,8 @@ var useWebSocket = ({
1072
1563
  heartbeatMessage = "ping",
1073
1564
  clientHeartbeat = true,
1074
1565
  reconnectInterval = 5e3,
1075
- // 默认重连间隔为 5 秒
1076
1566
  maxReconnectAttempts,
1077
- // 不设置默认值为无限重连
1078
1567
  isReconnect = true
1079
- // 默认开启重连机制
1080
1568
  }) => {
1081
1569
  const socketRef = useRef(null);
1082
1570
  const heartbeatIntervalRef = useRef(null);
@@ -1100,6 +1588,7 @@ var useWebSocket = ({
1100
1588
  const stopHeartbeat = () => {
1101
1589
  if (heartbeatIntervalRef.current) {
1102
1590
  clearInterval(heartbeatIntervalRef.current);
1591
+ heartbeatIntervalRef.current = null;
1103
1592
  }
1104
1593
  };
1105
1594
  const stopReconnectTimer = () => {
@@ -1192,14 +1681,17 @@ var useWebSocket = ({
1192
1681
  socketRef.current.send(message3);
1193
1682
  stopHeartbeat();
1194
1683
  startHeartbeat(socketRef.current);
1684
+ } else {
1685
+ console.warn("WebSocket \u672A\u8FDE\u63A5\uFF0C\u65E0\u6CD5\u53D1\u9001\u6D88\u606F:", message3);
1195
1686
  }
1196
1687
  };
1197
1688
  return {
1689
+ /** 发送消息方法 */
1198
1690
  sendMessage,
1691
+ /** Socket 连接状态 */
1199
1692
  socketReadyState
1200
1693
  };
1201
1694
  };
1202
- var useWebSocket_default = useWebSocket;
1203
1695
  var ProtectedView = ({
1204
1696
  passwordStatus,
1205
1697
  verifyPassword,
@@ -1225,8 +1717,8 @@ var ProtectedView = ({
1225
1717
  var PdfPreview_default = ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumbnails = true, onSetPassword, onSetPageNo }) => {
1226
1718
  const embedRef = useRef(null);
1227
1719
  const [sizes, setSizes] = useState([0]);
1228
- const [, setDocLoaded, getDocLoaded] = useRefState(false);
1229
- const [currentPage, setCurrentPage, getCurrentPage] = useRefState(void 0);
1720
+ const [, setDocLoaded, getDocLoaded] = useRefState_default(false);
1721
+ const [currentPage, setCurrentPage, getCurrentPage] = useRefState_default(void 0);
1230
1722
  const [temporaryPassword, setTemporaryPassword] = useState("");
1231
1723
  const jumpToPageNo = useRef();
1232
1724
  const onVerifyPasswordEnd = (password2) => {
@@ -1433,10 +1925,10 @@ var FilePreviewDrawer_default = ({
1433
1925
  var styles_module_default2 = {
1434
1926
  iframe: "styles_module_iframe"
1435
1927
  };
1436
- var Iframe_default = forwardRef(({ id, src, className, onLoad }, ref) => {
1928
+ var Iframe_default = forwardRef(({ defaultMainSource, id, src, className, onLoad }, ref) => {
1437
1929
  const [loading, setLoading] = useState(false);
1438
1930
  const finalSrc = useMemo(() => {
1439
- return buildUrlParams({ v: Date.now() }, addUrlLastSlash(getUrlMainSource(src, location.href)));
1931
+ return buildUrlParams({ v: Date.now() }, addUrlLastSlash(setUrlMainSource(src, location.href, defaultMainSource)));
1440
1932
  }, [src]);
1441
1933
  const onHandleLoad = () => {
1442
1934
  setLoading(false);
@@ -1445,7 +1937,17 @@ var Iframe_default = forwardRef(({ id, src, className, onLoad }, ref) => {
1445
1937
  useEffect(() => {
1446
1938
  setLoading(true);
1447
1939
  }, [src]);
1448
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Spin, { spinning: loading, wrapperClassName: "full-spin", tip: "\u52A0\u8F7D\u4E2D...", children: /* @__PURE__ */ jsx("iframe", { id, ref, src: finalSrc, className: classNames2(styles_module_default2.iframe, className), onLoad: onHandleLoad }) }) });
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
+ ) }) });
1449
1951
  });
1450
1952
  var Link = TiptapLink.extend({
1451
1953
  inclusive: false,
@@ -5098,7 +5600,7 @@ var MarkdownEditor_default = ({
5098
5600
  editor?.commands.setContent(value);
5099
5601
  lastContentRef.current = value;
5100
5602
  }, [value, editor]);
5101
- const onPageChange = useDebounce((pageIndex) => {
5603
+ const onPageChange = useDebounce_default((pageIndex) => {
5102
5604
  onScrollPage?.(parseInt(pageIndex ?? "0"));
5103
5605
  }, 300);
5104
5606
  useEffect(() => {
@@ -5221,7 +5723,7 @@ function renderDefault(DefaultComponent, ref, props) {
5221
5723
  if (!DefaultComponent) return null;
5222
5724
  return isRenderFn(DefaultComponent) ? /* @__PURE__ */ jsx(DefaultComponent, { ref, ...props }) : DefaultComponent;
5223
5725
  }
5224
- var RenderWrapper = forwardRef(function RenderWrapper2({ control = true, ctx, DefaultComponent }, ref) {
5726
+ var RenderWrapper_default = forwardRef(function RenderWrapper({ control = true, ctx, DefaultComponent }, ref) {
5225
5727
  if (control === false || isNull(control)) return null;
5226
5728
  if (control === true || control === void 0) {
5227
5729
  return renderDefault(DefaultComponent, ref);
@@ -5254,6 +5756,6 @@ var UserAvatar_default = ({ size, avatarSrc, userName }) => {
5254
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() });
5255
5757
  };
5256
5758
 
5257
- export { AudioPlayer_default as AudioPlayer, DateFormatType, DateFormatType2, ERROR, FORBIDDEN, FileIcon_default as FileIcon, FilePreview_default as FilePreview, FilePreviewDrawer_default as FilePreviewDrawer, Iframe_default as Iframe, LazyComponent_default as LazyComponent, LgPrimaryColor, MISSING_PARAMETER, MarkdownEditor_default as MarkdownEditor, MarkdownPreview_default as MarkdownPreview, NOT_FOUND, OK, PERMISSION_DENIED, PdfPreview_default as PdfPreview, RenderMarkdown_default as RenderMarkdown, RenderWrapper, TOKEN_KEY, UNAUTHORIZED, UserAvatar_default as UserAvatar, VideoPlayer_default as VideoPlayer, absVal, addUrlLastSlash, arrToObj, buildUrlParams, calculate, clearCurrentUser, clearToken, compareNum, copyText, createRequest, decimalPlaces, deepCopy, deepEqual, deepMerge, dividedBy, downloadFile, emit, emitToChild, formatDate, formatNumberWithCommas, genNonDuplicateID, generateRandomNumbers, getCurrentUser, getDeviceId, getEndOfTimestamp, getFileName, getFileSuffixName, getSignPath, getStartOfTimestamp, getTimestamp, getToken, getUrlMainSource, getUrlToken, getWebSocketUrl, is, isArray, isBlob, isBoolean, isClient, isDate, isDef, isElement, isEmpty, isEmptyObj, isExpire, isExternal, isFunction, isInteger, isLocalhost, isMap, isNegative, isNull, isNullOrUnDef, isNumber, isNumberNoNaN, isObject, isPromise, isRegExp, isServer, isString, isUnDef, isWindow, minus, nsSetInterval, objToOptions, plus, precision, propsMerge, setCurrentUser, setToken, shouldRender, textAreaView, themeConfig, times, toFixed, transform, transforms, useCreateValtioContext, useDebounce, useDeepEffect, useIframeRelayBridge, useRefState, useSyncInput, useThrottle, useWebSocket_default as useWebSocket };
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 };
5258
5760
  //# sourceMappingURL=index.esm.js.map
5259
5761
  //# sourceMappingURL=index.esm.js.map