@zero-library/common 1.0.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.
@@ -0,0 +1,1527 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var icons = require('@ant-design/icons');
5
+ var react = require('react');
6
+ var antd = require('antd');
7
+ var parse = require('html-react-parser');
8
+ var jsonrepair = require('jsonrepair');
9
+ var markdownit = require('markdown-it');
10
+ var container = require('markdown-it-container');
11
+ var core = require('@react-pdf-viewer/core');
12
+ var pageNavigation = require('@react-pdf-viewer/page-navigation');
13
+ var thumbnail = require('@react-pdf-viewer/thumbnail');
14
+ var zoom = require('@react-pdf-viewer/zoom');
15
+ require('@react-pdf-viewer/core/lib/styles/index.css');
16
+ var zh_CN = require('@react-pdf-viewer/locales/lib/zh_CN.json');
17
+ require('@react-pdf-viewer/page-navigation/lib/styles/index.css');
18
+ var dayjs = require('dayjs');
19
+ var relativeTime = require('dayjs/plugin/relativeTime');
20
+ var AES = require('crypto-js/aes');
21
+ var encUtf8 = require('crypto-js/enc-utf8');
22
+ var Decimal = require('decimal.js');
23
+ var axios = require('axios');
24
+ var lib = require('antd/lib');
25
+ require('@react-pdf-viewer/thumbnail/lib/styles/index.css');
26
+ require('@react-pdf-viewer/zoom/lib/styles/index.css');
27
+ var classNames = require('classnames');
28
+
29
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
30
+
31
+ var parse__default = /*#__PURE__*/_interopDefault(parse);
32
+ var markdownit__default = /*#__PURE__*/_interopDefault(markdownit);
33
+ var container__default = /*#__PURE__*/_interopDefault(container);
34
+ var zh_CN__default = /*#__PURE__*/_interopDefault(zh_CN);
35
+ var dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
36
+ var relativeTime__default = /*#__PURE__*/_interopDefault(relativeTime);
37
+ var AES__default = /*#__PURE__*/_interopDefault(AES);
38
+ var encUtf8__default = /*#__PURE__*/_interopDefault(encUtf8);
39
+ var Decimal__default = /*#__PURE__*/_interopDefault(Decimal);
40
+ var axios__default = /*#__PURE__*/_interopDefault(axios);
41
+ var classNames__default = /*#__PURE__*/_interopDefault(classNames);
42
+
43
+ // src/components/File/styles.module.less
44
+ var styles_module_default = {
45
+ nsPreviewImage: "styles_module_nsPreviewImage",
46
+ nsPreviewPdf: "styles_module_nsPreviewPdf",
47
+ pdfToolbar: "styles_module_pdfToolbar",
48
+ nsPreviewVideo: "styles_module_nsPreviewVideo",
49
+ nsPreviewAudio: "styles_module_nsPreviewAudio"
50
+ };
51
+ var AudioPlayer_default = ({ fileUrl }) => {
52
+ return /* @__PURE__ */ jsxRuntime.jsxs("audio", { controls: true, className: styles_module_default.nsPreviewAudio, children: [
53
+ /* @__PURE__ */ jsxRuntime.jsx("source", { src: fileUrl, type: "audio/mpeg" }),
54
+ "\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301 audio \u6807\u7B7E\u3002"
55
+ ] });
56
+ };
57
+
58
+ // src/utils/theme.ts
59
+ var getPrimaryColor = () => {
60
+ const searchParams = new URLSearchParams(location.search);
61
+ const mainSource = searchParams.get("mainSource") || "cube-uc";
62
+ if (mainSource === "cube-uc") {
63
+ return "#34AFBE";
64
+ } else if (mainSource === "uc") {
65
+ return "#FA541C";
66
+ }
67
+ };
68
+ var LgPrimaryColor = getPrimaryColor();
69
+ var themeConfig = {
70
+ token: { colorPrimary: LgPrimaryColor, colorLink: LgPrimaryColor },
71
+ cssVar: true
72
+ };
73
+ var FileIcon_default = ({ suffix, fontSize = 22 }) => {
74
+ const styles = { fontSize, color: LgPrimaryColor };
75
+ const Icon = react.useMemo(() => {
76
+ switch (suffix?.toUpperCase()) {
77
+ case "TXT":
78
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FileTextOutlined, {});
79
+ case "PDF":
80
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FilePdfOutlined, {});
81
+ case "DOC":
82
+ case "DOCX":
83
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FileWordOutlined, {});
84
+ case "XLS":
85
+ case "XLSX":
86
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FileExcelOutlined, {});
87
+ case "PPT":
88
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FilePptOutlined, {});
89
+ case "MP4":
90
+ case "MOV":
91
+ case "AVI":
92
+ case "FLV":
93
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.VideoCameraOutlined, {});
94
+ case "MP3":
95
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.NotificationOutlined, {});
96
+ case "JPG":
97
+ case "JPEG":
98
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FileJpgOutlined, {});
99
+ case "PNG":
100
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FileImageOutlined, {});
101
+ case "GIF":
102
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FileGifOutlined, {});
103
+ case "ZIP":
104
+ case "RAR":
105
+ case "7Z":
106
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FileZipOutlined, {});
107
+ case "CATALOG":
108
+ return /* @__PURE__ */ jsxRuntime.jsx("i", { style: styles, className: "iconfont icon-wenjianjia" });
109
+ // 文件夹
110
+ default:
111
+ return /* @__PURE__ */ jsxRuntime.jsx(icons.FileUnknownOutlined, {});
112
+ }
113
+ }, [suffix]);
114
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { style: styles, children: Icon });
115
+ };
116
+ var VideoPlayer_default = ({ fileUrl }) => {
117
+ return /* @__PURE__ */ jsxRuntime.jsxs("video", { controls: true, className: styles_module_default.nsPreviewVideo, children: [
118
+ /* @__PURE__ */ jsxRuntime.jsx("source", { src: fileUrl, type: "video/mp4" }),
119
+ "\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301 video \u6807\u7B7E\u3002"
120
+ ] });
121
+ };
122
+ var baseComponentMap = {
123
+ // renderMarkdown: () => import('@/components/RenderMarkdown')
124
+ };
125
+ var LazyComponent_default = ({ type, customComponents, ...rest }) => {
126
+ const componentMap = react.useMemo(() => {
127
+ return { ...baseComponentMap, ...customComponents };
128
+ }, [customComponents]);
129
+ const LazyComponent = react.useMemo(() => {
130
+ const loader = componentMap[type];
131
+ return loader ? react.lazy(loader) : null;
132
+ }, [type, componentMap]);
133
+ if (!LazyComponent) return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
134
+ "\u672A\u77E5\u7C7B\u578B\uFF1A",
135
+ type
136
+ ] });
137
+ return /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx("div", { children: "\u52A0\u8F7D\u4E2D..." }), children: /* @__PURE__ */ jsxRuntime.jsx(LazyComponent, { ...rest }) });
138
+ };
139
+ var md = markdownit__default.default({ html: true, breaks: true });
140
+ md.renderer.rules.link_open = function(tokens, idx, options, env, self) {
141
+ const token = tokens[idx];
142
+ token.attrPush(["target", "_blank"]);
143
+ return self.renderToken(tokens, idx, options);
144
+ };
145
+ var replaceSpecialCharacter = (str) => {
146
+ return str.replace(/</g, "&lt;").replace(/>/g, "&gt;");
147
+ };
148
+ function parseParams(info) {
149
+ const params = {};
150
+ const regex = /(\w+)\s*=\s*(?:(['"])(.*?)\2|(\S+))/g;
151
+ let match;
152
+ while ((match = regex.exec(info)) !== null) {
153
+ const key = match[1];
154
+ const value = match[3] ?? match[4] ?? "";
155
+ if (key === "data") {
156
+ let obj = {};
157
+ try {
158
+ obj = JSON.parse(value);
159
+ } catch {
160
+ try {
161
+ obj = JSON.parse(jsonrepair.jsonrepair(value));
162
+ } catch {
163
+ obj = {};
164
+ }
165
+ }
166
+ params[key] = replaceSpecialCharacter(JSON.stringify(obj));
167
+ } else {
168
+ params[key] = value;
169
+ }
170
+ }
171
+ return params;
172
+ }
173
+ md.use(container__default.default, "alert", {
174
+ validate: (params) => /^alert/.test(params.trim()),
175
+ render: function(tokens, idx) {
176
+ const token = tokens[idx];
177
+ if (token.nesting === 1) {
178
+ const info = token.info.trim();
179
+ const params = parseParams(info);
180
+ return `<lazy-component ${Object.entries(params).map(([key, value]) => `${key}=${value}`).join(" ")}>`;
181
+ } else {
182
+ return "</lazy-component>";
183
+ }
184
+ }
185
+ });
186
+ function preprocess(content) {
187
+ return content.replace(
188
+ /:::alert([\s\S]*?):::/g,
189
+ // 匹配 :::alert ... :::
190
+ (match, params) => {
191
+ return `
192
+ :::alert ${params.trim()}
193
+ :::
194
+ `;
195
+ }
196
+ );
197
+ }
198
+ function highlightKeywords(html, keywords) {
199
+ const escaped = keywords.map((k) => k.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
200
+ const regex = new RegExp(`(${escaped.join("|")})`, "gi");
201
+ return html.replace(regex, '<span class="cube-hl">$1</span>');
202
+ }
203
+ var RenderMarkdown_default = ({ content = "", searchValue, customComponents, onChange, onPartialChange }) => {
204
+ const reactContent = react.useMemo(() => {
205
+ if (!content) return null;
206
+ let fixedContent = content;
207
+ const openCount = (fixedContent.match(/:::alert\b/g) || []).length;
208
+ const closeCount = (fixedContent.match(/\s*:::\s*/gm) || []).length - openCount;
209
+ let incomplete = false;
210
+ if (openCount > closeCount) {
211
+ incomplete = true;
212
+ fixedContent += ":::";
213
+ }
214
+ fixedContent = preprocess(fixedContent);
215
+ let rawHtml = md.render(fixedContent);
216
+ rawHtml = searchValue ? highlightKeywords(rawHtml, [searchValue]) : rawHtml;
217
+ let lazyIndex = -1;
218
+ const allLazyMatches = [...rawHtml.matchAll(/<lazy-component/gi)];
219
+ const lastLazyIndex = allLazyMatches.length - 1;
220
+ return parse__default.default(rawHtml, {
221
+ replace: (domNode) => {
222
+ if (domNode.name === "lazy-component") {
223
+ lazyIndex++;
224
+ const el = domNode;
225
+ const type = el.attribs.type;
226
+ const data = JSON.parse(el.attribs.data || "{}");
227
+ const loading = incomplete && lazyIndex === lastLazyIndex;
228
+ return /* @__PURE__ */ jsxRuntime.jsx(
229
+ LazyComponent_default,
230
+ {
231
+ type,
232
+ data,
233
+ loading,
234
+ customComponents,
235
+ onChange,
236
+ onPartialChange
237
+ },
238
+ `${type}${lazyIndex}`
239
+ );
240
+ }
241
+ }
242
+ });
243
+ }, [content, searchValue]);
244
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ns-markdown", children: reactContent });
245
+ };
246
+ var MarkdownPreview_default = ({ fileUrl, searchValue }) => {
247
+ const [content, setContent] = react.useState("");
248
+ const [error, setError] = react.useState("");
249
+ const fetchMarkdown = async () => {
250
+ const res = await fetch(fileUrl);
251
+ if (res.status !== 200) {
252
+ throw new Error(`\u8BF7\u6C42\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${res.status}`);
253
+ }
254
+ const markdownText = await res.text();
255
+ if (!markdownText) {
256
+ throw new Error("\u8FD4\u56DE\u5185\u5BB9\u4E3A\u7A7A");
257
+ }
258
+ setContent(markdownText);
259
+ };
260
+ const init = async () => {
261
+ setContent("");
262
+ setError("");
263
+ if (fileUrl) {
264
+ try {
265
+ await fetchMarkdown();
266
+ } catch (error2) {
267
+ setError("\u52A0\u8F7D\u6216\u89E3\u6790 Markdown \u5931\u8D25");
268
+ }
269
+ }
270
+ };
271
+ react.useEffect(() => {
272
+ init();
273
+ }, [fileUrl]);
274
+ return error ? /* @__PURE__ */ jsxRuntime.jsx(antd.Result, { status: "error", title: error }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "height-full", children: /* @__PURE__ */ jsxRuntime.jsx(RenderMarkdown_default, { content, searchValue }) });
275
+ };
276
+ function createValtioContext() {
277
+ const Context = react.createContext(null);
278
+ const ValtioProvider = ({ store, children }) => /* @__PURE__ */ jsxRuntime.jsx(Context.Provider, { value: store, children });
279
+ const useValtioStore = () => {
280
+ const store = react.useContext(Context);
281
+ if (!store) throw new Error("useStore must be used within Provider");
282
+ return store;
283
+ };
284
+ return {
285
+ ValtioProvider,
286
+ useValtioStore
287
+ // Context
288
+ };
289
+ }
290
+
291
+ // src/hooks/iframe/iframeRelay.ts
292
+ function emit(type, data, to = "top") {
293
+ const payload = { type, data, to };
294
+ try {
295
+ window.parent.postMessage(payload, "*");
296
+ } catch (err) {
297
+ console.warn("emit parent failed", err);
298
+ }
299
+ }
300
+ function emitToChild(iframeWindow, type, data, origin = "*") {
301
+ if (!iframeWindow) {
302
+ console.warn("emitToChild failed: iframeWindow is null");
303
+ return;
304
+ }
305
+ const payload = { type, data, to: "child" };
306
+ try {
307
+ iframeWindow.postMessage(payload, origin);
308
+ } catch (err) {
309
+ console.warn("emit to child failed", err);
310
+ }
311
+ }
312
+
313
+ // src/utils/is.ts
314
+ var toString = Object.prototype.toString;
315
+ function is(val, type) {
316
+ return toString.call(val) === `[object ${type}]`;
317
+ }
318
+ function isUnDef(val) {
319
+ return is(val, "Undefined");
320
+ }
321
+ function isDef(val) {
322
+ return !isUnDef(val);
323
+ }
324
+ function isObject(val) {
325
+ return is(val, "Object");
326
+ }
327
+ function isEmptyObj(val) {
328
+ if (isObject(val)) {
329
+ return Object.keys(val).length === 0;
330
+ }
331
+ return false;
332
+ }
333
+ function isDate(val) {
334
+ return is(val, "Date");
335
+ }
336
+ function isNull(val) {
337
+ return is(val, "Null");
338
+ }
339
+ function isNullOrUnDef(val) {
340
+ return isUnDef(val) || isNull(val);
341
+ }
342
+ function isNumber(val) {
343
+ return is(val, "Number");
344
+ }
345
+ function isNumberNoNaN(val) {
346
+ return is(val, "Number") && !isNaN(val);
347
+ }
348
+ function isString(val) {
349
+ return is(val, "String");
350
+ }
351
+ function isFunction(val) {
352
+ return is(val, "Function");
353
+ }
354
+ function isPromise(val) {
355
+ return is(val, "Promise") && isObject(val) && isFunction(val.then) && isFunction(val.catch);
356
+ }
357
+ function isBoolean(val) {
358
+ return is(val, "Boolean");
359
+ }
360
+ function isRegExp(val) {
361
+ return is(val, "RegExp");
362
+ }
363
+ function isArray(val) {
364
+ return Array.isArray(val);
365
+ }
366
+ function isEmpty(val) {
367
+ if (isArray(val) || isString(val)) {
368
+ return val.length === 0;
369
+ }
370
+ if (isNullOrUnDef(val)) {
371
+ return true;
372
+ }
373
+ if (val instanceof Map || val instanceof Set) {
374
+ return val.size === 0;
375
+ }
376
+ return isEmptyObj(val);
377
+ }
378
+ function isWindow(val) {
379
+ return typeof window !== "undefined" && is(val, "Window");
380
+ }
381
+ function isElement(val) {
382
+ return isObject(val) && !!val.tagName;
383
+ }
384
+ function isMap(val) {
385
+ return is(val, "Map");
386
+ }
387
+ var isServer = typeof window === "undefined";
388
+ var isClient = !isServer;
389
+ var isExternal = (path) => {
390
+ return /^(https?:|mailto:|tel:)/.test(path);
391
+ };
392
+ var isBlob = (val) => {
393
+ return is(val, "Blob");
394
+ };
395
+
396
+ // src/hooks/iframe/useIframeRelayBridge.ts
397
+ function useIframeRelayBridge(allowedOrigins = ["*"]) {
398
+ const handlers = react.useRef({});
399
+ react.useEffect(() => {
400
+ const onMessage = (evt) => {
401
+ const { data, source, origin } = evt;
402
+ if (!data || !isObject(data) || !data.type) return;
403
+ if (allowedOrigins[0] !== "*" && !allowedOrigins.includes(origin)) return;
404
+ const { type, data: params, to = "parent" } = data;
405
+ const isTop = window.parent === window;
406
+ if (to === "top" && !isTop) {
407
+ window.parent.postMessage(data, allowedOrigins[0] === "*" ? "*" : origin);
408
+ return;
409
+ }
410
+ const fns = handlers.current[type] || [];
411
+ fns.forEach((fn) => fn(params, source, origin));
412
+ };
413
+ window.addEventListener("message", onMessage);
414
+ return () => window.removeEventListener("message", onMessage);
415
+ }, [allowedOrigins]);
416
+ function on(type, handler) {
417
+ handlers.current[type] = handlers.current[type] || [];
418
+ handlers.current[type].push(handler);
419
+ }
420
+ function off(type, handler) {
421
+ handlers.current[type] = (handlers.current[type] || []).filter((fn) => fn !== handler);
422
+ }
423
+ return { on, off };
424
+ }
425
+ function useDebounce(func, wait = 400) {
426
+ const { current } = react.useRef({ func, timeOut: null });
427
+ react.useEffect(() => {
428
+ current.func = func;
429
+ }, [func]);
430
+ let args;
431
+ function debounce(..._args) {
432
+ args = _args;
433
+ if (current.timeOut) {
434
+ clearTimeout(current.timeOut);
435
+ current.timeOut = null;
436
+ }
437
+ return new Promise((resolve, reject) => {
438
+ current.timeOut = setTimeout(async () => {
439
+ try {
440
+ const result = await current.func.apply(null, args);
441
+ resolve(result);
442
+ } catch (e) {
443
+ reject(e);
444
+ }
445
+ }, wait);
446
+ });
447
+ }
448
+ function cancel() {
449
+ if (!current.timeOut) return;
450
+ clearTimeout(current.timeOut);
451
+ current.timeOut = null;
452
+ }
453
+ function flush() {
454
+ cancel();
455
+ return current.func.apply(null, args);
456
+ }
457
+ debounce.flush = flush;
458
+ debounce.cancel = cancel;
459
+ return react.useCallback(debounce, []);
460
+ }
461
+
462
+ // src/utils/common.ts
463
+ var deepCopy = (obj, isJson = true) => {
464
+ if (!isArray(obj) && !isObject(obj)) return obj;
465
+ if (isJson) return JSON.parse(JSON.stringify(obj));
466
+ const result = isArray(obj) ? [] : {};
467
+ for (const key in obj) {
468
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
469
+ result[key] = deepCopy(obj[key], isJson);
470
+ }
471
+ }
472
+ return result;
473
+ };
474
+ function deepEqual(a, b) {
475
+ if (Object.is(a, b)) return true;
476
+ if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
477
+ if (a instanceof RegExp && b instanceof RegExp) return a.toString() === b.toString();
478
+ if (a instanceof Map && b instanceof Map) {
479
+ if (a.size !== b.size) return false;
480
+ for (const [key, val] of a.entries()) {
481
+ if (!b.has(key) || !deepEqual(val, b.get(key))) return false;
482
+ }
483
+ return true;
484
+ }
485
+ if (a instanceof Set && b instanceof Set) {
486
+ if (a.size !== b.size) return false;
487
+ for (const val of a.values()) {
488
+ if (!b.has(val)) return false;
489
+ }
490
+ return true;
491
+ }
492
+ if (Array.isArray(a) && Array.isArray(b)) {
493
+ if (a.length !== b.length) return false;
494
+ return a.every((item, i) => deepEqual(item, b[i]));
495
+ }
496
+ if (typeof a === "function" && typeof b === "function") return a.toString() === b.toString();
497
+ if (isObject(a) && isObject(b)) {
498
+ const keysA = Object.keys(a);
499
+ const keysB = Object.keys(b);
500
+ if (keysA.length !== keysB.length) return false;
501
+ for (const key of keysA) {
502
+ if (!deepEqual(a[key], b[key])) return false;
503
+ }
504
+ return true;
505
+ }
506
+ return false;
507
+ }
508
+ var deepMerge = (base, override) => {
509
+ const result = { ...base };
510
+ Object.keys(override || {}).forEach((key) => {
511
+ const baseValue = base[key];
512
+ const overrideValue = override[key];
513
+ if (typeof baseValue === "object" && baseValue !== null && !isArray(baseValue) && typeof overrideValue === "object" && overrideValue !== null && !isArray(overrideValue)) {
514
+ result[key] = deepMerge(baseValue, overrideValue);
515
+ } else if (overrideValue !== void 0) {
516
+ result[key] = overrideValue;
517
+ }
518
+ });
519
+ return result;
520
+ };
521
+ var objToOptions = (obj) => {
522
+ return Object.keys(obj).map((key) => ({
523
+ label: obj[key],
524
+ value: Number(key)
525
+ }));
526
+ };
527
+ var arrToObj = (arr = [], key) => {
528
+ const obj = {};
529
+ arr?.forEach((item) => {
530
+ obj[item[key]] = item;
531
+ });
532
+ return obj;
533
+ };
534
+ var nsSetInterval = (fn, t) => {
535
+ let timer = null;
536
+ let isCancelled = false;
537
+ const interval = () => {
538
+ timer = setTimeout(async () => {
539
+ if (isCancelled) {
540
+ return;
541
+ }
542
+ await fn();
543
+ if (!isCancelled) {
544
+ interval();
545
+ }
546
+ }, t);
547
+ };
548
+ interval();
549
+ return {
550
+ isRun: () => !!timer,
551
+ cancel: () => {
552
+ isCancelled = true;
553
+ if (timer) {
554
+ clearTimeout(timer);
555
+ timer = null;
556
+ }
557
+ }
558
+ };
559
+ };
560
+ var genNonDuplicateID = () => {
561
+ let idStr = Date.now().toString(36);
562
+ idStr += Math.random().toString(36).substr(2);
563
+ return idStr;
564
+ };
565
+ var copyText = (text) => {
566
+ if (navigator.clipboard && window.isSecureContext) {
567
+ return navigator.clipboard.writeText(text);
568
+ } else {
569
+ const textArea = document.createElement("textarea");
570
+ textArea.value = text;
571
+ textArea.style.position = "absolute";
572
+ textArea.style.opacity = "0";
573
+ textArea.style.left = "-999999px";
574
+ textArea.style.top = "-999999px";
575
+ document.body.appendChild(textArea);
576
+ textArea.focus();
577
+ textArea.select();
578
+ return new Promise((res, rej) => {
579
+ document.execCommand("copy") ? res() : rej();
580
+ textArea.remove();
581
+ });
582
+ }
583
+ };
584
+ function formatNumberWithCommas(number) {
585
+ const numericValue = parseFloat(number);
586
+ if (!isNaN(numericValue)) {
587
+ return numericValue.toLocaleString();
588
+ }
589
+ return number;
590
+ }
591
+ var generateRandomNumbers = (min, max, count) => {
592
+ const randomNumbers = /* @__PURE__ */ new Set();
593
+ while (randomNumbers.size < count) {
594
+ const randomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
595
+ randomNumbers.add(randomNumber);
596
+ }
597
+ return Array.from(randomNumbers);
598
+ };
599
+ var getFileName = (filePath) => {
600
+ return filePath.split("?")[0].split("/").pop() || "";
601
+ };
602
+ var textAreaView = (con) => {
603
+ return con ? con.replace(/\r\n/g, "\n").replace(/\n/g, "<br/>") : "";
604
+ };
605
+ var buildUrlParams = (obj, url) => {
606
+ const params = Object.entries(obj).filter(([, value]) => !isNullOrUnDef(value)).map(([key, value]) => {
607
+ if (isArray(value)) {
608
+ return value.filter((v) => !isNullOrUnDef(v)).map((v) => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`).join("&");
609
+ }
610
+ return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
611
+ }).join("&");
612
+ if (url) {
613
+ const separator = url.includes("?") ? "&" : "?";
614
+ return `${url}${separator}${params}`;
615
+ }
616
+ return params;
617
+ };
618
+ var downloadFile = (url, name) => {
619
+ const a = document.createElement("a");
620
+ a.download = name || "\u56FE\u7247\u4E0B\u8F7D";
621
+ a.href = url;
622
+ document.body.appendChild(a);
623
+ a.click();
624
+ document.body.removeChild(a);
625
+ };
626
+ var addUrlLastSlash = (url = "") => {
627
+ const u = new URL(url, "https://logosdata.cn");
628
+ let pathname = u.pathname;
629
+ if (!pathname.endsWith("/")) {
630
+ pathname += "/";
631
+ }
632
+ u.pathname = pathname;
633
+ return `${isExternal(url) ? u.origin : ""}${u.pathname}${u.search}${u.hash}`;
634
+ };
635
+ var getUrlMainSource = (url, preHref) => {
636
+ if (!preHref) return url;
637
+ let newUrl = "";
638
+ const preHrefUrl = new URL(preHref);
639
+ const urlParts = url.split("?");
640
+ const srcParams = new URLSearchParams(urlParts[1] || "");
641
+ if (srcParams.has("mainSource")) {
642
+ newUrl = url;
643
+ } else {
644
+ const mainSource = preHrefUrl.searchParams.get("mainSource");
645
+ if (mainSource) {
646
+ newUrl = buildUrlParams({ mainSource }, url);
647
+ } else {
648
+ newUrl = url;
649
+ }
650
+ }
651
+ return newUrl;
652
+ };
653
+ var getWebSocketUrl = (path, customHost) => {
654
+ const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
655
+ const host = customHost || window.location.host;
656
+ return `${protocol}//${host}${path}`;
657
+ };
658
+
659
+ // src/hooks/useDeepEffect.ts
660
+ function useDeepEffect(effect, deps) {
661
+ const prevDepsRef = react.useRef();
662
+ const depsChanged = !prevDepsRef.current || deps.length !== prevDepsRef.current.length || deps.some((dep, i) => !deepEqual(dep, prevDepsRef.current[i]));
663
+ react.useEffect(() => {
664
+ if (depsChanged) {
665
+ prevDepsRef.current = deps;
666
+ return effect();
667
+ }
668
+ }, [depsChanged]);
669
+ }
670
+ function useRefState(init) {
671
+ const [state, setState] = react.useState(init);
672
+ const stateRef = react.useRef(init);
673
+ const setProxy = (newVal) => {
674
+ stateRef.current = newVal;
675
+ setState(newVal);
676
+ };
677
+ const getState = () => stateRef.current;
678
+ return [state, setProxy, getState];
679
+ }
680
+ var useSyncInput = (storeValue, setStoreValue) => {
681
+ const [inputValue, setInputValue] = react.useState(storeValue);
682
+ react.useEffect(() => {
683
+ if (storeValue !== inputValue) {
684
+ setInputValue(storeValue);
685
+ }
686
+ }, [storeValue]);
687
+ const handleValueChange = (value) => {
688
+ setStoreValue(value);
689
+ setInputValue(value);
690
+ };
691
+ return {
692
+ inputValue,
693
+ setInputValue: handleValueChange
694
+ };
695
+ };
696
+ function useThrottle(func, wait) {
697
+ const { current } = react.useRef({ func, timeOut: null });
698
+ react.useEffect(() => {
699
+ current.func = func;
700
+ }, [func]);
701
+ let args;
702
+ function throttle(..._args) {
703
+ args = _args;
704
+ return new Promise((resolve, reject) => {
705
+ if (!current.timeOut) {
706
+ try {
707
+ const result = current.func.apply(null, args);
708
+ resolve(result);
709
+ } catch (e) {
710
+ reject(e);
711
+ }
712
+ current.timeOut = setTimeout(() => {
713
+ current.timeOut = null;
714
+ }, wait);
715
+ }
716
+ });
717
+ }
718
+ function cancel() {
719
+ if (!current.timeOut) return;
720
+ clearTimeout(current.timeOut);
721
+ current.timeOut = null;
722
+ }
723
+ function flush() {
724
+ cancel();
725
+ return current.func.apply(null, args);
726
+ }
727
+ throttle.flush = flush;
728
+ throttle.cancel = cancel;
729
+ return react.useCallback(throttle, []);
730
+ }
731
+ dayjs__default.default.extend(relativeTime__default.default);
732
+ var DateFormatType = "YYYY-MM-DD HH:mm:ss";
733
+ var DateFormatType2 = "YYYY-MM-DD";
734
+ var UNIT = "date";
735
+ var getStartOfTimestamp = (date, unit = UNIT) => {
736
+ return dayjs__default.default(date).startOf(unit).valueOf();
737
+ };
738
+ var getEndOfTimestamp = (date, unit = UNIT) => {
739
+ return dayjs__default.default(date).endOf(unit).valueOf();
740
+ };
741
+ var formatDate = (date, fmt = DateFormatType) => {
742
+ if (date) {
743
+ return dayjs__default.default(date).format(fmt);
744
+ }
745
+ return "";
746
+ };
747
+ var getTimestamp = (date) => {
748
+ return dayjs__default.default(date).valueOf();
749
+ };
750
+ var isExpire = (date) => {
751
+ return dayjs__default.default(date).isBefore(getStartOfTimestamp());
752
+ };
753
+ var USER_KEY = "NS-USER";
754
+ function setCurrentUser(userInfo) {
755
+ const cipherText = AES__default.default.encrypt(JSON.stringify(userInfo), "((#II))").toString();
756
+ sessionStorage.setItem(USER_KEY, cipherText);
757
+ }
758
+ function getCurrentUser() {
759
+ const userInfoJson = sessionStorage.getItem(USER_KEY);
760
+ if (userInfoJson) {
761
+ const bytes = AES__default.default.decrypt(userInfoJson, "((#II))");
762
+ const originalText = bytes.toString(encUtf8__default.default);
763
+ return JSON.parse(originalText);
764
+ }
765
+ return null;
766
+ }
767
+ function clearCurrentUser() {
768
+ sessionStorage.removeItem(USER_KEY);
769
+ }
770
+ var DEVICEID_KEY = "NS-DEVICE-ID";
771
+ function getDeviceId() {
772
+ let deviceId = localStorage.getItem(DEVICEID_KEY);
773
+ if (deviceId) {
774
+ return deviceId;
775
+ }
776
+ deviceId = genNonDuplicateID();
777
+ localStorage.setItem(DEVICEID_KEY, deviceId);
778
+ return deviceId;
779
+ }
780
+ var OperatorToMethodName = {
781
+ "+": "plus",
782
+ "-": "minus",
783
+ "*": "times",
784
+ "/": "dividedBy"
785
+ };
786
+ var calculate = (operator, ...args) => {
787
+ if (args.length === 0) return "0";
788
+ const [arg, ...newArgs] = args;
789
+ return newArgs.reduce((acc, val) => acc[OperatorToMethodName[operator]](new Decimal__default.default(val)), new Decimal__default.default(arg)).toString();
790
+ };
791
+ var plus = (...args) => calculate("+", ...args);
792
+ var minus = (...args) => calculate("-", ...args);
793
+ var times = (...args) => calculate("*", ...args);
794
+ var dividedBy = (...args) => calculate("/", ...args);
795
+ var decimalPlaces = (arg1) => {
796
+ return new Decimal__default.default(arg1).decimalPlaces();
797
+ };
798
+ var precision = (arg1) => {
799
+ return new Decimal__default.default(arg1).precision(true);
800
+ };
801
+ var absVal = (arg1) => new Decimal__default.default(arg1).abs().toString();
802
+ var compareNum = (arg1, arg2, type) => {
803
+ const x = new Decimal__default.default(arg1);
804
+ const y = new Decimal__default.default(arg2);
805
+ switch (type) {
806
+ case ">":
807
+ return x.greaterThan(y);
808
+ case ">=":
809
+ return x.greaterThanOrEqualTo(y);
810
+ case "<":
811
+ return x.lessThan(y);
812
+ case "<=":
813
+ return x.lessThanOrEqualTo(y);
814
+ case "==":
815
+ return x.equals(y);
816
+ }
817
+ };
818
+ var toFixed = (num, decimals = 2, fill = true) => {
819
+ const x = new Decimal__default.default(num);
820
+ if (fill) {
821
+ return x.toFixed(decimals, Decimal__default.default.ROUND_HALF_UP);
822
+ } else {
823
+ return x.toDecimalPlaces(decimals, Decimal__default.default.ROUND_HALF_UP).toString();
824
+ }
825
+ };
826
+ var isInteger = (num) => {
827
+ return new Decimal__default.default(num).isInteger();
828
+ };
829
+ var isNegative = (num) => {
830
+ return new Decimal__default.default(num).isNegative();
831
+ };
832
+ var cacheMessage = () => {
833
+ const contents = {};
834
+ return ({ title = "\u63D0\u793A", content, type = "warning", duration = 3, onClose, isCache = true, isOnly = false }) => {
835
+ if (!content) return;
836
+ const key = isOnly ? "cache-key" : content;
837
+ const onClose2 = () => {
838
+ delete contents[key];
839
+ onClose?.();
840
+ };
841
+ if (isCache && contents[key]) ; else {
842
+ if (isCache) {
843
+ contents[key] = getTimestamp();
844
+ }
845
+ if (duration) {
846
+ if (content.length > 30) {
847
+ antd.notification[type]({
848
+ message: title,
849
+ description: content,
850
+ placement: "top",
851
+ duration,
852
+ onClose: onClose2
853
+ });
854
+ } else {
855
+ lib.message[type]({
856
+ content,
857
+ duration,
858
+ onClose: onClose2
859
+ });
860
+ }
861
+ } else {
862
+ antd.Modal[type]({
863
+ title,
864
+ content,
865
+ okButtonProps: { style: { background: LgPrimaryColor, outline: "none" } },
866
+ afterClose: onClose2
867
+ });
868
+ }
869
+ }
870
+ };
871
+ };
872
+ var showMessage = cacheMessage();
873
+
874
+ // src/utils/session.ts
875
+ var TOKEN_KEY = "NS-TOKEN";
876
+ function setToken(accessToken) {
877
+ localStorage.setItem(TOKEN_KEY, accessToken);
878
+ }
879
+ function getUrlToken() {
880
+ const searchParams = new URLSearchParams(location.search);
881
+ const token = searchParams.get(TOKEN_KEY);
882
+ return token || "";
883
+ }
884
+ function getToken() {
885
+ const token = getUrlToken();
886
+ if (!token) {
887
+ const token2 = localStorage.getItem(TOKEN_KEY);
888
+ return token2 || "";
889
+ } else {
890
+ setToken(token);
891
+ return token;
892
+ }
893
+ }
894
+ function clearToken() {
895
+ localStorage.removeItem(TOKEN_KEY);
896
+ }
897
+ var SIGNPATH = "SIGNPATH";
898
+ function getSignPath() {
899
+ const path = localStorage.getItem(SIGNPATH);
900
+ return `${path || "/sign-in"}`;
901
+ }
902
+
903
+ // src/utils/request.ts
904
+ var OK = 200;
905
+ var OK2 = "S0000";
906
+ var ERROR = 500;
907
+ var MISSING_PARAMETER = 400;
908
+ var UNAUTHORIZED = 401;
909
+ var FORBIDDEN = 403;
910
+ var NOT_FOUND = 404;
911
+ var ILLEGAL_PARAMETER = 901;
912
+ var PERMISSION_DENIED = 13001;
913
+ var LoginPastCode = 11200;
914
+ var FacePastCode = 11201;
915
+ var formType = "form";
916
+ var jsonType = "json";
917
+ var parseOptions = (options) => {
918
+ const headers = {};
919
+ if (options?.reqType && options.reqType === formType) {
920
+ headers["Content-Type"] = "application/x-www-form-urlencoded";
921
+ }
922
+ return { headers, ...options };
923
+ };
924
+ var redirectUrl = () => {
925
+ emit("jumpLink", { url: `/uc${getSignPath()}` });
926
+ };
927
+ axios__default.default.interceptors.request.use(
928
+ function(config) {
929
+ config.headers[TOKEN_KEY] = getToken();
930
+ if (config.url && !config.url.startsWith("/api/")) {
931
+ config.baseURL = "/api";
932
+ }
933
+ config.timeout = config.timeout || 6e4;
934
+ return config;
935
+ },
936
+ function(error) {
937
+ return Promise.reject(error);
938
+ }
939
+ );
940
+ axios__default.default.interceptors.response.use(
941
+ function(response) {
942
+ if (response.data?.code !== OK && response.data?.code !== OK2) {
943
+ const isPermission = response.data?.code === PERMISSION_DENIED;
944
+ if (response.config?.showError !== false) {
945
+ showMessage({
946
+ title: isPermission ? "" : void 0,
947
+ content: response.data.message,
948
+ duration: isPermission ? 0 : 3
949
+ });
950
+ }
951
+ return Promise.reject(response.data);
952
+ }
953
+ return response;
954
+ },
955
+ function(err) {
956
+ const showError = err?.config?.showError !== false;
957
+ if (!err.response) {
958
+ if (showError) showMessage({ content: "\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC", type: "error" });
959
+ } else {
960
+ switch (err.response?.status) {
961
+ case UNAUTHORIZED:
962
+ if (showError) showMessage({ content: err.response?.data.message, type: "error" });
963
+ redirectUrl();
964
+ break;
965
+ case FORBIDDEN:
966
+ case NOT_FOUND:
967
+ case ERROR:
968
+ case MISSING_PARAMETER:
969
+ case ILLEGAL_PARAMETER:
970
+ if (showError) showMessage({ content: err.response?.data.message, type: "error" });
971
+ break;
972
+ default:
973
+ if (showError) showMessage({ content: "\u8BF7\u6C42\u6570\u636E\u53D1\u751F\u9519\u8BEF\uFF01", type: "info" });
974
+ }
975
+ }
976
+ return Promise.reject(err);
977
+ }
978
+ );
979
+ var get = async (url, params, options) => {
980
+ const res = await axios__default.default({ method: "get", url, params, ...options });
981
+ return res.data;
982
+ };
983
+ var post = async (url, data, options) => {
984
+ const res = await axios__default.default({
985
+ method: "post",
986
+ url,
987
+ data,
988
+ ...parseOptions(options)
989
+ });
990
+ return res.data;
991
+ };
992
+ var put = async (url, data, options) => {
993
+ const res = await axios__default.default({ method: "put", url, data, ...parseOptions(options) });
994
+ return res.data;
995
+ };
996
+ var del = async (url, data, options) => {
997
+ const reqConfig = {
998
+ method: "delete",
999
+ url,
1000
+ ...parseOptions(options)
1001
+ };
1002
+ const params = options?.reqType === formType ? { params: data } : { data };
1003
+ const res = await axios__default.default({ ...reqConfig, ...params });
1004
+ return res.data;
1005
+ };
1006
+ var request_default = {
1007
+ get,
1008
+ post,
1009
+ put,
1010
+ delete: del
1011
+ };
1012
+
1013
+ // src/hooks/useWebSocket.ts
1014
+ var useWebSocket = ({
1015
+ url,
1016
+ onMessage,
1017
+ onClose,
1018
+ heartbeatInterval = 3e4,
1019
+ heartbeatMessage = "ping",
1020
+ clientHeartbeat = true,
1021
+ reconnectInterval = 5e3,
1022
+ // 默认重连间隔为 5 秒
1023
+ maxReconnectAttempts,
1024
+ // 不设置默认值为无限重连
1025
+ isReconnect = true
1026
+ // 默认开启重连机制
1027
+ }) => {
1028
+ const socketRef = react.useRef(null);
1029
+ const heartbeatIntervalRef = react.useRef(null);
1030
+ const [socketReadyState, setSocketReadyState] = react.useState(null);
1031
+ const reconnectIntervalRef = react.useRef(null);
1032
+ const reconnectAttempts = react.useRef(0);
1033
+ const documentHide = react.useRef(document.visibilityState === "hidden");
1034
+ const isDestroy = react.useRef(false);
1035
+ const onMessageEctype = react.useCallback(onMessage, [onMessage]);
1036
+ const startHeartbeat = (currentSocket) => {
1037
+ if (!clientHeartbeat) {
1038
+ return;
1039
+ }
1040
+ const intervalId = setInterval(() => {
1041
+ if (currentSocket.readyState === WebSocket.OPEN) {
1042
+ currentSocket.send(heartbeatMessage);
1043
+ }
1044
+ }, heartbeatInterval);
1045
+ heartbeatIntervalRef.current = intervalId;
1046
+ };
1047
+ const stopHeartbeat = () => {
1048
+ if (heartbeatIntervalRef.current) {
1049
+ clearInterval(heartbeatIntervalRef.current);
1050
+ }
1051
+ };
1052
+ const stopReconnectTimer = () => {
1053
+ if (reconnectIntervalRef.current) {
1054
+ clearTimeout(reconnectIntervalRef.current);
1055
+ reconnectIntervalRef.current = null;
1056
+ }
1057
+ };
1058
+ const tryReconnect = () => {
1059
+ if (isDestroy.current) return;
1060
+ if (isReconnect && !documentHide.current) {
1061
+ if ((!isNumber(maxReconnectAttempts) || reconnectAttempts.current < maxReconnectAttempts) && isNullOrUnDef(reconnectIntervalRef.current)) {
1062
+ reconnectIntervalRef.current = setTimeout(() => {
1063
+ console.log(`\u5C1D\u8BD5\u7B2C ${reconnectAttempts.current + 1} \u6B21\u91CD\u8FDE...`, url);
1064
+ reconnectAttempts.current = reconnectAttempts.current + 1;
1065
+ createAndListenWebSocket();
1066
+ stopReconnectTimer();
1067
+ }, reconnectInterval);
1068
+ } else {
1069
+ if (isNumber(maxReconnectAttempts)) {
1070
+ console.log("\u8FBE\u5230\u6700\u5927\u91CD\u8FDE\u5C1D\u8BD5\u6B21\u6570\uFF0C\u505C\u6B62\u91CD\u8FDE");
1071
+ }
1072
+ }
1073
+ }
1074
+ };
1075
+ const handleOpen = (newSocket) => {
1076
+ console.log("WebSocket \u8FDE\u63A5\u5DF2\u6253\u5F00");
1077
+ setSocketReadyState(newSocket.readyState);
1078
+ startHeartbeat(newSocket);
1079
+ reconnectAttempts.current = 0;
1080
+ };
1081
+ const handleMessage = (event) => {
1082
+ if (isString(event.data)) {
1083
+ try {
1084
+ const parsedData = JSON.parse(event.data);
1085
+ onMessageEctype?.(parsedData);
1086
+ stopHeartbeat();
1087
+ startHeartbeat(socketRef.current);
1088
+ } catch (error) {
1089
+ console.error("\u89E3\u6790\u6D88\u606F\u6570\u636E\u65F6\u51FA\u9519:", error);
1090
+ }
1091
+ }
1092
+ };
1093
+ const handleClose = (event) => {
1094
+ console.log("WebSocket \u8FDE\u63A5\u5DF2\u5173\u95ED", event.code, event.reason);
1095
+ setSocketReadyState(event.code);
1096
+ stopHeartbeat();
1097
+ onClose?.();
1098
+ tryReconnect();
1099
+ };
1100
+ const handleError = (error) => {
1101
+ console.error("WebSocket \u53D1\u751F\u9519\u8BEF:", error);
1102
+ setSocketReadyState(null);
1103
+ stopHeartbeat();
1104
+ tryReconnect();
1105
+ };
1106
+ const createAndListenWebSocket = () => {
1107
+ const newSocket = new WebSocket(url);
1108
+ socketRef.current = newSocket;
1109
+ setSocketReadyState(newSocket.readyState);
1110
+ newSocket.onopen = () => handleOpen(newSocket);
1111
+ newSocket.onmessage = handleMessage;
1112
+ newSocket.onclose = handleClose;
1113
+ newSocket.onerror = handleError;
1114
+ };
1115
+ const handleVisibilityChange = () => {
1116
+ documentHide.current = document.visibilityState === "hidden";
1117
+ if (socketRef.current?.readyState !== WebSocket.OPEN) {
1118
+ tryReconnect();
1119
+ }
1120
+ };
1121
+ react.useEffect(() => {
1122
+ isDestroy.current = false;
1123
+ createAndListenWebSocket();
1124
+ window.addEventListener("visibilitychange", handleVisibilityChange);
1125
+ return () => {
1126
+ window.removeEventListener("visibilitychange", handleVisibilityChange);
1127
+ isDestroy.current = true;
1128
+ if (socketRef.current) {
1129
+ socketRef.current.close();
1130
+ return;
1131
+ }
1132
+ stopHeartbeat();
1133
+ stopReconnectTimer();
1134
+ };
1135
+ }, [url]);
1136
+ const sendMessage = (message2) => {
1137
+ if (socketRef.current?.readyState === WebSocket.OPEN) {
1138
+ socketRef.current.send(message2);
1139
+ stopHeartbeat();
1140
+ startHeartbeat(socketRef.current);
1141
+ }
1142
+ };
1143
+ return {
1144
+ sendMessage,
1145
+ socketReadyState
1146
+ };
1147
+ };
1148
+ var useWebSocket_default = useWebSocket;
1149
+ var ProtectedView = ({
1150
+ passwordStatus,
1151
+ verifyPassword,
1152
+ onVerifyPasswordEnd
1153
+ }) => {
1154
+ const [form] = antd.Form.useForm();
1155
+ const onSubmit = () => {
1156
+ form.validateFields().then((values) => {
1157
+ if (values) {
1158
+ verifyPassword(values.password);
1159
+ onVerifyPasswordEnd(values.password);
1160
+ }
1161
+ });
1162
+ };
1163
+ return /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { justify: "center", align: "center", className: "height-full", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: 300 }, children: [
1164
+ passwordStatus === core.PasswordStatus.WrongPassword && /* @__PURE__ */ jsxRuntime.jsx(antd.Alert, { message: "\u5BC6\u7801\u65E0\u6548\u3002\u8BF7\u518D\u8BD5\u4E00\u6B21\uFF01", type: "error" }),
1165
+ /* @__PURE__ */ jsxRuntime.jsxs(antd.Form, { form, size: "large", className: "m-t-24", children: [
1166
+ /* @__PURE__ */ jsxRuntime.jsx(antd.Form.Item, { name: "password", rules: [{ required: true, message: "\u8BF7\u8F93\u5165\u5BC6\u7801" }], children: /* @__PURE__ */ jsxRuntime.jsx(antd.Input.Password, { autoComplete: "new-password", placeholder: "\u8BF7\u8F93\u5165\u5BC6\u7801" }) }),
1167
+ /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { justify: "center", children: /* @__PURE__ */ jsxRuntime.jsx(antd.Button, { type: "primary", onClick: onSubmit, children: "\u63D0 \u4EA4" }) })
1168
+ ] })
1169
+ ] }) });
1170
+ };
1171
+ var PdfPreview_default = ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumbnails = true, onSetPassword, onSetPageNo }) => {
1172
+ const embedRef = react.useRef(null);
1173
+ const [sizes, setSizes] = react.useState([0]);
1174
+ const [, setDocLoaded, getDocLoaded] = useRefState(false);
1175
+ const [currentPage, setCurrentPage, getCurrentPage] = useRefState(void 0);
1176
+ const [temporaryPassword, setTemporaryPassword] = react.useState("");
1177
+ const jumpToPageNo = react.useRef();
1178
+ const onVerifyPasswordEnd = (password2) => {
1179
+ setTemporaryPassword(password2);
1180
+ };
1181
+ const pageNavigationPluginInstance = pageNavigation.pageNavigationPlugin({ enableShortcuts: true });
1182
+ const thumbnailPluginInstance = thumbnail.thumbnailPlugin({
1183
+ thumbnailWidth: sizes[0] - 70
1184
+ // 不会自适应
1185
+ });
1186
+ const zoomPluginInstance = zoom.zoomPlugin();
1187
+ const { Thumbnails } = thumbnailPluginInstance;
1188
+ const { ZoomIn, ZoomOut } = zoomPluginInstance;
1189
+ const Toolbar = () => /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { gap: 6, align: "center", className: styles_module_default.pdfToolbar, children: [
1190
+ /* @__PURE__ */ jsxRuntime.jsx(ZoomIn, {}),
1191
+ /* @__PURE__ */ jsxRuntime.jsx(ZoomOut, {})
1192
+ ] });
1193
+ const onJumpToPage = (pageNo2) => {
1194
+ if (getDocLoaded()) {
1195
+ if (pageNo2 && pageNo2 - 1 !== getCurrentPage()) {
1196
+ jumpToPageNo.current = pageNo2 - 1;
1197
+ pageNavigationPluginInstance.jumpToPage(jumpToPageNo.current);
1198
+ }
1199
+ }
1200
+ };
1201
+ const handleDocumentLoad = () => {
1202
+ setSizes([400]);
1203
+ setDocLoaded(true);
1204
+ onJumpToPage(pageNo);
1205
+ if (temporaryPassword) {
1206
+ onSetPassword?.(temporaryPassword);
1207
+ setTemporaryPassword("");
1208
+ }
1209
+ };
1210
+ react.useEffect(() => {
1211
+ setCurrentPage(void 0);
1212
+ setDocLoaded(false);
1213
+ setSizes([0]);
1214
+ }, [fileUrl]);
1215
+ react.useEffect(() => {
1216
+ setTimeout(() => {
1217
+ onJumpToPage(pageNo);
1218
+ }, 0);
1219
+ }, [pageNo]);
1220
+ const renderError = (error) => {
1221
+ let message2 = "";
1222
+ switch (error.name) {
1223
+ case "InvalidPDFException":
1224
+ message2 = "\u6587\u4EF6\u65E0\u6548\u6216\u5DF2\u635F\u574F";
1225
+ break;
1226
+ case "MissingPDFException":
1227
+ message2 = "\u6587\u4EF6\u4E0D\u5B58\u5728";
1228
+ break;
1229
+ case "UnexpectedResponseException":
1230
+ message2 = "\u610F\u5916\u7684\u670D\u52A1\u5668\u54CD\u5E94";
1231
+ break;
1232
+ // case 'CMapReaderFactory not initialized':
1233
+ // message = '字体映射文件加载失败,请刷新页面重试'
1234
+ // break
1235
+ default:
1236
+ message2 = "\u65E0\u6CD5\u52A0\u8F7D\u6587\u6863";
1237
+ break;
1238
+ }
1239
+ return /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { className: "height-full", justify: "center", align: "center", children: /* @__PURE__ */ jsxRuntime.jsx(antd.Alert, { message: message2, type: "error", showIcon: true }) });
1240
+ };
1241
+ const onPageChange = (e) => {
1242
+ let newCurrentPage = e.currentPage;
1243
+ if (isNumber(jumpToPageNo.current)) {
1244
+ newCurrentPage = jumpToPageNo.current;
1245
+ setTimeout(() => {
1246
+ jumpToPageNo.current = void 0;
1247
+ }, 1e3);
1248
+ }
1249
+ setCurrentPage(newCurrentPage);
1250
+ };
1251
+ react.useEffect(() => {
1252
+ if (!(embedRef.current && isNumber(currentPage))) return;
1253
+ setTimeout(() => {
1254
+ const pages = embedRef.current?.querySelectorAll(".rpv-core__viewer .rpv-core__page-layer");
1255
+ pages?.forEach((page) => {
1256
+ if (Number(page.getAttribute("data-virtual-index")) === currentPage) {
1257
+ page.classList.add("current-page-highlight");
1258
+ } else {
1259
+ page.classList.remove("current-page-highlight");
1260
+ }
1261
+ });
1262
+ }, 500);
1263
+ onSetPageNo?.(currentPage + 1);
1264
+ }, [currentPage]);
1265
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: embedRef, className: styles_module_default.nsPreviewPdf, children: /* @__PURE__ */ jsxRuntime.jsx(core.Worker, { workerUrl: `/uc/pdf/pdf.worker.min.js`, children: /* @__PURE__ */ jsxRuntime.jsxs(antd.Splitter, { onResize: setSizes, children: [
1266
+ isHasThumbnails && /* @__PURE__ */ jsxRuntime.jsx(antd.Splitter.Panel, { resizable: false, size: sizes[0], min: 250, max: 500, collapsible: true, children: /* @__PURE__ */ jsxRuntime.jsx(Thumbnails, {}) }),
1267
+ /* @__PURE__ */ jsxRuntime.jsx(antd.Splitter.Panel, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "height-full", children: [
1268
+ /* @__PURE__ */ jsxRuntime.jsx(
1269
+ core.Viewer,
1270
+ {
1271
+ localization: zh_CN__default.default,
1272
+ withCredentials: true,
1273
+ onDocumentAskPassword: (e) => {
1274
+ setTemporaryPassword("");
1275
+ e.verifyPassword(password || "");
1276
+ },
1277
+ transformGetDocumentParams: (options) => {
1278
+ return Object.assign({}, options, {
1279
+ // disableRange: false,
1280
+ disableStream: true,
1281
+ // 建议传入是否加密字段来控制
1282
+ httpHeaders: { "Cache-Control": "no-cache" },
1283
+ // 启用 CMap 支持,解决中文字体显示问题
1284
+ // cMapUrl: 指定 CMap 文件的 URL,用于处理非拉丁字符(如中文)
1285
+ // cMapPacked: 使用压缩的 CMap 文件以提高性能
1286
+ cMapUrl: "/uc/pdf/pdfjs-dist@3.2.146/cmaps/",
1287
+ // 使用可用的源
1288
+ cMapPacked: true,
1289
+ // 禁用字体子集化,确保完整字体加载
1290
+ disableFontFace: false,
1291
+ // 启用标准字体支持
1292
+ standardFontDataUrl: "/uc/pdf/pdfjs-dist@3.2.146/standard_fonts/",
1293
+ // 设置字体回退策略
1294
+ fallbackFontName: "Helvetica"
1295
+ });
1296
+ },
1297
+ fileUrl,
1298
+ defaultScale: scale,
1299
+ plugins: [
1300
+ pageNavigationPluginInstance,
1301
+ thumbnailPluginInstance,
1302
+ zoomPluginInstance
1303
+ // printPluginInstance,
1304
+ // rotatePluginInstance,
1305
+ // searchPluginInstance,
1306
+ ],
1307
+ onPageChange,
1308
+ renderError,
1309
+ onDocumentLoad: handleDocumentLoad,
1310
+ renderProtectedView: (renderProps) => /* @__PURE__ */ jsxRuntime.jsx(ProtectedView, { onVerifyPasswordEnd, ...renderProps })
1311
+ }
1312
+ ),
1313
+ /* @__PURE__ */ jsxRuntime.jsx(Toolbar, {})
1314
+ ] }) })
1315
+ ] }) }) });
1316
+ };
1317
+ var FilePreview_default = ({ suffix, fileUrl, pdfParams, password, searchValue }) => {
1318
+ const Preview = react.useMemo(() => {
1319
+ if (!fileUrl) {
1320
+ return /* @__PURE__ */ jsxRuntime.jsx(antd.Empty, {});
1321
+ }
1322
+ switch (suffix?.toUpperCase()) {
1323
+ case "PNG":
1324
+ case "JPG":
1325
+ case "JPEG":
1326
+ case "GIF":
1327
+ return /* @__PURE__ */ jsxRuntime.jsx(antd.Image, { rootClassName: styles_module_default.nsPreviewImage, src: fileUrl, alt: "\u9884\u89C8\u56FE\u7247" });
1328
+ case "PDF":
1329
+ return /* @__PURE__ */ jsxRuntime.jsx(PdfPreview_default, { fileUrl, ...pdfParams, password });
1330
+ // onSetPassword={onSetPassword}
1331
+ case "MP4":
1332
+ return /* @__PURE__ */ jsxRuntime.jsx(VideoPlayer_default, { fileUrl });
1333
+ case "MP3":
1334
+ return /* @__PURE__ */ jsxRuntime.jsx(AudioPlayer_default, { fileUrl });
1335
+ case "MD":
1336
+ case "MARKDOWN":
1337
+ return /* @__PURE__ */ jsxRuntime.jsx(MarkdownPreview_default, { fileUrl, searchValue });
1338
+ default:
1339
+ return /* @__PURE__ */ jsxRuntime.jsx(antd.Result, { subTitle: `\u6682\u4E0D\u652F\u6301 ${suffix || ""} \u6587\u4EF6\u7684\u9884\u89C8` });
1340
+ }
1341
+ }, [suffix, fileUrl, pdfParams]);
1342
+ return /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { justify: "center", align: "center", className: "height-full", children: Preview });
1343
+ };
1344
+ var FilePreviewDrawer_default = ({ open, fileUrl, suffix, title = "\u6587\u4EF6\u9884\u89C8", onClose, password, fileParams, pdfParams, onSetPassSuccess }) => {
1345
+ return /* @__PURE__ */ jsxRuntime.jsx(antd.Drawer, { title, push: false, width: "100%", open, onClose, children: /* @__PURE__ */ jsxRuntime.jsx(
1346
+ FilePreview_default,
1347
+ {
1348
+ fileUrl,
1349
+ suffix,
1350
+ password,
1351
+ fileParams,
1352
+ pdfParams,
1353
+ onSetPassSuccess
1354
+ }
1355
+ ) });
1356
+ };
1357
+
1358
+ // src/components/Iframe/styles.module.less
1359
+ var styles_module_default2 = {
1360
+ iframe: "styles_module_iframe"
1361
+ };
1362
+ var Iframe_default = react.forwardRef(({ id, src, className, onLoad }, ref) => {
1363
+ const [loading, setLoading] = react.useState(false);
1364
+ const finalSrc = react.useMemo(() => {
1365
+ return buildUrlParams({ v: Date.now() }, addUrlLastSlash(getUrlMainSource(src, location.href)));
1366
+ }, [src]);
1367
+ const onHandleLoad = () => {
1368
+ setLoading(false);
1369
+ onLoad?.();
1370
+ };
1371
+ react.useEffect(() => {
1372
+ setLoading(true);
1373
+ }, [src]);
1374
+ 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: classNames__default.default(styles_module_default2.iframe, className), onLoad: onHandleLoad }) }) });
1375
+ });
1376
+ function isRenderFn(node) {
1377
+ return isFunction(node) || isObject(node) && !isNull(node) && "$$typeof" in node && node.$$typeof === Symbol.for("react.forward_ref");
1378
+ }
1379
+ function renderDefault(DefaultComponent, props) {
1380
+ if (!DefaultComponent) return null;
1381
+ return isRenderFn(DefaultComponent) ? /* @__PURE__ */ jsxRuntime.jsx(DefaultComponent, { ...props }) : DefaultComponent;
1382
+ }
1383
+ function RenderWrapper({ control = true, ctx, DefaultComponent }) {
1384
+ if (control === false || isNull(control)) return null;
1385
+ if (control === true || control === void 0) {
1386
+ return renderDefault(DefaultComponent);
1387
+ }
1388
+ const { visible = true, render, props } = control;
1389
+ if (!visible) return null;
1390
+ if (render) {
1391
+ return typeof render === "function" ? render(ctx) : render;
1392
+ }
1393
+ return renderDefault(DefaultComponent, props);
1394
+ }
1395
+ var shouldRender = (control) => control != null && (isBoolean(control) ? control : control?.visible !== false);
1396
+ function propsMerge(control, props) {
1397
+ if (control === true || control === void 0) {
1398
+ return {
1399
+ props
1400
+ };
1401
+ }
1402
+ if (isObject(control) && (control?.visible === true || control?.visible === void 0)) {
1403
+ return {
1404
+ props: {
1405
+ ...props,
1406
+ ...control?.props
1407
+ }
1408
+ };
1409
+ }
1410
+ return null;
1411
+ }
1412
+ var UserAvatar_default = ({ size, avatarSrc, userName }) => {
1413
+ return avatarSrc ? /* @__PURE__ */ jsxRuntime.jsx(antd.Avatar, { size, src: avatarSrc }) : /* @__PURE__ */ jsxRuntime.jsx(antd.Avatar, { size, className: "cursor-pointer", style: { backgroundColor: LgPrimaryColor }, children: userName?.slice(0, 1)?.toLocaleUpperCase() });
1414
+ };
1415
+
1416
+ exports.AudioPlayer = AudioPlayer_default;
1417
+ exports.DateFormatType = DateFormatType;
1418
+ exports.DateFormatType2 = DateFormatType2;
1419
+ exports.ERROR = ERROR;
1420
+ exports.FORBIDDEN = FORBIDDEN;
1421
+ exports.FacePastCode = FacePastCode;
1422
+ exports.FileIcon = FileIcon_default;
1423
+ exports.FilePreview = FilePreview_default;
1424
+ exports.FilePreviewDrawer = FilePreviewDrawer_default;
1425
+ exports.ILLEGAL_PARAMETER = ILLEGAL_PARAMETER;
1426
+ exports.Iframe = Iframe_default;
1427
+ exports.LazyComponent = LazyComponent_default;
1428
+ exports.LgPrimaryColor = LgPrimaryColor;
1429
+ exports.LoginPastCode = LoginPastCode;
1430
+ exports.MISSING_PARAMETER = MISSING_PARAMETER;
1431
+ exports.MarkdownPreview = MarkdownPreview_default;
1432
+ exports.NOT_FOUND = NOT_FOUND;
1433
+ exports.OK = OK;
1434
+ exports.OK2 = OK2;
1435
+ exports.PERMISSION_DENIED = PERMISSION_DENIED;
1436
+ exports.PdfPreview = PdfPreview_default;
1437
+ exports.RenderMarkdown = RenderMarkdown_default;
1438
+ exports.RenderWrapper = RenderWrapper;
1439
+ exports.TOKEN_KEY = TOKEN_KEY;
1440
+ exports.UNAUTHORIZED = UNAUTHORIZED;
1441
+ exports.UserAvatar = UserAvatar_default;
1442
+ exports.VideoPlayer = VideoPlayer_default;
1443
+ exports.absVal = absVal;
1444
+ exports.addUrlLastSlash = addUrlLastSlash;
1445
+ exports.arrToObj = arrToObj;
1446
+ exports.buildUrlParams = buildUrlParams;
1447
+ exports.calculate = calculate;
1448
+ exports.clearCurrentUser = clearCurrentUser;
1449
+ exports.clearToken = clearToken;
1450
+ exports.compareNum = compareNum;
1451
+ exports.copyText = copyText;
1452
+ exports.createValtioContext = createValtioContext;
1453
+ exports.decimalPlaces = decimalPlaces;
1454
+ exports.deepCopy = deepCopy;
1455
+ exports.deepEqual = deepEqual;
1456
+ exports.deepMerge = deepMerge;
1457
+ exports.dividedBy = dividedBy;
1458
+ exports.downloadFile = downloadFile;
1459
+ exports.emit = emit;
1460
+ exports.emitToChild = emitToChild;
1461
+ exports.formType = formType;
1462
+ exports.formatDate = formatDate;
1463
+ exports.formatNumberWithCommas = formatNumberWithCommas;
1464
+ exports.genNonDuplicateID = genNonDuplicateID;
1465
+ exports.generateRandomNumbers = generateRandomNumbers;
1466
+ exports.getCurrentUser = getCurrentUser;
1467
+ exports.getDeviceId = getDeviceId;
1468
+ exports.getEndOfTimestamp = getEndOfTimestamp;
1469
+ exports.getFileName = getFileName;
1470
+ exports.getSignPath = getSignPath;
1471
+ exports.getStartOfTimestamp = getStartOfTimestamp;
1472
+ exports.getTimestamp = getTimestamp;
1473
+ exports.getToken = getToken;
1474
+ exports.getUrlMainSource = getUrlMainSource;
1475
+ exports.getUrlToken = getUrlToken;
1476
+ exports.getWebSocketUrl = getWebSocketUrl;
1477
+ exports.is = is;
1478
+ exports.isArray = isArray;
1479
+ exports.isBlob = isBlob;
1480
+ exports.isBoolean = isBoolean;
1481
+ exports.isClient = isClient;
1482
+ exports.isDate = isDate;
1483
+ exports.isDef = isDef;
1484
+ exports.isElement = isElement;
1485
+ exports.isEmpty = isEmpty;
1486
+ exports.isEmptyObj = isEmptyObj;
1487
+ exports.isExpire = isExpire;
1488
+ exports.isExternal = isExternal;
1489
+ exports.isFunction = isFunction;
1490
+ exports.isInteger = isInteger;
1491
+ exports.isMap = isMap;
1492
+ exports.isNegative = isNegative;
1493
+ exports.isNull = isNull;
1494
+ exports.isNullOrUnDef = isNullOrUnDef;
1495
+ exports.isNumber = isNumber;
1496
+ exports.isNumberNoNaN = isNumberNoNaN;
1497
+ exports.isObject = isObject;
1498
+ exports.isPromise = isPromise;
1499
+ exports.isRegExp = isRegExp;
1500
+ exports.isServer = isServer;
1501
+ exports.isString = isString;
1502
+ exports.isUnDef = isUnDef;
1503
+ exports.isWindow = isWindow;
1504
+ exports.jsonType = jsonType;
1505
+ exports.minus = minus;
1506
+ exports.nsSetInterval = nsSetInterval;
1507
+ exports.objToOptions = objToOptions;
1508
+ exports.plus = plus;
1509
+ exports.precision = precision;
1510
+ exports.propsMerge = propsMerge;
1511
+ exports.request = request_default;
1512
+ exports.setCurrentUser = setCurrentUser;
1513
+ exports.setToken = setToken;
1514
+ exports.shouldRender = shouldRender;
1515
+ exports.textAreaView = textAreaView;
1516
+ exports.themeConfig = themeConfig;
1517
+ exports.times = times;
1518
+ exports.toFixed = toFixed;
1519
+ exports.useDebounce = useDebounce;
1520
+ exports.useDeepEffect = useDeepEffect;
1521
+ exports.useIframeRelayBridge = useIframeRelayBridge;
1522
+ exports.useRefState = useRefState;
1523
+ exports.useSyncInput = useSyncInput;
1524
+ exports.useThrottle = useThrottle;
1525
+ exports.useWebSocket = useWebSocket_default;
1526
+ //# sourceMappingURL=index.cjs.js.map
1527
+ //# sourceMappingURL=index.cjs.js.map