@hkyhy/marsun-components-core 0.1.39 → 0.1.42

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.
@@ -2,7 +2,7 @@ const h = "<think>", m = "</think>", p = new RegExp(
2
2
  h.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + "([\\s\\S]*?)" + m.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"),
3
3
  "gi"
4
4
  ), c = /<\/?think>/gi;
5
- function t(n) {
5
+ function s(n) {
6
6
  return n.replace(/\n{3,}/g, `
7
7
 
8
8
  `).trimEnd();
@@ -14,10 +14,10 @@ function T(n) {
14
14
  `);
15
15
  return i = i.replace(/```\s*mermaid[ \t]*(?!\n)/gi, "```mermaid\n"), i = i.replace(
16
16
  /```mermaid\n([\s\S]*?)(\n(?:风格说明|Style)[^\n`]*[\s\S]*?)(?=```|$)/gi,
17
- (o, r, s) => `\`\`\`mermaid
17
+ (o, r, t) => `\`\`\`mermaid
18
18
  ${r.trimEnd()}
19
19
  \`\`\`
20
- ${s.trim()}`
20
+ ${t.trim()}`
21
21
  ), i;
22
22
  }
23
23
  function d(n) {
@@ -27,19 +27,19 @@ function w(n, i = !1) {
27
27
  var g;
28
28
  if (!n)
29
29
  return { thinking: "", answer: "", isThinking: i };
30
- const o = n.toLowerCase(), r = o.lastIndexOf(m), s = o.lastIndexOf(h), a = [];
30
+ const o = n.toLowerCase(), r = o.lastIndexOf(m), t = o.lastIndexOf(h), a = [];
31
31
  for (const e of n.matchAll(p)) {
32
32
  const l = (g = e[1]) == null ? void 0 : g.trim();
33
33
  l && a.push(l);
34
34
  }
35
- if (i && r === -1)
35
+ if (i && r === -1 && t !== -1)
36
36
  return {
37
- thinking: t(n.replace(c, "").trim()),
37
+ thinking: s(n.replace(c, "").trim()),
38
38
  answer: "",
39
39
  isThinking: !0
40
40
  };
41
- if (s > r) {
42
- const e = n.slice(0, s).replace(c, "").trim(), l = n.slice(s + h.length).replace(c, "").trim(), k = [
41
+ if (t > r) {
42
+ const e = n.slice(0, t).replace(c, "").trim(), l = n.slice(t + h.length).replace(c, "").trim(), k = [
43
43
  ...e ? [e] : [],
44
44
  ...a,
45
45
  ...l ? [l] : []
@@ -47,29 +47,29 @@ function w(n, i = !1) {
47
47
 
48
48
  `);
49
49
  return {
50
- thinking: t(k),
50
+ thinking: s(k),
51
51
  answer: "",
52
52
  isThinking: i
53
53
  };
54
54
  }
55
55
  if (r !== -1) {
56
- const e = t(
56
+ const e = s(
57
57
  n.slice(r + m.length).replace(c, "").trim()
58
58
  );
59
59
  if (e)
60
60
  return {
61
- thinking: t(a.join(`
61
+ thinking: s(a.join(`
62
62
 
63
63
  `)),
64
64
  answer: e,
65
65
  isThinking: !1
66
66
  };
67
67
  }
68
- const f = t(
68
+ const f = s(
69
69
  n.replace(p, "").replace(c, "").trim()
70
70
  );
71
71
  return {
72
- thinking: t(a.join(`
72
+ thinking: s(a.join(`
73
73
 
74
74
  `)),
75
75
  answer: f,
@@ -79,7 +79,7 @@ function w(n, i = !1) {
79
79
  export {
80
80
  d as hasCitationMarkers,
81
81
  T as normalizeAssistantMarkdown,
82
- t as normalizeDisplayText,
82
+ s as normalizeDisplayText,
83
83
  w as parseAssistantContent
84
84
  };
85
85
  //# sourceMappingURL=messageContent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messageContent.js","sources":["../../../../../src/components/AgentHub/Chat/utils/messageContent.ts"],"sourcesContent":["const THINK_OPEN = '<' + 'think>';\nconst THINK_CLOSE = '<' + '/think>';\nconst THINK_BLOCK_RE = new RegExp(\n THINK_OPEN.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') +\n '([\\\\s\\\\S]*?)' +\n THINK_CLOSE.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'),\n 'gi',\n);\nconst THINK_TAG_RE = /<\\/?think>/gi;\n\nexport interface ParsedAssistantContent {\n /** Reasoning text extracted from think blocks */\n thinking: string;\n /** User-facing answer (outside think blocks) */\n answer: string;\n /** Stream still inside an unclosed think block */\n isThinking: boolean;\n}\n\n/** Collapse excessive blank lines and trim trailing whitespace for display */\nexport function normalizeDisplayText(text: string): string {\n return text.replace(/\\n{3,}/g, '\\n\\n').trimEnd();\n}\n\nconst CITATION_MARKER_TEST_RE = /\\[ID[:-]\\d+\\]/;\n\n/** Normalize assistant markdown from persisted sessions (fences, mermaid blocks). */\nexport function normalizeAssistantMarkdown(content: string): string {\n if (!content) return content;\n\n let text = content.replace(/\\r\\n/g, '\\n');\n\n // Ensure newline after ```mermaid opening fence\n text = text.replace(/```\\s*mermaid[ \\t]*(?!\\n)/gi, '```mermaid\\n');\n\n // Move trailing prose after mermaid block out of the fence when closing ``` is missing\n text = text.replace(\n /```mermaid\\n([\\s\\S]*?)(\\n(?:风格说明|Style)[^\\n`]*[\\s\\S]*?)(?=```|$)/gi,\n (_, chart, prose) => {\n const trimmedChart = chart.trimEnd();\n return `\\`\\`\\`mermaid\\n${trimmedChart}\\n\\`\\`\\`\\n${prose.trim()}`;\n },\n );\n\n return text;\n}\n\nexport function hasCitationMarkers(content: string): boolean {\n return CITATION_MARKER_TEST_RE.test(content);\n}\n\n/**\n * Split assistant output into hidden reasoning and visible answer.\n * RAGFlow / reasoning models may wrap chain-of-thought in think tags.\n */\nexport function parseAssistantContent(content: string, streaming = false): ParsedAssistantContent {\n if (!content) {\n return { thinking: '', answer: '', isThinking: streaming };\n }\n\n const lower = content.toLowerCase();\n const lastClose = lower.lastIndexOf(THINK_CLOSE);\n const lastOpen = lower.lastIndexOf(THINK_OPEN);\n\n const thinkingParts: string[] = [];\n for (const match of content.matchAll(THINK_BLOCK_RE)) {\n const part = match[1]?.trim();\n if (part) thinkingParts.push(part);\n }\n\n // Streaming: before arrives, treat all output as reasoning\n if (streaming && lastClose === -1) {\n return {\n thinking: normalizeDisplayText(content.replace(THINK_TAG_RE, '').trim()),\n answer: '',\n isThinking: true,\n };\n }\n\n // Streaming: unclosed think block at the end\n if (lastOpen > lastClose) {\n const beforeOpen = content.slice(0, lastOpen).replace(THINK_TAG_RE, '').trim();\n const insideThink = content\n .slice(lastOpen + THINK_OPEN.length)\n .replace(THINK_TAG_RE, '')\n .trim();\n const thinking = [\n ...(beforeOpen ? [beforeOpen] : []),\n ...thinkingParts,\n ...(insideThink ? [insideThink] : []),\n ].join('\\n\\n');\n\n return {\n thinking: normalizeDisplayText(thinking),\n answer: '',\n isThinking: streaming,\n };\n }\n\n // Prefer final answer after the last closing think tag\n if (lastClose !== -1) {\n const answer = normalizeDisplayText(\n content\n .slice(lastClose + THINK_CLOSE.length)\n .replace(THINK_TAG_RE, '')\n .trim(),\n );\n if (answer) {\n return {\n thinking: normalizeDisplayText(thinkingParts.join('\\n\\n')),\n answer,\n isThinking: false,\n };\n }\n }\n\n const answer = normalizeDisplayText(\n content.replace(THINK_BLOCK_RE, '').replace(THINK_TAG_RE, '').trim(),\n );\n\n return {\n thinking: normalizeDisplayText(thinkingParts.join('\\n\\n')),\n answer,\n isThinking: false,\n };\n}\n"],"names":["THINK_OPEN","THINK_CLOSE","THINK_BLOCK_RE","THINK_TAG_RE","normalizeDisplayText","text","CITATION_MARKER_TEST_RE","normalizeAssistantMarkdown","content","_","chart","prose","hasCitationMarkers","parseAssistantContent","streaming","_a","lower","lastClose","lastOpen","thinkingParts","match","part","beforeOpen","insideThink","thinking","answer"],"mappings":"AAAA,MAAMA,IAAa,WACbC,IAAc,YACdC,IAAiB,IAAI;AAAA,EACzBF,EAAW,QAAQ,uBAAuB,MAAM,IAC9C,iBACAC,EAAY,QAAQ,uBAAuB,MAAM;AAAA,EACnD;AACF,GACME,IAAe;AAYd,SAASC,EAAqBC,GAAsB;AACzD,SAAOA,EAAK,QAAQ,WAAW;AAAA;AAAA,CAAM,EAAE,QAAA;AACzC;AAEA,MAAMC,IAA0B;AAGzB,SAASC,EAA2BC,GAAyB;AAClE,MAAI,CAACA,EAAS,QAAOA;AAErB,MAAIH,IAAOG,EAAQ,QAAQ,SAAS;AAAA,CAAI;AAGxC,SAAAH,IAAOA,EAAK,QAAQ,+BAA+B,cAAc,GAGjEA,IAAOA,EAAK;AAAA,IACV;AAAA,IACA,CAACI,GAAGC,GAAOC,MAEF;AAAA,EADcD,EAAM,QAAA,CACU;AAAA;AAAA,EAAaC,EAAM,MAAM;AAAA,EAChE,GAGKN;AACT;AAEO,SAASO,EAAmBJ,GAA0B;AAC3D,SAAOF,EAAwB,KAAKE,CAAO;AAC7C;AAMO,SAASK,EAAsBL,GAAiBM,IAAY,IAA+B;AAvDlG,MAAAC;AAwDE,MAAI,CAACP;AACH,WAAO,EAAE,UAAU,IAAI,QAAQ,IAAI,YAAYM,EAAA;AAGjD,QAAME,IAAQR,EAAQ,YAAA,GAChBS,IAAYD,EAAM,YAAYf,CAAW,GACzCiB,IAAWF,EAAM,YAAYhB,CAAU,GAEvCmB,IAA0B,CAAA;AAChC,aAAWC,KAASZ,EAAQ,SAASN,CAAc,GAAG;AACpD,UAAMmB,KAAON,IAAAK,EAAM,CAAC,MAAP,gBAAAL,EAAU;AACvB,IAAIM,KAAMF,EAAc,KAAKE,CAAI;AAAA,EACnC;AAGA,MAAIP,KAAaG,MAAc;AAC7B,WAAO;AAAA,MACL,UAAUb,EAAqBI,EAAQ,QAAQL,GAAc,EAAE,EAAE,MAAM;AAAA,MACvE,QAAQ;AAAA,MACR,YAAY;AAAA,IAAA;AAKhB,MAAIe,IAAWD,GAAW;AACxB,UAAMK,IAAad,EAAQ,MAAM,GAAGU,CAAQ,EAAE,QAAQf,GAAc,EAAE,EAAE,KAAA,GAClEoB,IAAcf,EACjB,MAAMU,IAAWlB,EAAW,MAAM,EAClC,QAAQG,GAAc,EAAE,EACxB,KAAA,GACGqB,IAAW;AAAA,MACf,GAAIF,IAAa,CAACA,CAAU,IAAI,CAAA;AAAA,MAChC,GAAGH;AAAA,MACH,GAAII,IAAc,CAACA,CAAW,IAAI,CAAA;AAAA,IAAC,EACnC,KAAK;AAAA;AAAA,CAAM;AAEb,WAAO;AAAA,MACL,UAAUnB,EAAqBoB,CAAQ;AAAA,MACvC,QAAQ;AAAA,MACR,YAAYV;AAAA,IAAA;AAAA,EAEhB;AAGA,MAAIG,MAAc,IAAI;AACpB,UAAMQ,IAASrB;AAAA,MACbI,EACG,MAAMS,IAAYhB,EAAY,MAAM,EACpC,QAAQE,GAAc,EAAE,EACxB,KAAA;AAAA,IAAK;AAEV,QAAIsB;AACF,aAAO;AAAA,QACL,UAAUrB,EAAqBe,EAAc,KAAK;AAAA;AAAA,CAAM,CAAC;AAAA,QACzD,QAAAM;AAAAA,QACA,YAAY;AAAA,MAAA;AAAA,EAGlB;AAEA,QAAMA,IAASrB;AAAA,IACbI,EAAQ,QAAQN,GAAgB,EAAE,EAAE,QAAQC,GAAc,EAAE,EAAE,KAAA;AAAA,EAAK;AAGrE,SAAO;AAAA,IACL,UAAUC,EAAqBe,EAAc,KAAK;AAAA;AAAA,CAAM,CAAC;AAAA,IACzD,QAAAM;AAAA,IACA,YAAY;AAAA,EAAA;AAEhB;"}
1
+ {"version":3,"file":"messageContent.js","sources":["../../../../../src/components/AgentHub/Chat/utils/messageContent.ts"],"sourcesContent":["const THINK_OPEN = '<' + 'think>';\nconst THINK_CLOSE = '<' + '/think>';\nconst THINK_BLOCK_RE = new RegExp(\n THINK_OPEN.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') +\n '([\\\\s\\\\S]*?)' +\n THINK_CLOSE.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'),\n 'gi',\n);\nconst THINK_TAG_RE = /<\\/?think>/gi;\n\nexport interface ParsedAssistantContent {\n /** Reasoning text extracted from think blocks */\n thinking: string;\n /** User-facing answer (outside think blocks) */\n answer: string;\n /** Stream still inside an unclosed think block */\n isThinking: boolean;\n}\n\n/** Collapse excessive blank lines and trim trailing whitespace for display */\nexport function normalizeDisplayText(text: string): string {\n return text.replace(/\\n{3,}/g, '\\n\\n').trimEnd();\n}\n\nconst CITATION_MARKER_TEST_RE = /\\[ID[:-]\\d+\\]/;\n\n/** Normalize assistant markdown from persisted sessions (fences, mermaid blocks). */\nexport function normalizeAssistantMarkdown(content: string): string {\n if (!content) return content;\n\n let text = content.replace(/\\r\\n/g, '\\n');\n\n // Ensure newline after ```mermaid opening fence\n text = text.replace(/```\\s*mermaid[ \\t]*(?!\\n)/gi, '```mermaid\\n');\n\n // Move trailing prose after mermaid block out of the fence when closing ``` is missing\n text = text.replace(\n /```mermaid\\n([\\s\\S]*?)(\\n(?:风格说明|Style)[^\\n`]*[\\s\\S]*?)(?=```|$)/gi,\n (_, chart, prose) => {\n const trimmedChart = chart.trimEnd();\n return `\\`\\`\\`mermaid\\n${trimmedChart}\\n\\`\\`\\`\\n${prose.trim()}`;\n },\n );\n\n return text;\n}\n\nexport function hasCitationMarkers(content: string): boolean {\n return CITATION_MARKER_TEST_RE.test(content);\n}\n\n/**\n * Split assistant output into hidden reasoning and visible answer.\n * RAGFlow / reasoning models may wrap chain-of-thought in think tags.\n */\nexport function parseAssistantContent(content: string, streaming = false): ParsedAssistantContent {\n if (!content) {\n return { thinking: '', answer: '', isThinking: streaming };\n }\n\n const lower = content.toLowerCase();\n const lastClose = lower.lastIndexOf(THINK_CLOSE);\n const lastOpen = lower.lastIndexOf(THINK_OPEN);\n\n const thinkingParts: string[] = [];\n for (const match of content.matchAll(THINK_BLOCK_RE)) {\n const part = match[1]?.trim();\n if (part) thinkingParts.push(part);\n }\n\n // Streaming: unclosed think block — treat buffered text as reasoning until </think>\n if (streaming && lastClose === -1 && lastOpen !== -1) {\n return {\n thinking: normalizeDisplayText(content.replace(THINK_TAG_RE, '').trim()),\n answer: '',\n isThinking: true,\n };\n }\n\n // Streaming: unclosed think block at the end (open after last close)\n if (lastOpen > lastClose) {\n const beforeOpen = content.slice(0, lastOpen).replace(THINK_TAG_RE, '').trim();\n const insideThink = content\n .slice(lastOpen + THINK_OPEN.length)\n .replace(THINK_TAG_RE, '')\n .trim();\n const thinking = [\n ...(beforeOpen ? [beforeOpen] : []),\n ...thinkingParts,\n ...(insideThink ? [insideThink] : []),\n ].join('\\n\\n');\n\n return {\n thinking: normalizeDisplayText(thinking),\n answer: '',\n isThinking: streaming,\n };\n }\n\n // Prefer final answer after the last closing think tag\n if (lastClose !== -1) {\n const answer = normalizeDisplayText(\n content\n .slice(lastClose + THINK_CLOSE.length)\n .replace(THINK_TAG_RE, '')\n .trim(),\n );\n if (answer) {\n return {\n thinking: normalizeDisplayText(thinkingParts.join('\\n\\n')),\n answer,\n isThinking: false,\n };\n }\n }\n\n const answer = normalizeDisplayText(\n content.replace(THINK_BLOCK_RE, '').replace(THINK_TAG_RE, '').trim(),\n );\n\n return {\n thinking: normalizeDisplayText(thinkingParts.join('\\n\\n')),\n answer,\n isThinking: false,\n };\n}\n"],"names":["THINK_OPEN","THINK_CLOSE","THINK_BLOCK_RE","THINK_TAG_RE","normalizeDisplayText","text","CITATION_MARKER_TEST_RE","normalizeAssistantMarkdown","content","_","chart","prose","hasCitationMarkers","parseAssistantContent","streaming","_a","lower","lastClose","lastOpen","thinkingParts","match","part","beforeOpen","insideThink","thinking","answer"],"mappings":"AAAA,MAAMA,IAAa,WACbC,IAAc,YACdC,IAAiB,IAAI;AAAA,EACzBF,EAAW,QAAQ,uBAAuB,MAAM,IAC9C,iBACAC,EAAY,QAAQ,uBAAuB,MAAM;AAAA,EACnD;AACF,GACME,IAAe;AAYd,SAASC,EAAqBC,GAAsB;AACzD,SAAOA,EAAK,QAAQ,WAAW;AAAA;AAAA,CAAM,EAAE,QAAA;AACzC;AAEA,MAAMC,IAA0B;AAGzB,SAASC,EAA2BC,GAAyB;AAClE,MAAI,CAACA,EAAS,QAAOA;AAErB,MAAIH,IAAOG,EAAQ,QAAQ,SAAS;AAAA,CAAI;AAGxC,SAAAH,IAAOA,EAAK,QAAQ,+BAA+B,cAAc,GAGjEA,IAAOA,EAAK;AAAA,IACV;AAAA,IACA,CAACI,GAAGC,GAAOC,MAEF;AAAA,EADcD,EAAM,QAAA,CACU;AAAA;AAAA,EAAaC,EAAM,MAAM;AAAA,EAChE,GAGKN;AACT;AAEO,SAASO,EAAmBJ,GAA0B;AAC3D,SAAOF,EAAwB,KAAKE,CAAO;AAC7C;AAMO,SAASK,EAAsBL,GAAiBM,IAAY,IAA+B;AAvDlG,MAAAC;AAwDE,MAAI,CAACP;AACH,WAAO,EAAE,UAAU,IAAI,QAAQ,IAAI,YAAYM,EAAA;AAGjD,QAAME,IAAQR,EAAQ,YAAA,GAChBS,IAAYD,EAAM,YAAYf,CAAW,GACzCiB,IAAWF,EAAM,YAAYhB,CAAU,GAEvCmB,IAA0B,CAAA;AAChC,aAAWC,KAASZ,EAAQ,SAASN,CAAc,GAAG;AACpD,UAAMmB,KAAON,IAAAK,EAAM,CAAC,MAAP,gBAAAL,EAAU;AACvB,IAAIM,KAAMF,EAAc,KAAKE,CAAI;AAAA,EACnC;AAGA,MAAIP,KAAaG,MAAc,MAAMC,MAAa;AAChD,WAAO;AAAA,MACL,UAAUd,EAAqBI,EAAQ,QAAQL,GAAc,EAAE,EAAE,MAAM;AAAA,MACvE,QAAQ;AAAA,MACR,YAAY;AAAA,IAAA;AAKhB,MAAIe,IAAWD,GAAW;AACxB,UAAMK,IAAad,EAAQ,MAAM,GAAGU,CAAQ,EAAE,QAAQf,GAAc,EAAE,EAAE,KAAA,GAClEoB,IAAcf,EACjB,MAAMU,IAAWlB,EAAW,MAAM,EAClC,QAAQG,GAAc,EAAE,EACxB,KAAA,GACGqB,IAAW;AAAA,MACf,GAAIF,IAAa,CAACA,CAAU,IAAI,CAAA;AAAA,MAChC,GAAGH;AAAA,MACH,GAAII,IAAc,CAACA,CAAW,IAAI,CAAA;AAAA,IAAC,EACnC,KAAK;AAAA;AAAA,CAAM;AAEb,WAAO;AAAA,MACL,UAAUnB,EAAqBoB,CAAQ;AAAA,MACvC,QAAQ;AAAA,MACR,YAAYV;AAAA,IAAA;AAAA,EAEhB;AAGA,MAAIG,MAAc,IAAI;AACpB,UAAMQ,IAASrB;AAAA,MACbI,EACG,MAAMS,IAAYhB,EAAY,MAAM,EACpC,QAAQE,GAAc,EAAE,EACxB,KAAA;AAAA,IAAK;AAEV,QAAIsB;AACF,aAAO;AAAA,QACL,UAAUrB,EAAqBe,EAAc,KAAK;AAAA;AAAA,CAAM,CAAC;AAAA,QACzD,QAAAM;AAAAA,QACA,YAAY;AAAA,MAAA;AAAA,EAGlB;AAEA,QAAMA,IAASrB;AAAA,IACbI,EAAQ,QAAQN,GAAgB,EAAE,EAAE,QAAQC,GAAc,EAAE,EAAE,KAAA;AAAA,EAAK;AAGrE,SAAO;AAAA,IACL,UAAUC,EAAqBe,EAAc,KAAK;AAAA;AAAA,CAAM,CAAC;AAAA,IACzD,QAAAM;AAAA,IACA,YAAY;AAAA,EAAA;AAEhB;"}
@@ -1,82 +1,89 @@
1
1
  import { jsxs as h, jsx as e } from "react/jsx-runtime";
2
2
  import { Inbox as V, Upload as W, File as X, Trash2 as Y } from "../Icons/index.js";
3
- import { message as y, Upload as D, Button as H, Typography as K, Tag as Z } from "antd";
3
+ import { message as I, Upload as N, Button as D, Typography as H, Tag as Z } from "antd";
4
4
  import f from "react";
5
- import t from "./style.module.scss.js";
6
- import a from "classnames";
7
- const j = (r) => r < 1024 * 1024 ? `${(r / 1024).toFixed(0)}KB` : r < 1024 ** 3 ? `${(r / 1024 / 1024).toFixed(0)}M` : `${(r / 1024 ** 3).toFixed(1)}G`;
8
- function S(r, i, o) {
5
+ import a from "./style.module.scss.js";
6
+ import o from "classnames";
7
+ const R = (r) => r < 1024 * 1024 ? `${(r / 1024).toFixed(0)}KB` : r < 1024 ** 3 ? `${(r / 1024 / 1024).toFixed(0)}M` : `${(r / 1024 ** 3).toFixed(1)}G`;
8
+ function S(r, i, t) {
9
9
  const c = [];
10
10
  if (r) {
11
- const g = r.split(",").map((N) => N.trim().replace(/^\./, "")).filter(Boolean);
11
+ const g = r.split(",").map((x) => x.trim().replace(/^\./, "")).filter(Boolean);
12
12
  g.length && c.push(`支持扩展名${g.join(",")}`);
13
13
  }
14
- return i && c.push(`单个文件大小不超过${j(i)}`), o && c.push(`最多上传${o}个附件`), c.length ? /* @__PURE__ */ e(K.Text, { type: "secondary", className: a("upload-item", t["upload-item"]), children: c.join(",") }) : null;
14
+ return i && c.push(`单个文件大小不超过${R(i)}`), t && c.push(`最多上传${t}个附件`), c.length ? /* @__PURE__ */ e(H.Text, { type: "secondary", className: o("upload-item", a["upload-item"]), children: c.join(",") }) : null;
15
15
  }
16
16
  function ll(r) {
17
17
  const i = r.lastIndexOf(".");
18
18
  return i >= 0 ? r.slice(i + 1).toUpperCase() : "";
19
19
  }
20
- const G = ({ fileList: r, onRemove: i }) => r.length ? /* @__PURE__ */ e("div", { className: a("upload-link", t["upload-link"]), children: r.map((o) => /* @__PURE__ */ h(
20
+ const v = ({ fileList: r, onRemove: i }) => r.length ? /* @__PURE__ */ e("div", { className: o("upload-link", a["upload-link"]), children: r.map((t) => /* @__PURE__ */ h(
21
21
  "div",
22
22
  {
23
- className: a(
24
- a("upload-file-row", t["upload-file-row"]),
25
- o.status === "error" && a("upload-file-row-error", t["upload-file-row-error"])
23
+ className: o(
24
+ o("upload-file-row", a["upload-file-row"]),
25
+ t.status === "error" && o("upload-file-row-error", a["upload-file-row-error"])
26
26
  ),
27
27
  children: [
28
- /* @__PURE__ */ h("div", { className: a("upload-label", t["upload-label"]), children: [
29
- /* @__PURE__ */ e(X, { className: a("upload-value", t["upload-value"]) }),
30
- /* @__PURE__ */ e("span", { className: a("upload-meta", t["upload-meta"]), children: o.name }),
31
- /* @__PURE__ */ e(Z, { color: "processing", className: a("upload-icon", t["upload-icon"]), children: ll(o.name) }),
32
- o.size && /* @__PURE__ */ e(K.Text, { type: "secondary", className: a("upload-title", t["upload-title"]), children: j(o.size) })
28
+ /* @__PURE__ */ h("div", { className: o("upload-label", a["upload-label"]), children: [
29
+ /* @__PURE__ */ e(X, { className: o("upload-value", a["upload-value"]) }),
30
+ /* @__PURE__ */ e("span", { className: o("upload-meta", a["upload-meta"]), children: t.name }),
31
+ /* @__PURE__ */ e(Z, { color: "processing", className: o("upload-icon", a["upload-icon"]), children: ll(t.name) }),
32
+ t.size && /* @__PURE__ */ e(
33
+ H.Text,
34
+ {
35
+ type: "secondary",
36
+ className: o("upload-title", a["upload-title"]),
37
+ children: R(t.size)
38
+ }
39
+ )
33
40
  ] }),
34
41
  /* @__PURE__ */ e(
35
- H,
42
+ D,
36
43
  {
37
44
  type: "text",
38
45
  danger: !0,
39
46
  size: "small",
40
47
  icon: /* @__PURE__ */ e(Y, {}),
41
- onClick: () => i(o.uid),
42
- className: a("upload-desc", t["upload-desc"])
48
+ onClick: () => i(t.uid),
49
+ className: o("upload-desc", a["upload-desc"])
43
50
  }
44
51
  )
45
52
  ]
46
53
  },
47
- o.uid
54
+ t.uid
48
55
  )) }) : null, el = f.forwardRef(
49
56
  ({
50
57
  value: r,
51
58
  onChange: i,
52
- className: o,
59
+ className: t,
53
60
  variant: c,
54
61
  size: g,
55
- children: N,
56
- renderTips: x,
57
- showFileList: k = !0,
58
- fileSize: R,
59
- maxLength: M,
60
- multiple: L,
61
- directory: z,
62
- accept: F,
63
- onUpload: U,
62
+ children: x,
63
+ renderTips: F,
64
+ showFileList: L = !0,
65
+ fileSize: j,
66
+ maxLength: K,
67
+ multiple: k,
68
+ directory: O,
69
+ accept: U,
70
+ onUpload: w,
64
71
  onSave: u,
65
- getPermission: w,
66
- concurrentCount: P
67
- }, _) => {
68
- const [A, J] = f.useState([]), [C, I] = f.useState(!1), n = r ?? A, m = f.useCallback(
72
+ getPermission: b,
73
+ concurrentCount: M
74
+ }, P) => {
75
+ const [A, J] = f.useState([]), [z, C] = f.useState(!1), n = r ?? A, m = f.useCallback(
69
76
  (l) => {
70
77
  const s = typeof l == "function" ? l(n) : l;
71
78
  i == null || i(s), J(s), u == null || u(s);
72
79
  },
73
80
  [n, i, u]
74
- ), b = R ?? 500 * 1024 * 1024, B = P ?? 3, O = f.useCallback(
75
- (l) => w && !w(l) ? (y.error("无权限上传此文件"), !1) : l.size > b ? (y.error(`文件超出 ${j(b)} 限制`), !1) : !0,
76
- [b, w]
77
- ), q = f.useCallback(async () => {
78
- if (!(!U || !n.length)) {
79
- I(!0);
81
+ ), $ = j ?? 500 * 1024 * 1024, E = M ?? 3, T = f.useCallback(
82
+ (l) => b && !b(l) ? (I.error("无权限上传此文件"), N.LIST_IGNORE) : l.size > $ ? (I.error(`文件超出 ${R($)} 限制`), N.LIST_IGNORE) : !0,
83
+ [$, b]
84
+ ), B = f.useCallback(async () => {
85
+ if (!(!w || !n.length)) {
86
+ C(!0);
80
87
  try {
81
88
  const l = [...n], s = [];
82
89
  for (; l.length; ) {
@@ -84,88 +91,88 @@ const G = ({ fileList: r, onRemove: i }) => r.length ? /* @__PURE__ */ e("div",
84
91
  if (!(d != null && d.originFileObj)) continue;
85
92
  const Q = d.originFileObj;
86
93
  s.push(
87
- new Promise((T) => {
88
- U({
94
+ new Promise((_) => {
95
+ w({
89
96
  file: Q,
90
- onSuccess: (v) => {
97
+ onSuccess: (q) => {
91
98
  m(
92
- ($) => $.map(
93
- (p) => p.uid === d.uid ? { ...p, status: "done", url: v ?? p.url } : p
99
+ (y) => y.map(
100
+ (p) => p.uid === d.uid ? { ...p, status: "done", url: q ?? p.url } : p
94
101
  )
95
- ), T();
102
+ ), _();
96
103
  },
97
- onError: (v) => {
98
- y.error(`${d.name} 上传失败`), m(
99
- ($) => $.map((p) => p.uid === d.uid ? { ...p, status: "error" } : p)
100
- ), T();
104
+ onError: (q) => {
105
+ I.error(`${d.name} 上传失败`), m(
106
+ (y) => y.map((p) => p.uid === d.uid ? { ...p, status: "error" } : p)
107
+ ), _();
101
108
  }
102
109
  });
103
110
  })
104
- ), s.length >= B && await Promise.race(s);
111
+ ), s.length >= E && await Promise.race(s);
105
112
  }
106
113
  await Promise.allSettled(s), u == null || u(n);
107
114
  } finally {
108
- I(!1);
115
+ C(!1);
109
116
  }
110
117
  }
111
- }, [n, U, B, u, m]);
112
- f.useImperativeHandle(_, () => ({ upload: q, uploading: C }), [
113
- q,
114
- C
118
+ }, [n, w, E, u, m]);
119
+ f.useImperativeHandle(P, () => ({ upload: B, uploading: z }), [
120
+ B,
121
+ z
115
122
  ]);
116
- const E = (x == null ? void 0 : x()) ?? S(F, R, M);
117
- return c === "panel" ? /* @__PURE__ */ h("div", { className: o, children: [
123
+ const G = (F == null ? void 0 : F()) ?? S(U, j, K);
124
+ return c === "panel" ? /* @__PURE__ */ h("div", { className: t, children: [
118
125
  /* @__PURE__ */ h(
119
- D.Dragger,
126
+ N.Dragger,
120
127
  {
121
128
  fileList: n,
122
- beforeUpload: O,
129
+ beforeUpload: T,
123
130
  onChange: (l) => m(l.fileList),
124
- multiple: L,
125
- directory: z,
126
- accept: F,
131
+ multiple: k,
132
+ directory: O,
133
+ accept: U,
127
134
  showUploadList: !1,
128
135
  customRequest: ({ onSuccess: l }) => l == null ? void 0 : l({}),
129
136
  children: [
130
- /* @__PURE__ */ e("p", { className: a("upload-drag-icon", t["upload-drag-icon"]), children: /* @__PURE__ */ e(V, {}) }),
137
+ /* @__PURE__ */ e("p", { className: o("upload-drag-icon", a["upload-drag-icon"]), children: /* @__PURE__ */ e(V, {}) }),
131
138
  /* @__PURE__ */ e("p", { className: "ant-upload-text", children: "点击或拖拽文件到此区域上传" }),
132
- /* @__PURE__ */ e("p", { children: E })
139
+ /* @__PURE__ */ e("p", { children: G })
133
140
  ]
134
141
  }
135
142
  ),
136
- k && /* @__PURE__ */ e(
137
- G,
143
+ L && /* @__PURE__ */ e(
144
+ v,
138
145
  {
139
146
  fileList: n,
140
147
  onRemove: (l) => m((s) => s.filter((d) => d.uid !== l))
141
148
  }
142
149
  )
143
- ] }) : /* @__PURE__ */ h("div", { className: o, children: [
150
+ ] }) : /* @__PURE__ */ h("div", { className: t, children: [
144
151
  /* @__PURE__ */ e(
145
- D,
152
+ N,
146
153
  {
147
154
  fileList: n,
148
- beforeUpload: O,
155
+ beforeUpload: T,
149
156
  onChange: (l) => m(l.fileList),
150
- multiple: L,
151
- directory: z,
152
- accept: F,
157
+ multiple: k,
158
+ directory: O,
159
+ accept: U,
153
160
  showUploadList: !1,
154
161
  customRequest: ({ onSuccess: l }) => l == null ? void 0 : l({}),
155
- children: N ?? /* @__PURE__ */ e(
156
- H,
162
+ children: x ?? /* @__PURE__ */ e(
163
+ D,
157
164
  {
158
165
  size: g,
159
166
  icon: /* @__PURE__ */ e(W, {}),
160
- className: a("upload-toolbar", t["upload-toolbar"]),
167
+ className: o("upload-toolbar", a["upload-toolbar"]),
161
168
  children: "点击上传"
162
169
  }
163
170
  )
164
171
  }
165
172
  ),
166
- /* @__PURE__ */ e("div", { className: a("upload-list", t["upload-list"]), children: E }),
167
- k && /* @__PURE__ */ e(
168
- G,
173
+ /* @__PURE__ */ e("div", { className: o("upload-list", a["upload-list"]), children: G }),
174
+ L && /* @__PURE__ */ e(
175
+ v,
169
176
  {
170
177
  fileList: n,
171
178
  onRemove: (l) => m((s) => s.filter((d) => d.uid !== l))
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Upload/index.tsx"],"sourcesContent":["import { Trash2, File, Inbox, Upload as UploadIcon } from '@/components/Icons';\nimport { Button, message, Tag, Typography, Upload } from 'antd';\nimport type { UploadFile } from 'antd/es/upload/interface';\nimport React from 'react';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\n/* ---------- types ---------- */\n\n/** 上传变体 */\nexport type UploadVariant = 'panel' | 'button';\n\nexport interface CommonUploadProps {\n /* ---- antd Form.Item 兼容属性 ---- */\n value?: UploadFile[];\n onChange?: (value: UploadFile[]) => void;\n\n /* ---- 容器/样式 ---- */\n className?: string;\n\n /* ---- 上传配置 ---- */\n /** 单文件大小限制(字节),默认 500MB */\n fileSize?: number;\n /** 最大上传数量 */\n maxLength?: number;\n multiple?: boolean;\n /** 目录上传模式(webkitdirectory),选中整个文件夹并保留 webkitRelativePath */\n directory?: boolean;\n size?: 'small' | 'middle' | 'large';\n accept?: string;\n\n /* ---- UI 变体 ---- */\n /** panel = 拖拽面板(Dragger 样式),button = 按钮(默认) */\n variant?: UploadVariant;\n children?: React.ReactNode;\n renderTips?: () => React.ReactNode;\n\n /* ---- 文件列表展示 ---- */\n /** 是否展示已上传文件列表,默认 true(tips 下方) */\n showFileList?: boolean;\n\n /* ---- 回调 ---- */\n onSave?: (fileList: UploadFile[]) => void;\n ossUpload?: boolean;\n onUpload?: (options: {\n file: File;\n onSuccess: (url?: string) => void;\n onError: (err: Error) => void;\n }) => Promise<void> | void;\n getPermission?: (file: File) => boolean;\n concurrentCount?: number;\n}\n\nexport type CommonUploadRef = {\n upload: () => void;\n uploading: boolean;\n};\n\n/* ---------- utils ---------- */\n\nconst formatSize = (bytes: number): string => {\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)}KB`;\n if (bytes < 1024 ** 3) return `${(bytes / 1024 / 1024).toFixed(0)}M`;\n return `${(bytes / 1024 ** 3).toFixed(1)}G`;\n};\n\nfunction buildTips(accept?: string, fileSize?: number, maxLength?: number): React.ReactNode {\n const parts: string[] = [];\n if (accept) {\n const exts = accept\n .split(',')\n .map((s) => s.trim().replace(/^\\./, ''))\n .filter(Boolean);\n if (exts.length) parts.push(`支持扩展名${exts.join(',')}`);\n }\n if (fileSize) parts.push(`单个文件大小不超过${formatSize(fileSize)}`);\n if (maxLength) parts.push(`最多上传${maxLength}个附件`);\n return parts.length ? (\n <Typography.Text type=\"secondary\" className={classNames('upload-item', styles['upload-item'])}>\n {parts.join(',')}\n </Typography.Text>\n ) : null;\n}\n\nfunction getExt(filename: string): string {\n const idx = filename.lastIndexOf('.');\n return idx >= 0 ? filename.slice(idx + 1).toUpperCase() : '';\n}\n\n/* ---------- 子组件:已上传文件列表 ---------- */\n\ninterface UploadedFilesProps {\n fileList: UploadFile[];\n onRemove: (uid: string) => void;\n}\n\nconst UploadedFiles: React.FC<UploadedFilesProps> = ({ fileList, onRemove }) => {\n if (!fileList.length) return null;\n\n return (\n <div className={classNames('upload-link', styles['upload-link'])}>\n {fileList.map((file) => (\n <div\n key={file.uid}\n className={classNames(\n classNames('upload-file-row', styles['upload-file-row']),\n file.status === 'error' && classNames('upload-file-row-error', styles['upload-file-row-error']),\n )}\n >\n <div className={classNames('upload-label', styles['upload-label'])}>\n <File className={classNames('upload-value', styles['upload-value'])} />\n <span className={classNames('upload-meta', styles['upload-meta'])}>{file.name}</span>\n <Tag color=\"processing\" className={classNames('upload-icon', styles['upload-icon'])}>\n {getExt(file.name)}\n </Tag>\n {file.size && (\n <Typography.Text type=\"secondary\" className={classNames('upload-title', styles['upload-title'])}>\n {formatSize(file.size)}\n </Typography.Text>\n )}\n </div>\n <Button\n type=\"text\"\n danger\n size=\"small\"\n icon={<Trash2 />}\n onClick={() => onRemove(file.uid)}\n className={classNames('upload-desc', styles['upload-desc'])}\n />\n </div>\n ))}\n </div>\n );\n};\n\n/* ---------- 主组件 ---------- */\n\n/**\n * CommonUpload — 通用上传组件\n *\n * - 在 antd `<Form.Item>` 内使用时,通过 `value`/`onChange` 自动接入表单\n * - 独立使用时,通过 `onSave` 获取文件列表\n *\n * ## 两种变体\n *\n * - **`variant=\"button\"`(默认)** — 虚线边框按钮 + 底部提示文案 + 已传文件列表\n * - **`variant=\"panel\"`** — Dragger 拖拽面板 + 底部已传文件列表\n *\n * @example\n * ```tsx\n * // 在 Form.Item 中使用\n * <Form.Item name=\"files\" label=\"简历附件\" rules={[{ required: true, message: '请上传文件' }]}>\n * <CommonUpload accept=\".pdf,.jpg,.png\" maxLength={10} />\n * </Form.Item>\n *\n * // 独立使用(Modal 内、非表单场景)\n * <CommonUpload variant=\"panel\" accept=\".doc,.pdf\" onSave={(list) => setFiles(list)} />\n *\n * // ref 手动触发上传\n * const ref = useRef<CommonUploadRef>(null);\n * <CommonUpload ref={ref} onUpload={...} />;\n * ref.current?.upload();\n * ```\n */\nconst CommonUpload = React.forwardRef<CommonUploadRef, CommonUploadProps>(\n (\n {\n value,\n onChange,\n className,\n variant,\n size,\n children,\n renderTips,\n showFileList = true,\n fileSize,\n maxLength,\n multiple,\n directory,\n accept,\n onUpload,\n onSave,\n getPermission,\n concurrentCount,\n },\n ref,\n ) => {\n const [innerFileList, setInnerFileList] = React.useState<UploadFile[]>([]);\n const [uploading, setUploading] = React.useState(false);\n\n // 受控模式:value 优先;非受控:内部状态\n const fileList = value ?? innerFileList;\n const setFileList = React.useCallback(\n (next: UploadFile[] | ((prev: UploadFile[]) => UploadFile[])) => {\n const resolved = typeof next === 'function' ? next(fileList) : next;\n onChange?.(resolved);\n setInnerFileList(resolved);\n onSave?.(resolved);\n },\n [fileList, onChange, onSave],\n );\n\n const effectiveFileSize = fileSize ?? 500 * 1024 * 1024;\n const concurrent = concurrentCount ?? 3;\n\n const beforeUploadFn = React.useCallback(\n (file: File): boolean => {\n if (getPermission && !getPermission(file)) {\n message.error('无权限上传此文件');\n return false;\n }\n if (file.size > effectiveFileSize) {\n message.error(`文件超出 ${formatSize(effectiveFileSize)} 限制`);\n return false;\n }\n return true;\n },\n [effectiveFileSize, getPermission],\n );\n\n const triggerUpload = React.useCallback(async () => {\n if (!onUpload || !fileList.length) return;\n setUploading(true);\n try {\n const pending = [...fileList];\n const pool: Promise<void>[] = [];\n while (pending.length) {\n const item = pending.shift();\n if (!item?.originFileObj) continue;\n const rawFile = item.originFileObj;\n pool.push(\n new Promise<void>((resolve) => {\n onUpload({\n file: rawFile,\n onSuccess: (url?) => {\n setFileList((prev) =>\n prev.map((f) =>\n f.uid === item.uid ? { ...f, status: 'done' as const, url: url ?? f.url } : f,\n ),\n );\n resolve();\n },\n onError: (_err: Error) => {\n message.error(`${item.name} 上传失败`);\n setFileList((prev) =>\n prev.map((f) => (f.uid === item.uid ? { ...f, status: 'error' as const } : f)),\n );\n resolve();\n },\n });\n }),\n );\n if (pool.length >= concurrent) await Promise.race(pool);\n }\n await Promise.allSettled(pool);\n onSave?.(fileList);\n } finally {\n setUploading(false);\n }\n }, [fileList, onUpload, concurrent, onSave, setFileList]);\n\n React.useImperativeHandle(ref, () => ({ upload: triggerUpload, uploading }), [\n triggerUpload,\n uploading,\n ]);\n\n const tips = renderTips?.() ?? buildTips(accept, fileSize, maxLength);\n\n if (variant === 'panel') {\n return (\n <div className={className}>\n <Upload.Dragger\n fileList={fileList}\n beforeUpload={beforeUploadFn}\n onChange={(info) => setFileList(info.fileList)}\n multiple={multiple}\n directory={directory}\n accept={accept}\n showUploadList={false}\n customRequest={({ onSuccess }) => onSuccess?.({})}\n >\n <p className={classNames('upload-drag-icon', styles['upload-drag-icon'])}>\n <Inbox />\n </p>\n <p className=\"ant-upload-text\">点击或拖拽文件到此区域上传</p>\n <p>{tips}</p>\n </Upload.Dragger>\n {showFileList && (\n <UploadedFiles\n fileList={fileList}\n onRemove={(uid) => setFileList((prev) => prev.filter((f) => f.uid !== uid))}\n />\n )}\n </div>\n );\n }\n\n // button mode (default)\n return (\n <div className={className}>\n <Upload\n fileList={fileList}\n beforeUpload={beforeUploadFn}\n onChange={(info) => setFileList(info.fileList)}\n multiple={multiple}\n directory={directory}\n accept={accept}\n showUploadList={false}\n customRequest={({ onSuccess }) => onSuccess?.({})}\n >\n {children ?? (\n <Button\n size={size}\n icon={<UploadIcon />}\n className={classNames('upload-toolbar', styles['upload-toolbar'])}\n >\n 点击上传\n </Button>\n )}\n </Upload>\n <div className={classNames('upload-list', styles['upload-list'])}>{tips}</div>\n {showFileList && (\n <UploadedFiles\n fileList={fileList}\n onRemove={(uid) => setFileList((prev) => prev.filter((f) => f.uid !== uid))}\n />\n )}\n </div>\n );\n },\n);\n\nCommonUpload.displayName = 'CommonUpload';\n\nexport default CommonUpload;\n"],"names":["formatSize","bytes","buildTips","accept","fileSize","maxLength","parts","exts","s","jsx","Typography","classNames","styles","getExt","filename","idx","UploadedFiles","fileList","onRemove","file","jsxs","File","Tag","Button","Trash2","CommonUpload","React","value","onChange","className","variant","size","children","renderTips","showFileList","multiple","directory","onUpload","onSave","getPermission","concurrentCount","ref","innerFileList","setInnerFileList","uploading","setUploading","setFileList","next","resolved","effectiveFileSize","concurrent","beforeUploadFn","message","triggerUpload","pending","pool","item","rawFile","resolve","url","prev","f","_err","tips","Upload","info","onSuccess","Inbox","uid","UploadIcon"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Upload/index.tsx"],"sourcesContent":["import { Trash2, File, Inbox, Upload as UploadIcon } from '@/components/Icons';\nimport { Button, message, Tag, Typography, Upload } from 'antd';\nimport type { UploadFile } from 'antd/es/upload/interface';\nimport React from 'react';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\n/* ---------- types ---------- */\n\n/** 上传变体 */\nexport type UploadVariant = 'panel' | 'button';\n\nexport interface CommonUploadProps {\n /* ---- antd Form.Item 兼容属性 ---- */\n value?: UploadFile[];\n onChange?: (value: UploadFile[]) => void;\n\n /* ---- 容器/样式 ---- */\n className?: string;\n\n /* ---- 上传配置 ---- */\n /** 单文件大小限制(字节),默认 500MB */\n fileSize?: number;\n /** 最大上传数量 */\n maxLength?: number;\n multiple?: boolean;\n /** 目录上传模式(webkitdirectory),选中整个文件夹并保留 webkitRelativePath */\n directory?: boolean;\n size?: 'small' | 'middle' | 'large';\n accept?: string;\n\n /* ---- UI 变体 ---- */\n /** panel = 拖拽面板(Dragger 样式),button = 按钮(默认) */\n variant?: UploadVariant;\n children?: React.ReactNode;\n renderTips?: () => React.ReactNode;\n\n /* ---- 文件列表展示 ---- */\n /** 是否展示已上传文件列表,默认 true(tips 下方) */\n showFileList?: boolean;\n\n /* ---- 回调 ---- */\n onSave?: (fileList: UploadFile[]) => void;\n ossUpload?: boolean;\n onUpload?: (options: {\n file: File;\n onSuccess: (url?: string) => void;\n onError: (err: Error) => void;\n }) => Promise<void> | void;\n getPermission?: (file: File) => boolean;\n concurrentCount?: number;\n}\n\nexport type CommonUploadRef = {\n upload: () => void;\n uploading: boolean;\n};\n\n/* ---------- utils ---------- */\n\nconst formatSize = (bytes: number): string => {\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)}KB`;\n if (bytes < 1024 ** 3) return `${(bytes / 1024 / 1024).toFixed(0)}M`;\n return `${(bytes / 1024 ** 3).toFixed(1)}G`;\n};\n\nfunction buildTips(accept?: string, fileSize?: number, maxLength?: number): React.ReactNode {\n const parts: string[] = [];\n if (accept) {\n const exts = accept\n .split(',')\n .map((s) => s.trim().replace(/^\\./, ''))\n .filter(Boolean);\n if (exts.length) parts.push(`支持扩展名${exts.join(',')}`);\n }\n if (fileSize) parts.push(`单个文件大小不超过${formatSize(fileSize)}`);\n if (maxLength) parts.push(`最多上传${maxLength}个附件`);\n return parts.length ? (\n <Typography.Text type=\"secondary\" className={classNames('upload-item', styles['upload-item'])}>\n {parts.join(',')}\n </Typography.Text>\n ) : null;\n}\n\nfunction getExt(filename: string): string {\n const idx = filename.lastIndexOf('.');\n return idx >= 0 ? filename.slice(idx + 1).toUpperCase() : '';\n}\n\n/* ---------- 子组件:已上传文件列表 ---------- */\n\ninterface UploadedFilesProps {\n fileList: UploadFile[];\n onRemove: (uid: string) => void;\n}\n\nconst UploadedFiles: React.FC<UploadedFilesProps> = ({ fileList, onRemove }) => {\n if (!fileList.length) return null;\n\n return (\n <div className={classNames('upload-link', styles['upload-link'])}>\n {fileList.map((file) => (\n <div\n key={file.uid}\n className={classNames(\n classNames('upload-file-row', styles['upload-file-row']),\n file.status === 'error' &&\n classNames('upload-file-row-error', styles['upload-file-row-error']),\n )}\n >\n <div className={classNames('upload-label', styles['upload-label'])}>\n <File className={classNames('upload-value', styles['upload-value'])} />\n <span className={classNames('upload-meta', styles['upload-meta'])}>{file.name}</span>\n <Tag color=\"processing\" className={classNames('upload-icon', styles['upload-icon'])}>\n {getExt(file.name)}\n </Tag>\n {file.size && (\n <Typography.Text\n type=\"secondary\"\n className={classNames('upload-title', styles['upload-title'])}\n >\n {formatSize(file.size)}\n </Typography.Text>\n )}\n </div>\n <Button\n type=\"text\"\n danger\n size=\"small\"\n icon={<Trash2 />}\n onClick={() => onRemove(file.uid)}\n className={classNames('upload-desc', styles['upload-desc'])}\n />\n </div>\n ))}\n </div>\n );\n};\n\n/* ---------- 主组件 ---------- */\n\n/**\n * CommonUpload — 通用上传组件\n *\n * - 在 antd `<Form.Item>` 内使用时,通过 `value`/`onChange` 自动接入表单\n * - 独立使用时,通过 `onSave` 获取文件列表\n *\n * ## 两种变体\n *\n * - **`variant=\"button\"`(默认)** — 虚线边框按钮 + 底部提示文案 + 已传文件列表\n * - **`variant=\"panel\"`** — Dragger 拖拽面板 + 底部已传文件列表\n *\n * @example\n * ```tsx\n * // 在 Form.Item 中使用\n * <Form.Item name=\"files\" label=\"简历附件\" rules={[{ required: true, message: '请上传文件' }]}>\n * <CommonUpload accept=\".pdf,.jpg,.png\" maxLength={10} />\n * </Form.Item>\n *\n * // 独立使用(Modal 内、非表单场景)\n * <CommonUpload variant=\"panel\" accept=\".doc,.pdf\" onSave={(list) => setFiles(list)} />\n *\n * // ref 手动触发上传\n * const ref = useRef<CommonUploadRef>(null);\n * <CommonUpload ref={ref} onUpload={...} />;\n * ref.current?.upload();\n * ```\n */\nconst CommonUpload = React.forwardRef<CommonUploadRef, CommonUploadProps>(\n (\n {\n value,\n onChange,\n className,\n variant,\n size,\n children,\n renderTips,\n showFileList = true,\n fileSize,\n maxLength,\n multiple,\n directory,\n accept,\n onUpload,\n onSave,\n getPermission,\n concurrentCount,\n },\n ref,\n ) => {\n const [innerFileList, setInnerFileList] = React.useState<UploadFile[]>([]);\n const [uploading, setUploading] = React.useState(false);\n\n // 受控模式:value 优先;非受控:内部状态\n const fileList = value ?? innerFileList;\n const setFileList = React.useCallback(\n (next: UploadFile[] | ((prev: UploadFile[]) => UploadFile[])) => {\n const resolved = typeof next === 'function' ? next(fileList) : next;\n onChange?.(resolved);\n setInnerFileList(resolved);\n onSave?.(resolved);\n },\n [fileList, onChange, onSave],\n );\n\n const effectiveFileSize = fileSize ?? 500 * 1024 * 1024;\n const concurrent = concurrentCount ?? 3;\n\n const beforeUploadFn = React.useCallback(\n (file: File) => {\n if (getPermission && !getPermission(file)) {\n message.error('无权限上传此文件');\n return Upload.LIST_IGNORE;\n }\n if (file.size > effectiveFileSize) {\n message.error(`文件超出 ${formatSize(effectiveFileSize)} 限制`);\n return Upload.LIST_IGNORE;\n }\n return true;\n },\n [effectiveFileSize, getPermission],\n );\n\n const triggerUpload = React.useCallback(async () => {\n if (!onUpload || !fileList.length) return;\n setUploading(true);\n try {\n const pending = [...fileList];\n const pool: Promise<void>[] = [];\n while (pending.length) {\n const item = pending.shift();\n if (!item?.originFileObj) continue;\n const rawFile = item.originFileObj;\n pool.push(\n new Promise<void>((resolve) => {\n onUpload({\n file: rawFile,\n onSuccess: (url?) => {\n setFileList((prev) =>\n prev.map((f) =>\n f.uid === item.uid ? { ...f, status: 'done' as const, url: url ?? f.url } : f,\n ),\n );\n resolve();\n },\n onError: (_err: Error) => {\n message.error(`${item.name} 上传失败`);\n setFileList((prev) =>\n prev.map((f) => (f.uid === item.uid ? { ...f, status: 'error' as const } : f)),\n );\n resolve();\n },\n });\n }),\n );\n if (pool.length >= concurrent) await Promise.race(pool);\n }\n await Promise.allSettled(pool);\n onSave?.(fileList);\n } finally {\n setUploading(false);\n }\n }, [fileList, onUpload, concurrent, onSave, setFileList]);\n\n React.useImperativeHandle(ref, () => ({ upload: triggerUpload, uploading }), [\n triggerUpload,\n uploading,\n ]);\n\n const tips = renderTips?.() ?? buildTips(accept, fileSize, maxLength);\n\n if (variant === 'panel') {\n return (\n <div className={className}>\n <Upload.Dragger\n fileList={fileList}\n beforeUpload={beforeUploadFn}\n onChange={(info) => setFileList(info.fileList)}\n multiple={multiple}\n directory={directory}\n accept={accept}\n showUploadList={false}\n customRequest={({ onSuccess }) => onSuccess?.({})}\n >\n <p className={classNames('upload-drag-icon', styles['upload-drag-icon'])}>\n <Inbox />\n </p>\n <p className=\"ant-upload-text\">点击或拖拽文件到此区域上传</p>\n <p>{tips}</p>\n </Upload.Dragger>\n {showFileList && (\n <UploadedFiles\n fileList={fileList}\n onRemove={(uid) => setFileList((prev) => prev.filter((f) => f.uid !== uid))}\n />\n )}\n </div>\n );\n }\n\n // button mode (default)\n return (\n <div className={className}>\n <Upload\n fileList={fileList}\n beforeUpload={beforeUploadFn}\n onChange={(info) => setFileList(info.fileList)}\n multiple={multiple}\n directory={directory}\n accept={accept}\n showUploadList={false}\n customRequest={({ onSuccess }) => onSuccess?.({})}\n >\n {children ?? (\n <Button\n size={size}\n icon={<UploadIcon />}\n className={classNames('upload-toolbar', styles['upload-toolbar'])}\n >\n 点击上传\n </Button>\n )}\n </Upload>\n <div className={classNames('upload-list', styles['upload-list'])}>{tips}</div>\n {showFileList && (\n <UploadedFiles\n fileList={fileList}\n onRemove={(uid) => setFileList((prev) => prev.filter((f) => f.uid !== uid))}\n />\n )}\n </div>\n );\n },\n);\n\nCommonUpload.displayName = 'CommonUpload';\n\nexport default CommonUpload;\n"],"names":["formatSize","bytes","buildTips","accept","fileSize","maxLength","parts","exts","s","jsx","Typography","classNames","styles","getExt","filename","idx","UploadedFiles","fileList","onRemove","file","jsxs","File","Tag","Button","Trash2","CommonUpload","React","value","onChange","className","variant","size","children","renderTips","showFileList","multiple","directory","onUpload","onSave","getPermission","concurrentCount","ref","innerFileList","setInnerFileList","uploading","setUploading","setFileList","next","resolved","effectiveFileSize","concurrent","beforeUploadFn","message","Upload","triggerUpload","pending","pool","item","rawFile","resolve","url","prev","f","_err","tips","info","onSuccess","Inbox","uid","UploadIcon"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hkyhy/marsun-components-core",
3
- "version": "0.1.39",
3
+ "version": "0.1.42",
4
4
  "description": "Marsun pure UI component library",
5
5
  "type": "module",
6
6
  "repository": {