sa2kit 1.6.3 → 1.6.6

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.
Files changed (119) hide show
  1. package/dist/audioDetection/index.js.map +1 -1
  2. package/dist/audioDetection/index.mjs.map +1 -1
  3. package/dist/auth/index.d.mts +26 -1
  4. package/dist/auth/index.d.ts +26 -1
  5. package/dist/auth/index.js +51 -23
  6. package/dist/auth/index.js.map +1 -1
  7. package/dist/auth/index.mjs +34 -3
  8. package/dist/auth/index.mjs.map +1 -1
  9. package/dist/auth/middleware/index.js +3 -3
  10. package/dist/auth/middleware/index.mjs +2 -2
  11. package/dist/auth/routes/index.js +14 -14
  12. package/dist/auth/routes/index.mjs +2 -2
  13. package/dist/auth/services/index.d.mts +1 -0
  14. package/dist/auth/services/index.d.ts +1 -0
  15. package/dist/auth/services/index.js +7 -7
  16. package/dist/auth/services/index.mjs +1 -1
  17. package/dist/calendar/index.d.mts +1197 -0
  18. package/dist/calendar/index.d.ts +1197 -0
  19. package/dist/calendar/index.js +5376 -0
  20. package/dist/calendar/index.js.map +1 -0
  21. package/dist/calendar/index.mjs +5311 -0
  22. package/dist/calendar/index.mjs.map +1 -0
  23. package/dist/calendar/routes/index.d.mts +118 -0
  24. package/dist/calendar/routes/index.d.ts +118 -0
  25. package/dist/calendar/routes/index.js +335 -0
  26. package/dist/calendar/routes/index.js.map +1 -0
  27. package/dist/calendar/routes/index.mjs +327 -0
  28. package/dist/calendar/routes/index.mjs.map +1 -0
  29. package/dist/calendar/server.d.mts +1184 -0
  30. package/dist/calendar/server.d.ts +1184 -0
  31. package/dist/calendar/server.js +219 -0
  32. package/dist/calendar/server.js.map +1 -0
  33. package/dist/calendar/server.mjs +165 -0
  34. package/dist/calendar/server.mjs.map +1 -0
  35. package/dist/{chunk-EBP7AE6F.js → chunk-2ODO4HEI.js} +48 -20
  36. package/dist/chunk-2ODO4HEI.js.map +1 -0
  37. package/dist/{chunk-RCNNVNLT.mjs → chunk-3BGPZN4X.mjs} +8 -3
  38. package/dist/chunk-3BGPZN4X.mjs.map +1 -0
  39. package/dist/{chunk-FV3FNHQY.js → chunk-6W5BMXJG.js} +4 -4
  40. package/dist/{chunk-FV3FNHQY.js.map → chunk-6W5BMXJG.js.map} +1 -1
  41. package/dist/chunk-6WXOA4BE.mjs +302 -0
  42. package/dist/chunk-6WXOA4BE.mjs.map +1 -0
  43. package/dist/{chunk-NMF4ANIC.js → chunk-7Z5LLJ3A.js} +8 -2
  44. package/dist/chunk-7Z5LLJ3A.js.map +1 -0
  45. package/dist/chunk-AXP7KROR.js +314 -0
  46. package/dist/chunk-AXP7KROR.js.map +1 -0
  47. package/dist/{chunk-42IJ7HEI.js → chunk-CD77U7LZ.js} +5 -5
  48. package/dist/{chunk-42IJ7HEI.js.map → chunk-CD77U7LZ.js.map} +1 -1
  49. package/dist/{chunk-6BL3AZGD.js → chunk-DUHZ7VZP.js} +2 -2
  50. package/dist/chunk-DUHZ7VZP.js.map +1 -0
  51. package/dist/{chunk-6VHWOPRR.mjs → chunk-ESRCX5TQ.mjs} +3 -3
  52. package/dist/{chunk-6VHWOPRR.mjs.map → chunk-ESRCX5TQ.mjs.map} +1 -1
  53. package/dist/{chunk-QKXKXAAV.js → chunk-G4AMEDO5.js} +2 -2
  54. package/dist/{chunk-QKXKXAAV.js.map → chunk-G4AMEDO5.js.map} +1 -1
  55. package/dist/chunk-GAC4J5GX.js +228 -0
  56. package/dist/chunk-GAC4J5GX.js.map +1 -0
  57. package/dist/chunk-IEA55H3G.js +106 -0
  58. package/dist/chunk-IEA55H3G.js.map +1 -0
  59. package/dist/{chunk-U2L6V7KD.mjs → chunk-OCR5DS4C.mjs} +2 -2
  60. package/dist/chunk-OCR5DS4C.mjs.map +1 -0
  61. package/dist/{chunk-IBLB7ARJ.mjs → chunk-QAT2RWAO.mjs} +3 -3
  62. package/dist/{chunk-IBLB7ARJ.mjs.map → chunk-QAT2RWAO.mjs.map} +1 -1
  63. package/dist/chunk-R2F4BXUU.mjs +100 -0
  64. package/dist/chunk-R2F4BXUU.mjs.map +1 -0
  65. package/dist/chunk-T6TE7GTY.mjs +218 -0
  66. package/dist/chunk-T6TE7GTY.mjs.map +1 -0
  67. package/dist/{chunk-MBG4DBGP.mjs → chunk-ZCLAF3XN.mjs} +47 -19
  68. package/dist/chunk-ZCLAF3XN.mjs.map +1 -0
  69. package/dist/{chunk-6LEA37ZM.mjs → chunk-ZYXF3L6T.mjs} +2 -2
  70. package/dist/{chunk-6LEA37ZM.mjs.map → chunk-ZYXF3L6T.mjs.map} +1 -1
  71. package/dist/imageCrop/index.js.map +1 -1
  72. package/dist/imageCrop/index.mjs.map +1 -1
  73. package/dist/{index-DtLpANUB.d.mts → index-DSel44Ke.d.mts} +24 -1
  74. package/dist/{index-DtLpANUB.d.ts → index-DSel44Ke.d.ts} +24 -1
  75. package/dist/index.d.mts +426 -3
  76. package/dist/index.d.ts +426 -3
  77. package/dist/index.js +2116 -65
  78. package/dist/index.js.map +1 -1
  79. package/dist/index.mjs +1949 -33
  80. package/dist/index.mjs.map +1 -1
  81. package/dist/mmd/index.d.mts +78 -1
  82. package/dist/mmd/index.d.ts +78 -1
  83. package/dist/mmd/index.js +397 -50
  84. package/dist/mmd/index.js.map +1 -1
  85. package/dist/mmd/index.mjs +399 -53
  86. package/dist/mmd/index.mjs.map +1 -1
  87. package/dist/music/index.d.mts +54 -5
  88. package/dist/music/index.d.ts +54 -5
  89. package/dist/music/index.js +35 -435
  90. package/dist/music/index.js.map +1 -1
  91. package/dist/music/index.mjs +2 -424
  92. package/dist/music/index.mjs.map +1 -1
  93. package/dist/music/server/index.d.mts +1 -1
  94. package/dist/music/server/index.d.ts +1 -1
  95. package/dist/music/server/index.js +14 -6
  96. package/dist/music/server/index.mjs +1 -1
  97. package/dist/testYourself/admin/index.js +3 -3
  98. package/dist/testYourself/admin/index.mjs +1 -1
  99. package/dist/testYourself/index.js +7 -7
  100. package/dist/testYourself/index.js.map +1 -1
  101. package/dist/testYourself/index.mjs +2 -2
  102. package/dist/testYourself/index.mjs.map +1 -1
  103. package/dist/universalFile/index.d.mts +125 -7
  104. package/dist/universalFile/index.d.ts +125 -7
  105. package/dist/universalFile/index.js +1253 -30
  106. package/dist/universalFile/index.js.map +1 -1
  107. package/dist/universalFile/index.mjs +1244 -23
  108. package/dist/universalFile/index.mjs.map +1 -1
  109. package/dist/utils/index.d.mts +5 -1
  110. package/dist/utils/index.d.ts +5 -1
  111. package/dist/utils/index.js +13 -9
  112. package/dist/utils/index.mjs +1 -1
  113. package/package.json +18 -3
  114. package/dist/chunk-6BL3AZGD.js.map +0 -1
  115. package/dist/chunk-EBP7AE6F.js.map +0 -1
  116. package/dist/chunk-MBG4DBGP.mjs.map +0 -1
  117. package/dist/chunk-NMF4ANIC.js.map +0 -1
  118. package/dist/chunk-RCNNVNLT.mjs.map +0 -1
  119. package/dist/chunk-U2L6V7KD.mjs.map +0 -1
@@ -2,12 +2,12 @@
2
2
 
3
3
  var chunkZRAW3HXA_js = require('../chunk-ZRAW3HXA.js');
4
4
  require('../chunk-DGUM43GV.js');
5
- var React = require('react');
5
+ var React2 = require('react');
6
6
  var lucideReact = require('lucide-react');
7
7
 
8
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
9
 
10
- var React__default = /*#__PURE__*/_interopDefault(React);
10
+ var React2__default = /*#__PURE__*/_interopDefault(React2);
11
11
 
12
12
  // src/universalFile/constants.ts
13
13
  var UNIVERSAL_FILE_VERSION = "1.0.0";
@@ -794,15 +794,15 @@ var FileUploader = ({
794
794
  disabled = false,
795
795
  mode = "normal"
796
796
  }) => {
797
- const [uploadingFiles, setUploadingFiles] = React.useState([]);
798
- const [isDragOver, setIsDragOver] = React.useState(false);
799
- const [completedFiles, setCompletedFiles] = React.useState([]);
800
- const fileInputRef = React.useRef(null);
797
+ const [uploadingFiles, setUploadingFiles] = React2.useState([]);
798
+ const [isDragOver, setIsDragOver] = React2.useState(false);
799
+ const [completedFiles, setCompletedFiles] = React2.useState([]);
800
+ const fileInputRef = React2.useRef(null);
801
801
  const getFileIcon = (mimeType) => {
802
- if (mimeType.startsWith("image/")) return /* @__PURE__ */ React__default.default.createElement(lucideReact.Image, { className: "w-5 h-5" });
803
- if (mimeType.startsWith("video/")) return /* @__PURE__ */ React__default.default.createElement(lucideReact.Film, { className: "w-5 h-5" });
804
- if (mimeType.startsWith("audio/")) return /* @__PURE__ */ React__default.default.createElement(lucideReact.Music, { className: "w-5 h-5" });
805
- return /* @__PURE__ */ React__default.default.createElement(lucideReact.FileText, { className: "w-5 h-5" });
802
+ if (mimeType.startsWith("image/")) return /* @__PURE__ */ React2__default.default.createElement(lucideReact.Image, { className: "w-5 h-5" });
803
+ if (mimeType.startsWith("video/")) return /* @__PURE__ */ React2__default.default.createElement(lucideReact.Film, { className: "w-5 h-5" });
804
+ if (mimeType.startsWith("audio/")) return /* @__PURE__ */ React2__default.default.createElement(lucideReact.Music, { className: "w-5 h-5" });
805
+ return /* @__PURE__ */ React2__default.default.createElement(lucideReact.FileText, { className: "w-5 h-5" });
806
806
  };
807
807
  const validateFile2 = (file) => {
808
808
  if (file.size > maxFileSize * 1024 * 1024) {
@@ -813,7 +813,7 @@ var FileUploader = ({
813
813
  }
814
814
  return null;
815
815
  };
816
- const uploadFile = React.useCallback(
816
+ const uploadFile = React2.useCallback(
817
817
  async (file) => {
818
818
  const fileId = `upload_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
819
819
  const error = validateFile2(file);
@@ -883,7 +883,7 @@ var FileUploader = ({
883
883
  uploadingFiles
884
884
  ]
885
885
  );
886
- const handleFileSelect = React.useCallback(
886
+ const handleFileSelect = React2.useCallback(
887
887
  (files) => {
888
888
  const fileArray = Array.from(files);
889
889
  if (completedFiles.length + uploadingFiles.length + fileArray.length > maxFiles) {
@@ -961,7 +961,7 @@ var FileUploader = ({
961
961
  p-6 text-center
962
962
  ${mode === "compact" ? "p-4" : mode === "detailed" ? "p-8" : "p-6"}
963
963
  `;
964
- return /* @__PURE__ */ React__default.default.createElement("div", { className: "w-full space-y-4" }, /* @__PURE__ */ React__default.default.createElement(
964
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "w-full space-y-4" }, /* @__PURE__ */ React2__default.default.createElement(
965
965
  "div",
966
966
  {
967
967
  className: containerClasses,
@@ -970,13 +970,13 @@ var FileUploader = ({
970
970
  onDrop: handleDrop,
971
971
  onClick: handleClick
972
972
  },
973
- /* @__PURE__ */ React__default.default.createElement("div", { className: uploadAreaClasses }, /* @__PURE__ */ React__default.default.createElement(
973
+ /* @__PURE__ */ React2__default.default.createElement("div", { className: uploadAreaClasses }, /* @__PURE__ */ React2__default.default.createElement(
974
974
  lucideReact.Upload,
975
975
  {
976
976
  className: `mx-auto mb-4 text-gray-400 ${mode === "compact" ? "w-8 h-8 mb-2" : "w-12 h-12"}`
977
977
  }
978
- ), mode === "compact" ? /* @__PURE__ */ React__default.default.createElement("p", { className: "text-sm text-gray-600 dark:text-gray-400" }, "\u70B9\u51FB\u4E0A\u4F20\u6216\u62D6\u62FD\u6587\u4EF6\u5230\u8FD9\u91CC") : /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-700 dark:text-gray-300 mb-2" }, "\u4E0A\u4F20\u6587\u4EF6"), /* @__PURE__ */ React__default.default.createElement("p", { className: "text-gray-600 dark:text-gray-400 mb-2" }, "\u70B9\u51FB\u9009\u62E9\u6587\u4EF6\u6216\u62D6\u62FD\u6587\u4EF6\u5230\u8FD9\u91CC"), mode === "detailed" && /* @__PURE__ */ React__default.default.createElement("div", { className: "text-sm text-gray-500 space-y-1" }, acceptedTypes.length > 0 && /* @__PURE__ */ React__default.default.createElement("p", null, "\u652F\u6301\u683C\u5F0F: ", acceptedTypes.join(", ")), /* @__PURE__ */ React__default.default.createElement("p", null, "\u6700\u5927\u5927\u5C0F: ", maxFileSize, "MB | \u6700\u591A\u6587\u4EF6: ", maxFiles, "\u4E2A")))),
979
- /* @__PURE__ */ React__default.default.createElement(
978
+ ), mode === "compact" ? /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-sm text-gray-600 dark:text-gray-400" }, "\u70B9\u51FB\u4E0A\u4F20\u6216\u62D6\u62FD\u6587\u4EF6\u5230\u8FD9\u91CC") : /* @__PURE__ */ React2__default.default.createElement(React2__default.default.Fragment, null, /* @__PURE__ */ React2__default.default.createElement("h3", { className: "text-lg font-semibold text-gray-700 dark:text-gray-300 mb-2" }, "\u4E0A\u4F20\u6587\u4EF6"), /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-gray-600 dark:text-gray-400 mb-2" }, "\u70B9\u51FB\u9009\u62E9\u6587\u4EF6\u6216\u62D6\u62FD\u6587\u4EF6\u5230\u8FD9\u91CC"), mode === "detailed" && /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-sm text-gray-500 space-y-1" }, acceptedTypes.length > 0 && /* @__PURE__ */ React2__default.default.createElement("p", null, "\u652F\u6301\u683C\u5F0F: ", acceptedTypes.join(", ")), /* @__PURE__ */ React2__default.default.createElement("p", null, "\u6700\u5927\u5927\u5C0F: ", maxFileSize, "MB | \u6700\u591A\u6587\u4EF6: ", maxFiles, "\u4E2A")))),
979
+ /* @__PURE__ */ React2__default.default.createElement(
980
980
  "input",
981
981
  {
982
982
  ref: fileInputRef,
@@ -988,21 +988,21 @@ var FileUploader = ({
988
988
  disabled
989
989
  }
990
990
  )
991
- ), uploadingFiles.length > 0 && /* @__PURE__ */ React__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React__default.default.createElement("h4", { className: "text-sm font-medium text-gray-700 dark:text-gray-300" }, "\u4E0A\u4F20\u4E2D (", uploadingFiles.length, ")"), uploadingFiles.map((uploadingFile) => /* @__PURE__ */ React__default.default.createElement(
991
+ ), uploadingFiles.length > 0 && /* @__PURE__ */ React2__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React2__default.default.createElement("h4", { className: "text-sm font-medium text-gray-700 dark:text-gray-300" }, "\u4E0A\u4F20\u4E2D (", uploadingFiles.length, ")"), uploadingFiles.map((uploadingFile) => /* @__PURE__ */ React2__default.default.createElement(
992
992
  "div",
993
993
  {
994
994
  key: uploadingFile.id,
995
995
  className: "flex items-center space-x-3 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg"
996
996
  },
997
- /* @__PURE__ */ React__default.default.createElement("div", { className: "flex-shrink-0" }, uploadingFile.progress.status === "failed" ? /* @__PURE__ */ React__default.default.createElement(lucideReact.AlertCircle, { className: "w-5 h-5 text-red-500" }) : uploadingFile.progress.status === "completed" ? /* @__PURE__ */ React__default.default.createElement(lucideReact.CheckCircle2, { className: "w-5 h-5 text-green-500" }) : /* @__PURE__ */ React__default.default.createElement(lucideReact.Loader2, { className: "w-5 h-5 text-blue-500 animate-spin" })),
998
- /* @__PURE__ */ React__default.default.createElement("div", { className: "flex-grow min-w-0" }, /* @__PURE__ */ React__default.default.createElement("div", { className: "flex items-center justify-between mb-1" }, /* @__PURE__ */ React__default.default.createElement("p", { className: "text-sm font-medium text-gray-700 dark:text-gray-300 truncate" }, uploadingFile.file.name), /* @__PURE__ */ React__default.default.createElement("span", { className: "text-xs text-gray-500" }, formatFileSize2(uploadingFile.file.size))), uploadingFile.error ? /* @__PURE__ */ React__default.default.createElement("p", { className: "text-xs text-red-500" }, uploadingFile.error) : /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement("div", { className: "w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2 mb-1" }, /* @__PURE__ */ React__default.default.createElement(
997
+ /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex-shrink-0" }, uploadingFile.progress.status === "failed" ? /* @__PURE__ */ React2__default.default.createElement(lucideReact.AlertCircle, { className: "w-5 h-5 text-red-500" }) : uploadingFile.progress.status === "completed" ? /* @__PURE__ */ React2__default.default.createElement(lucideReact.CheckCircle2, { className: "w-5 h-5 text-green-500" }) : /* @__PURE__ */ React2__default.default.createElement(lucideReact.Loader2, { className: "w-5 h-5 text-blue-500 animate-spin" })),
998
+ /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex-grow min-w-0" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-between mb-1" }, /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-sm font-medium text-gray-700 dark:text-gray-300 truncate" }, uploadingFile.file.name), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-xs text-gray-500" }, formatFileSize2(uploadingFile.file.size))), uploadingFile.error ? /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-xs text-red-500" }, uploadingFile.error) : /* @__PURE__ */ React2__default.default.createElement(React2__default.default.Fragment, null, /* @__PURE__ */ React2__default.default.createElement("div", { className: "w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2 mb-1" }, /* @__PURE__ */ React2__default.default.createElement(
999
999
  "div",
1000
1000
  {
1001
1001
  className: "bg-blue-500 h-2 rounded-full transition-all duration-300",
1002
1002
  style: { width: `${uploadingFile.progress.progress}%` }
1003
1003
  }
1004
- )), /* @__PURE__ */ React__default.default.createElement("p", { className: "text-xs text-gray-500" }, formatProgress(uploadingFile.progress)))),
1005
- /* @__PURE__ */ React__default.default.createElement(
1004
+ )), /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-xs text-gray-500" }, formatProgress(uploadingFile.progress)))),
1005
+ /* @__PURE__ */ React2__default.default.createElement(
1006
1006
  "button",
1007
1007
  {
1008
1008
  onClick: (e) => {
@@ -1011,17 +1011,17 @@ var FileUploader = ({
1011
1011
  },
1012
1012
  className: "flex-shrink-0 p-1 text-gray-400 hover:text-red-500 transition-colors"
1013
1013
  },
1014
- /* @__PURE__ */ React__default.default.createElement(lucideReact.X, { className: "w-4 h-4" })
1014
+ /* @__PURE__ */ React2__default.default.createElement(lucideReact.X, { className: "w-4 h-4" })
1015
1015
  )
1016
- ))), completedFiles.length > 0 && /* @__PURE__ */ React__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React__default.default.createElement("h4", { className: "text-sm font-medium text-gray-700 dark:text-gray-300" }, "\u5DF2\u5B8C\u6210 (", completedFiles.length, ")"), completedFiles.map((file) => /* @__PURE__ */ React__default.default.createElement(
1016
+ ))), completedFiles.length > 0 && /* @__PURE__ */ React2__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React2__default.default.createElement("h4", { className: "text-sm font-medium text-gray-700 dark:text-gray-300" }, "\u5DF2\u5B8C\u6210 (", completedFiles.length, ")"), completedFiles.map((file) => /* @__PURE__ */ React2__default.default.createElement(
1017
1017
  "div",
1018
1018
  {
1019
1019
  key: file.id,
1020
1020
  className: "flex items-center space-x-3 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg"
1021
1021
  },
1022
- /* @__PURE__ */ React__default.default.createElement("div", { className: "flex-shrink-0" }, getFileIcon(file.mimeType)),
1023
- /* @__PURE__ */ React__default.default.createElement("div", { className: "flex-grow min-w-0" }, /* @__PURE__ */ React__default.default.createElement("div", { className: "flex items-center justify-between mb-1" }, /* @__PURE__ */ React__default.default.createElement("p", { className: "text-sm font-medium text-gray-700 dark:text-gray-300 truncate" }, file.originalName), /* @__PURE__ */ React__default.default.createElement("span", { className: "text-xs text-gray-500" }, formatFileSize2(file.size))), /* @__PURE__ */ React__default.default.createElement("p", { className: "text-xs text-green-600 dark:text-green-400" }, "\u4E0A\u4F20\u6210\u529F \u2022 ", new Date(file.uploadTime).toLocaleTimeString())),
1024
- /* @__PURE__ */ React__default.default.createElement(
1022
+ /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex-shrink-0" }, getFileIcon(file.mimeType)),
1023
+ /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex-grow min-w-0" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-between mb-1" }, /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-sm font-medium text-gray-700 dark:text-gray-300 truncate" }, file.originalName), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-xs text-gray-500" }, formatFileSize2(file.size))), /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-xs text-green-600 dark:text-green-400" }, "\u4E0A\u4F20\u6210\u529F \u2022 ", new Date(file.uploadTime).toLocaleTimeString())),
1024
+ /* @__PURE__ */ React2__default.default.createElement(
1025
1025
  "button",
1026
1026
  {
1027
1027
  onClick: (e) => {
@@ -1030,16 +1030,1237 @@ var FileUploader = ({
1030
1030
  },
1031
1031
  className: "flex-shrink-0 p-1 text-gray-400 hover:text-red-500 transition-colors"
1032
1032
  },
1033
- /* @__PURE__ */ React__default.default.createElement(lucideReact.X, { className: "w-4 h-4" })
1033
+ /* @__PURE__ */ React2__default.default.createElement(lucideReact.X, { className: "w-4 h-4" })
1034
1034
  )
1035
- ))), mode === "detailed" && (completedFiles.length > 0 || uploadingFiles.length > 0) && /* @__PURE__ */ React__default.default.createElement("div", { className: "flex justify-between items-center text-sm text-gray-500 pt-2 border-t border-gray-200 dark:border-gray-700" }, /* @__PURE__ */ React__default.default.createElement("span", null, "\u603B\u8BA1: ", completedFiles.length + uploadingFiles.length, " \u6587\u4EF6"), /* @__PURE__ */ React__default.default.createElement("span", null, "\u5927\u5C0F:", " ", formatFileSize2(
1035
+ ))), mode === "detailed" && (completedFiles.length > 0 || uploadingFiles.length > 0) && /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex justify-between items-center text-sm text-gray-500 pt-2 border-t border-gray-200 dark:border-gray-700" }, /* @__PURE__ */ React2__default.default.createElement("span", null, "\u603B\u8BA1: ", completedFiles.length + uploadingFiles.length, " \u6587\u4EF6"), /* @__PURE__ */ React2__default.default.createElement("span", null, "\u5927\u5C0F:", " ", formatFileSize2(
1036
1036
  [
1037
1037
  ...completedFiles.map((f) => f.size),
1038
1038
  ...uploadingFiles.map((f) => f.file.size)
1039
1039
  ].reduce((total, size) => total + size, 0)
1040
1040
  ))));
1041
1041
  };
1042
- var FileUploader_default = FileUploader;
1042
+ var MIME_TYPE_CATEGORIES = {
1043
+ "image": ["image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml"],
1044
+ "video": ["video/mp4", "video/avi", "video/mov", "video/webm"],
1045
+ "audio": ["audio/mp3", "audio/wav", "audio/ogg", "audio/aac"],
1046
+ "document": ["application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
1047
+ "archive": ["application/zip", "application/x-rar-compressed", "application/x-7z-compressed"]
1048
+ };
1049
+ var UniversalFileManager = ({
1050
+ moduleId,
1051
+ businessId,
1052
+ mode = "grid",
1053
+ allowUpload = true,
1054
+ allowDownload = true,
1055
+ allowDelete = false,
1056
+ allowBatch = true,
1057
+ showPreview = true,
1058
+ showSearch = true,
1059
+ showFilters = true,
1060
+ pageSize = 20,
1061
+ customActions = [],
1062
+ onFileSelect,
1063
+ onUploadComplete
1064
+ }) => {
1065
+ const [state, setState] = React2.useState({
1066
+ files: [],
1067
+ selectedFiles: /* @__PURE__ */ new Set(),
1068
+ loading: false,
1069
+ uploading: false,
1070
+ error: null,
1071
+ searchQuery: "",
1072
+ filters: {
1073
+ mimeType: "",
1074
+ dateRange: { start: null, end: null },
1075
+ sizeRange: { min: 0, max: Number.MAX_SAFE_INTEGER }
1076
+ },
1077
+ sortBy: "uploadTime",
1078
+ sortOrder: "desc",
1079
+ pagination: {
1080
+ page: 1,
1081
+ pageSize,
1082
+ total: 0,
1083
+ totalPages: 0
1084
+ },
1085
+ previewFile: null,
1086
+ showUploadModal: false
1087
+ });
1088
+ const loadFiles = React2.useCallback(async () => {
1089
+ setState((prev) => ({ ...prev, loading: true, error: null }));
1090
+ try {
1091
+ const queryOptions = {
1092
+ moduleId,
1093
+ businessId,
1094
+ page: state.pagination.page,
1095
+ pageSize: state.pagination.pageSize,
1096
+ sortBy: state.sortBy,
1097
+ sortOrder: state.sortOrder
1098
+ };
1099
+ if (state.searchQuery) {
1100
+ }
1101
+ if (state.filters.mimeType) {
1102
+ queryOptions.mimeType = state.filters.mimeType;
1103
+ }
1104
+ if (state.filters.dateRange.start) {
1105
+ queryOptions.startTime = state.filters.dateRange.start;
1106
+ }
1107
+ if (state.filters.dateRange.end) {
1108
+ queryOptions.endTime = state.filters.dateRange.end;
1109
+ }
1110
+ const mockResult = {
1111
+ items: [],
1112
+ total: 0,
1113
+ page: queryOptions.page || 1,
1114
+ pageSize: queryOptions.pageSize || 20,
1115
+ totalPages: 0,
1116
+ hasNext: false,
1117
+ hasPrev: false
1118
+ };
1119
+ setState((prev) => ({
1120
+ ...prev,
1121
+ files: mockResult.items,
1122
+ pagination: {
1123
+ page: mockResult.page,
1124
+ pageSize: mockResult.pageSize,
1125
+ total: mockResult.total,
1126
+ totalPages: mockResult.totalPages
1127
+ },
1128
+ loading: false
1129
+ }));
1130
+ } catch (error) {
1131
+ console.error("\u52A0\u8F7D\u6587\u4EF6\u5217\u8868\u5931\u8D25:", error);
1132
+ setState((prev) => ({
1133
+ ...prev,
1134
+ loading: false,
1135
+ error: error instanceof Error ? error.message : "\u52A0\u8F7D\u6587\u4EF6\u5217\u8868\u5931\u8D25"
1136
+ }));
1137
+ }
1138
+ }, [moduleId, businessId, state.searchQuery, state.filters, state.sortBy, state.sortOrder, state.pagination.page, state.pagination.pageSize]);
1139
+ React2.useEffect(() => {
1140
+ loadFiles();
1141
+ }, [loadFiles]);
1142
+ const handleFileSelect = React2.useCallback((fileId, selected) => {
1143
+ setState((prev) => {
1144
+ const newSelectedFiles = new Set(prev.selectedFiles);
1145
+ if (selected) {
1146
+ newSelectedFiles.add(fileId);
1147
+ } else {
1148
+ newSelectedFiles.delete(fileId);
1149
+ }
1150
+ const selectedFileList = prev.files.filter((file) => newSelectedFiles.has(file.id));
1151
+ if (onFileSelect) {
1152
+ onFileSelect(selectedFileList);
1153
+ }
1154
+ return {
1155
+ ...prev,
1156
+ selectedFiles: newSelectedFiles
1157
+ };
1158
+ });
1159
+ }, [onFileSelect, state.files]);
1160
+ const handleSelectAll = React2.useCallback((selected) => {
1161
+ setState((prev) => {
1162
+ const newSelectedFiles = selected ? new Set(prev.files.map((file) => file.id)) : /* @__PURE__ */ new Set();
1163
+ const selectedFileList = selected ? prev.files : [];
1164
+ if (onFileSelect) {
1165
+ onFileSelect(selectedFileList);
1166
+ }
1167
+ return {
1168
+ ...prev,
1169
+ selectedFiles: newSelectedFiles
1170
+ };
1171
+ });
1172
+ }, [onFileSelect, state.files]);
1173
+ const handleDeleteFiles = React2.useCallback(async (fileIds) => {
1174
+ if (!window.confirm(`\u786E\u5B9A\u8981\u5220\u9664\u9009\u4E2D\u7684 ${fileIds.length} \u4E2A\u6587\u4EF6\u5417\uFF1F`)) {
1175
+ return;
1176
+ }
1177
+ setState((prev) => ({ ...prev, loading: true }));
1178
+ try {
1179
+ console.log("\u5220\u9664\u6587\u4EF6:", fileIds);
1180
+ await loadFiles();
1181
+ setState((prev) => ({
1182
+ ...prev,
1183
+ selectedFiles: /* @__PURE__ */ new Set(),
1184
+ loading: false
1185
+ }));
1186
+ } catch (error) {
1187
+ console.error("\u5220\u9664\u6587\u4EF6\u5931\u8D25:", error);
1188
+ setState((prev) => ({
1189
+ ...prev,
1190
+ loading: false,
1191
+ error: error instanceof Error ? error.message : "\u5220\u9664\u6587\u4EF6\u5931\u8D25"
1192
+ }));
1193
+ }
1194
+ }, [loadFiles]);
1195
+ const handleDownloadFile = React2.useCallback(async (file) => {
1196
+ try {
1197
+ console.log("\u4E0B\u8F7D\u6587\u4EF6:", file.originalName);
1198
+ } catch (error) {
1199
+ console.error("\u4E0B\u8F7D\u6587\u4EF6\u5931\u8D25:", error);
1200
+ setState((prev) => ({
1201
+ ...prev,
1202
+ error: error instanceof Error ? error.message : "\u4E0B\u8F7D\u6587\u4EF6\u5931\u8D25"
1203
+ }));
1204
+ }
1205
+ }, []);
1206
+ const handlePreviewFile = React2.useCallback((file) => {
1207
+ setState((prev) => ({
1208
+ ...prev,
1209
+ previewFile: file
1210
+ }));
1211
+ }, []);
1212
+ const handleClosePreview = React2.useCallback(() => {
1213
+ setState((prev) => ({
1214
+ ...prev,
1215
+ previewFile: null
1216
+ }));
1217
+ }, []);
1218
+ const handleSearch = React2.useCallback((query) => {
1219
+ setState((prev) => ({
1220
+ ...prev,
1221
+ searchQuery: query,
1222
+ pagination: { ...prev.pagination, page: 1 }
1223
+ }));
1224
+ }, []);
1225
+ const handleFilterChange = React2.useCallback((filterType, value) => {
1226
+ setState((prev) => ({
1227
+ ...prev,
1228
+ filters: {
1229
+ ...prev.filters,
1230
+ [filterType]: value
1231
+ },
1232
+ pagination: { ...prev.pagination, page: 1 }
1233
+ }));
1234
+ }, []);
1235
+ React2.useCallback((field) => {
1236
+ setState((prev) => ({
1237
+ ...prev,
1238
+ sortBy: field,
1239
+ sortOrder: prev.sortBy === field && prev.sortOrder === "asc" ? "desc" : "asc",
1240
+ pagination: { ...prev.pagination, page: 1 }
1241
+ }));
1242
+ }, []);
1243
+ const handlePageChange = React2.useCallback((page) => {
1244
+ setState((prev) => ({
1245
+ ...prev,
1246
+ pagination: { ...prev.pagination, page }
1247
+ }));
1248
+ }, []);
1249
+ const formatFileSize2 = React2.useCallback((bytes) => {
1250
+ if (bytes === 0) return "0 B";
1251
+ const k = 1024;
1252
+ const sizes = ["B", "KB", "MB", "GB", "TB"];
1253
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
1254
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
1255
+ }, []);
1256
+ const getFileTypeIcon = React2.useCallback((mimeType) => {
1257
+ if (mimeType.startsWith("image/")) return "\u{1F5BC}\uFE0F";
1258
+ if (mimeType.startsWith("video/")) return "\u{1F3AC}";
1259
+ if (mimeType.startsWith("audio/")) return "\u{1F3B5}";
1260
+ if (mimeType.includes("pdf")) return "\u{1F4C4}";
1261
+ if (mimeType.includes("word")) return "\u{1F4DD}";
1262
+ if (mimeType.includes("excel")) return "\u{1F4CA}";
1263
+ if (mimeType.includes("powerpoint")) return "\u{1F4CA}";
1264
+ if (mimeType.includes("zip") || mimeType.includes("rar")) return "\u{1F4E6}";
1265
+ return "\u{1F4C1}";
1266
+ }, []);
1267
+ const getFileTypeLabel = React2.useCallback((mimeType) => {
1268
+ for (const [category, types] of Object.entries(MIME_TYPE_CATEGORIES)) {
1269
+ if (types.some((type) => mimeType.includes(type))) {
1270
+ return category;
1271
+ }
1272
+ }
1273
+ return "other";
1274
+ }, []);
1275
+ const isPreviewable = React2.useCallback((file) => {
1276
+ return file.mimeType.startsWith("image/") || file.mimeType.startsWith("video/") || file.mimeType.startsWith("audio/") || file.mimeType.includes("pdf");
1277
+ }, []);
1278
+ const renderFileItem = React2.useCallback((file) => {
1279
+ const isSelected = state.selectedFiles.has(file.id);
1280
+ const typeIcon = getFileTypeIcon(file.mimeType);
1281
+ const typeLabel = getFileTypeLabel(file.mimeType);
1282
+ return /* @__PURE__ */ React2__default.default.createElement(
1283
+ "div",
1284
+ {
1285
+ key: file.id,
1286
+ className: `relative border rounded-lg p-4 cursor-pointer transition-all duration-200 hover:shadow-md ${isSelected ? "border-blue-500 bg-blue-50" : "border-gray-200 hover:border-gray-300"}`,
1287
+ onClick: () => handleFileSelect(file.id, !isSelected)
1288
+ },
1289
+ allowBatch && /* @__PURE__ */ React2__default.default.createElement("div", { className: "absolute top-2 left-2" }, /* @__PURE__ */ React2__default.default.createElement(
1290
+ "input",
1291
+ {
1292
+ type: "checkbox",
1293
+ checked: isSelected,
1294
+ onChange: (e) => {
1295
+ e.stopPropagation();
1296
+ handleFileSelect(file.id, e.target.checked);
1297
+ },
1298
+ className: "w-4 h-4 text-blue-600 rounded border-gray-300 focus:ring-blue-500"
1299
+ }
1300
+ )),
1301
+ /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex flex-col items-center space-y-2" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-4xl" }, typeIcon), /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-center w-full" }, /* @__PURE__ */ React2__default.default.createElement("h3", { className: "font-medium text-sm text-gray-900 truncate", title: file.originalName }, file.originalName), /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-xs text-gray-500 mt-1" }, formatFileSize2(file.size)), /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-xs text-blue-600 capitalize" }, typeLabel), /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-xs text-gray-400" }, new Date(file.uploadTime).toLocaleDateString()))),
1302
+ /* @__PURE__ */ React2__default.default.createElement("div", { className: "absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex space-x-1" }, showPreview && isPreviewable(file) && /* @__PURE__ */ React2__default.default.createElement(
1303
+ "button",
1304
+ {
1305
+ onClick: (e) => {
1306
+ e.stopPropagation();
1307
+ handlePreviewFile(file);
1308
+ },
1309
+ className: "p-1 text-gray-600 hover:text-blue-600 hover:bg-white rounded",
1310
+ title: "\u9884\u89C8"
1311
+ },
1312
+ "\u{1F441}\uFE0F"
1313
+ ), allowDownload && /* @__PURE__ */ React2__default.default.createElement(
1314
+ "button",
1315
+ {
1316
+ onClick: (e) => {
1317
+ e.stopPropagation();
1318
+ handleDownloadFile(file);
1319
+ },
1320
+ className: "p-1 text-gray-600 hover:text-green-600 hover:bg-white rounded",
1321
+ title: "\u4E0B\u8F7D"
1322
+ },
1323
+ "\u2B07\uFE0F"
1324
+ ), allowDelete && /* @__PURE__ */ React2__default.default.createElement(
1325
+ "button",
1326
+ {
1327
+ onClick: (e) => {
1328
+ e.stopPropagation();
1329
+ handleDeleteFiles([file.id]);
1330
+ },
1331
+ className: "p-1 text-gray-600 hover:text-red-600 hover:bg-white rounded",
1332
+ title: "\u5220\u9664"
1333
+ },
1334
+ "\u{1F5D1}\uFE0F"
1335
+ )))
1336
+ );
1337
+ }, [
1338
+ state.selectedFiles,
1339
+ allowBatch,
1340
+ allowDownload,
1341
+ allowDelete,
1342
+ showPreview,
1343
+ handleFileSelect,
1344
+ handlePreviewFile,
1345
+ handleDownloadFile,
1346
+ handleDeleteFiles,
1347
+ getFileTypeIcon,
1348
+ getFileTypeLabel,
1349
+ formatFileSize2,
1350
+ isPreviewable
1351
+ ]);
1352
+ const renderSearchBar = () => {
1353
+ if (!showSearch) return null;
1354
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React2__default.default.createElement(
1355
+ "input",
1356
+ {
1357
+ type: "text",
1358
+ placeholder: "\u641C\u7D22\u6587\u4EF6\u540D...",
1359
+ value: state.searchQuery,
1360
+ onChange: (e) => handleSearch(e.target.value),
1361
+ className: "w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
1362
+ }
1363
+ ), /* @__PURE__ */ React2__default.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none" }, /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-gray-400" }, "\u{1F50D}"))));
1364
+ };
1365
+ const renderFilters = () => {
1366
+ if (!showFilters) return null;
1367
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "mb-6 p-4 bg-gray-50 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("h3", { className: "text-sm font-medium text-gray-700 mb-3" }, "\u7B5B\u9009\u5668"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4" }, /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-xs font-medium text-gray-700 mb-1" }, "\u6587\u4EF6\u7C7B\u578B"), /* @__PURE__ */ React2__default.default.createElement(
1368
+ "select",
1369
+ {
1370
+ value: state.filters.mimeType,
1371
+ onChange: (e) => handleFilterChange("mimeType", e.target.value),
1372
+ className: "w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500"
1373
+ },
1374
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "" }, "\u5168\u90E8"),
1375
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "image/" }, "\u56FE\u7247"),
1376
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "video/" }, "\u89C6\u9891"),
1377
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "audio/" }, "\u97F3\u9891"),
1378
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "application/pdf" }, "PDF"),
1379
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "application/" }, "\u6587\u6863")
1380
+ )), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-xs font-medium text-gray-700 mb-1" }, "\u4E0A\u4F20\u65F6\u95F4"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex space-x-2" }, /* @__PURE__ */ React2__default.default.createElement(
1381
+ "input",
1382
+ {
1383
+ type: "date",
1384
+ value: state.filters.dateRange.start?.toISOString().split("T")[0] || "",
1385
+ onChange: (e) => handleFilterChange("dateRange", {
1386
+ ...state.filters.dateRange,
1387
+ start: e.target.value ? new Date(e.target.value) : null
1388
+ }),
1389
+ className: "flex-1 px-2 py-1 text-xs border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500"
1390
+ }
1391
+ ), /* @__PURE__ */ React2__default.default.createElement(
1392
+ "input",
1393
+ {
1394
+ type: "date",
1395
+ value: state.filters.dateRange.end?.toISOString().split("T")[0] || "",
1396
+ onChange: (e) => handleFilterChange("dateRange", {
1397
+ ...state.filters.dateRange,
1398
+ end: e.target.value ? new Date(e.target.value) : null
1399
+ }),
1400
+ className: "flex-1 px-2 py-1 text-xs border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500"
1401
+ }
1402
+ ))), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-end" }, /* @__PURE__ */ React2__default.default.createElement(
1403
+ "button",
1404
+ {
1405
+ onClick: () => setState((prev) => ({
1406
+ ...prev,
1407
+ filters: {
1408
+ mimeType: "",
1409
+ dateRange: { start: null, end: null },
1410
+ sizeRange: { min: 0, max: Number.MAX_SAFE_INTEGER }
1411
+ }
1412
+ })),
1413
+ className: "px-3 py-2 text-sm text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50"
1414
+ },
1415
+ "\u6E05\u9664\u7B5B\u9009"
1416
+ ))));
1417
+ };
1418
+ const renderToolbar = () => {
1419
+ const selectedCount = state.selectedFiles.size;
1420
+ const hasSelection = selectedCount > 0;
1421
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-between mb-6" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center space-x-4" }, allowBatch && state.files.length > 0 && /* @__PURE__ */ React2__default.default.createElement("label", { className: "flex items-center space-x-2" }, /* @__PURE__ */ React2__default.default.createElement(
1422
+ "input",
1423
+ {
1424
+ type: "checkbox",
1425
+ checked: selectedCount === state.files.length && state.files.length > 0,
1426
+ onChange: (e) => handleSelectAll(e.target.checked),
1427
+ className: "w-4 h-4 text-blue-600 rounded border-gray-300 focus:ring-blue-500"
1428
+ }
1429
+ ), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-sm text-gray-700" }, "\u5168\u9009 (", selectedCount, "/", state.files.length, ")")), hasSelection && /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center space-x-2" }, allowDelete && /* @__PURE__ */ React2__default.default.createElement(
1430
+ "button",
1431
+ {
1432
+ onClick: () => handleDeleteFiles(Array.from(state.selectedFiles)),
1433
+ className: "px-3 py-1 text-sm text-red-600 border border-red-300 rounded hover:bg-red-50"
1434
+ },
1435
+ "\u5220\u9664\u9009\u4E2D (",
1436
+ selectedCount,
1437
+ ")"
1438
+ ), customActions.map((action) => {
1439
+ const selectedFileList = state.files.filter((file) => state.selectedFiles.has(file.id));
1440
+ const isDisabled = action.disabled?.(selectedFileList) || false;
1441
+ return /* @__PURE__ */ React2__default.default.createElement(
1442
+ "button",
1443
+ {
1444
+ key: action.key,
1445
+ onClick: () => action.onClick(selectedFileList),
1446
+ disabled: isDisabled,
1447
+ className: `px-3 py-1 text-sm border rounded ${isDisabled ? "text-gray-400 border-gray-200 cursor-not-allowed" : "text-blue-600 border-blue-300 hover:bg-blue-50"}`
1448
+ },
1449
+ action.icon && /* @__PURE__ */ React2__default.default.createElement("span", { className: "mr-1" }, action.icon),
1450
+ action.label
1451
+ );
1452
+ }))), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center space-x-4" }, /* @__PURE__ */ React2__default.default.createElement(
1453
+ "select",
1454
+ {
1455
+ value: `${state.sortBy}-${state.sortOrder}`,
1456
+ onChange: (e) => {
1457
+ const [sortBy, sortOrder] = e.target.value.split("-");
1458
+ setState((prev) => ({ ...prev, sortBy, sortOrder }));
1459
+ },
1460
+ className: "px-3 py-1 text-sm border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500"
1461
+ },
1462
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "uploadTime-desc" }, "\u6700\u65B0\u4E0A\u4F20"),
1463
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "uploadTime-asc" }, "\u6700\u65E9\u4E0A\u4F20"),
1464
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "originalName-asc" }, "\u6587\u4EF6\u540D A-Z"),
1465
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "originalName-desc" }, "\u6587\u4EF6\u540D Z-A"),
1466
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "size-desc" }, "\u6587\u4EF6\u5927\u5C0F \u5927-\u5C0F"),
1467
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "size-asc" }, "\u6587\u4EF6\u5927\u5C0F \u5C0F-\u5927")
1468
+ ), allowUpload && /* @__PURE__ */ React2__default.default.createElement(
1469
+ "button",
1470
+ {
1471
+ onClick: () => setState((prev) => ({ ...prev, showUploadModal: true })),
1472
+ className: "px-4 py-2 text-sm text-white bg-blue-600 rounded hover:bg-blue-700 focus:ring-2 focus:ring-blue-500"
1473
+ },
1474
+ "\u2B06\uFE0F \u4E0A\u4F20\u6587\u4EF6"
1475
+ )));
1476
+ };
1477
+ const renderPagination = () => {
1478
+ if (state.pagination.totalPages <= 1) return null;
1479
+ const { page, totalPages } = state.pagination;
1480
+ const pages = [];
1481
+ const startPage = Math.max(1, page - 2);
1482
+ const endPage = Math.min(totalPages, page + 2);
1483
+ for (let i = startPage; i <= endPage; i++) {
1484
+ pages.push(i);
1485
+ }
1486
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-between mt-6" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-sm text-gray-700" }, "\u663E\u793A\u7B2C ", (page - 1) * state.pagination.pageSize + 1, " - ", Math.min(page * state.pagination.pageSize, state.pagination.total), " \u9879\uFF0C \u5171 ", state.pagination.total, " \u9879"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center space-x-2" }, /* @__PURE__ */ React2__default.default.createElement(
1487
+ "button",
1488
+ {
1489
+ onClick: () => handlePageChange(page - 1),
1490
+ disabled: page <= 1,
1491
+ className: "px-3 py-1 text-sm border rounded disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50"
1492
+ },
1493
+ "\u4E0A\u4E00\u9875"
1494
+ ), pages.map((pageNum) => /* @__PURE__ */ React2__default.default.createElement(
1495
+ "button",
1496
+ {
1497
+ key: pageNum,
1498
+ onClick: () => handlePageChange(pageNum),
1499
+ className: `px-3 py-1 text-sm border rounded ${pageNum === page ? "bg-blue-600 text-white border-blue-600" : "hover:bg-gray-50"}`
1500
+ },
1501
+ pageNum
1502
+ )), /* @__PURE__ */ React2__default.default.createElement(
1503
+ "button",
1504
+ {
1505
+ onClick: () => handlePageChange(page + 1),
1506
+ disabled: page >= totalPages,
1507
+ className: "px-3 py-1 text-sm border rounded disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50"
1508
+ },
1509
+ "\u4E0B\u4E00\u9875"
1510
+ )));
1511
+ };
1512
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "w-full" }, state.error && /* @__PURE__ */ React2__default.default.createElement("div", { className: "mb-4 p-4 bg-red-50 border border-red-200 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-red-800" }, state.error), /* @__PURE__ */ React2__default.default.createElement(
1513
+ "button",
1514
+ {
1515
+ onClick: () => setState((prev) => ({ ...prev, error: null })),
1516
+ className: "mt-2 text-red-600 hover:text-red-800"
1517
+ },
1518
+ "\u5173\u95ED"
1519
+ )), renderSearchBar(), renderFilters(), renderToolbar(), /* @__PURE__ */ React2__default.default.createElement("div", { className: "min-h-96" }, state.loading ? /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-center h-32" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-gray-500" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-2" }), /* @__PURE__ */ React2__default.default.createElement("p", null, "\u52A0\u8F7D\u4E2D..."))) : state.files.length === 0 ? /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-center h-32" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-center text-gray-500" }, /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-4xl mb-2" }, "\u{1F4C1}"), /* @__PURE__ */ React2__default.default.createElement("p", null, "\u6682\u65E0\u6587\u4EF6"), allowUpload && /* @__PURE__ */ React2__default.default.createElement(
1520
+ "button",
1521
+ {
1522
+ onClick: () => setState((prev) => ({ ...prev, showUploadModal: true })),
1523
+ className: "mt-2 text-blue-600 hover:text-blue-800"
1524
+ },
1525
+ "\u70B9\u51FB\u4E0A\u4F20\u7B2C\u4E00\u4E2A\u6587\u4EF6"
1526
+ ))) : /* @__PURE__ */ React2__default.default.createElement("div", { className: `grid gap-4 ${mode === "grid" ? "grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6" : "grid-cols-1"}` }, state.files.map(renderFileItem))), renderPagination(), state.previewFile && showPreview && /* @__PURE__ */ React2__default.default.createElement(
1527
+ FilePreviewModal,
1528
+ {
1529
+ file: state.previewFile,
1530
+ onClose: handleClosePreview
1531
+ }
1532
+ ), state.showUploadModal && allowUpload && /* @__PURE__ */ React2__default.default.createElement(
1533
+ UploadModal,
1534
+ {
1535
+ moduleId,
1536
+ businessId,
1537
+ onClose: () => setState((prev) => ({ ...prev, showUploadModal: false })),
1538
+ onUploadComplete: (files) => {
1539
+ setState((prev) => ({ ...prev, showUploadModal: false }));
1540
+ if (onUploadComplete) {
1541
+ onUploadComplete(files);
1542
+ }
1543
+ loadFiles();
1544
+ }
1545
+ }
1546
+ ));
1547
+ };
1548
+ var FilePreviewModal = ({ file, onClose }) => {
1549
+ const renderPreviewContent = () => {
1550
+ if (file.mimeType.startsWith("image/")) {
1551
+ return /* @__PURE__ */ React2__default.default.createElement(
1552
+ "img",
1553
+ {
1554
+ src: file.cdnUrl || `/api/files/${file.id}/download`,
1555
+ alt: file.originalName,
1556
+ className: "max-w-full max-h-full object-contain"
1557
+ }
1558
+ );
1559
+ }
1560
+ if (file.mimeType.startsWith("video/")) {
1561
+ return /* @__PURE__ */ React2__default.default.createElement(
1562
+ "video",
1563
+ {
1564
+ src: file.cdnUrl || `/api/files/${file.id}/download`,
1565
+ controls: true,
1566
+ className: "max-w-full max-h-full"
1567
+ },
1568
+ "\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u89C6\u9891\u64AD\u653E"
1569
+ );
1570
+ }
1571
+ if (file.mimeType.startsWith("audio/")) {
1572
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex flex-col items-center space-y-4" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-6xl" }, "\u{1F3B5}"), /* @__PURE__ */ React2__default.default.createElement(
1573
+ "audio",
1574
+ {
1575
+ src: file.cdnUrl || `/api/files/${file.id}/download`,
1576
+ controls: true,
1577
+ className: "w-full max-w-md"
1578
+ },
1579
+ "\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u97F3\u9891\u64AD\u653E"
1580
+ ));
1581
+ }
1582
+ if (file.mimeType.includes("pdf")) {
1583
+ return /* @__PURE__ */ React2__default.default.createElement(
1584
+ "iframe",
1585
+ {
1586
+ src: `${file.cdnUrl || `/api/files/${file.id}/download`}#toolbar=0`,
1587
+ className: "w-full h-full min-h-96",
1588
+ title: file.originalName
1589
+ }
1590
+ );
1591
+ }
1592
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex flex-col items-center justify-center h-64 text-gray-500" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-4xl mb-4" }, "\u{1F4C4}"), /* @__PURE__ */ React2__default.default.createElement("p", null, "\u6B64\u6587\u4EF6\u7C7B\u578B\u6682\u4E0D\u652F\u6301\u9884\u89C8"), /* @__PURE__ */ React2__default.default.createElement(
1593
+ "a",
1594
+ {
1595
+ href: file.cdnUrl || `/api/files/${file.id}/download`,
1596
+ download: file.originalName,
1597
+ className: "mt-4 px-4 py-2 text-blue-600 border border-blue-300 rounded hover:bg-blue-50"
1598
+ },
1599
+ "\u4E0B\u8F7D\u6587\u4EF6"
1600
+ ));
1601
+ };
1602
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "bg-white rounded-lg max-w-4xl max-h-[90vh] overflow-hidden flex flex-col" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-between p-4 border-b" }, /* @__PURE__ */ React2__default.default.createElement("h2", { className: "text-lg font-medium truncate", title: file.originalName }, file.originalName), /* @__PURE__ */ React2__default.default.createElement(
1603
+ "button",
1604
+ {
1605
+ onClick: onClose,
1606
+ className: "p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100"
1607
+ },
1608
+ "\u2715"
1609
+ )), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex-1 p-4 overflow-auto flex items-center justify-center" }, renderPreviewContent()), /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-4 border-t bg-gray-50 text-sm text-gray-600" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4" }, /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium" }, "\u6587\u4EF6\u5927\u5C0F\uFF1A"), (file.size / 1024 / 1024).toFixed(2), " MB"), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium" }, "\u4E0A\u4F20\u65F6\u95F4\uFF1A"), new Date(file.uploadTime).toLocaleString()), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium" }, "\u6587\u4EF6\u7C7B\u578B\uFF1A"), file.mimeType), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium" }, "\u8BBF\u95EE\u6B21\u6570\uFF1A"), file.accessCount)))));
1610
+ };
1611
+ var UploadModal = ({
1612
+ moduleId,
1613
+ businessId,
1614
+ onClose,
1615
+ onUploadComplete
1616
+ }) => {
1617
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "bg-white rounded-lg max-w-2xl w-full max-h-[80vh] overflow-hidden" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-between p-4 border-b" }, /* @__PURE__ */ React2__default.default.createElement("h2", { className: "text-lg font-medium" }, "\u4E0A\u4F20\u6587\u4EF6"), /* @__PURE__ */ React2__default.default.createElement(
1618
+ "button",
1619
+ {
1620
+ onClick: onClose,
1621
+ className: "p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100"
1622
+ },
1623
+ "\u2715"
1624
+ )), /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-6" }, /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-gray-600 mb-4" }, "\u8FD9\u91CC\u5C06\u96C6\u6210UniversalFileUploader\u7EC4\u4EF6"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "border-2 border-dashed border-gray-300 rounded-lg p-8 text-center text-gray-500" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-4xl mb-4" }, "\u{1F4C1}"), /* @__PURE__ */ React2__default.default.createElement("p", null, "\u62D6\u62FD\u6587\u4EF6\u5230\u6B64\u5904\u6216\u70B9\u51FB\u9009\u62E9\u6587\u4EF6"), /* @__PURE__ */ React2__default.default.createElement(
1625
+ "input",
1626
+ {
1627
+ type: "file",
1628
+ multiple: true,
1629
+ className: "hidden",
1630
+ onChange: (e) => {
1631
+ console.log("\u9009\u62E9\u6587\u4EF6:", e.target.files);
1632
+ onUploadComplete([]);
1633
+ }
1634
+ }
1635
+ )))));
1636
+ };
1637
+ var FolderManager = ({
1638
+ currentFolderId,
1639
+ folderTree,
1640
+ showFileCount = true,
1641
+ showSize = true,
1642
+ allowCreate = true,
1643
+ allowRename = true,
1644
+ allowDelete = true,
1645
+ allowDrag = false,
1646
+ onFolderSelect,
1647
+ onFolderCreate,
1648
+ onFolderRename,
1649
+ onFolderDelete,
1650
+ onFileMove
1651
+ }) => {
1652
+ const [state, setState] = React2.useState({
1653
+ expandedFolders: new Set(currentFolderId ? [currentFolderId] : []),
1654
+ editingFolder: null,
1655
+ editingName: "",
1656
+ creatingFolder: null,
1657
+ newFolderName: "",
1658
+ dragOverFolder: null,
1659
+ contextMenu: null
1660
+ });
1661
+ const toggleFolder = React2.useCallback((folderId) => {
1662
+ setState((prev) => {
1663
+ const newExpanded = new Set(prev.expandedFolders);
1664
+ if (newExpanded.has(folderId)) {
1665
+ newExpanded.delete(folderId);
1666
+ } else {
1667
+ newExpanded.add(folderId);
1668
+ }
1669
+ return { ...prev, expandedFolders: newExpanded };
1670
+ });
1671
+ }, []);
1672
+ const selectFolder = React2.useCallback((folderId) => {
1673
+ if (onFolderSelect) {
1674
+ onFolderSelect(folderId);
1675
+ }
1676
+ }, [onFolderSelect]);
1677
+ const startCreateFolder = React2.useCallback((parentId) => {
1678
+ setState((prev) => ({
1679
+ ...prev,
1680
+ creatingFolder: parentId || null,
1681
+ newFolderName: "\u65B0\u5EFA\u6587\u4EF6\u5939",
1682
+ contextMenu: null
1683
+ }));
1684
+ }, []);
1685
+ const confirmCreateFolder = React2.useCallback(async () => {
1686
+ if (!state.newFolderName.trim() || !onFolderCreate) return;
1687
+ try {
1688
+ await onFolderCreate(state.creatingFolder || void 0, state.newFolderName.trim());
1689
+ setState((prev) => ({
1690
+ ...prev,
1691
+ creatingFolder: null,
1692
+ newFolderName: ""
1693
+ }));
1694
+ } catch (error) {
1695
+ console.error("\u521B\u5EFA\u6587\u4EF6\u5939\u5931\u8D25:", error);
1696
+ }
1697
+ }, [state.creatingFolder, state.newFolderName, onFolderCreate]);
1698
+ const cancelCreateFolder = React2.useCallback(() => {
1699
+ setState((prev) => ({
1700
+ ...prev,
1701
+ creatingFolder: null,
1702
+ newFolderName: ""
1703
+ }));
1704
+ }, []);
1705
+ const startRenameFolder = React2.useCallback((folderId, currentName) => {
1706
+ setState((prev) => ({
1707
+ ...prev,
1708
+ editingFolder: folderId,
1709
+ editingName: currentName,
1710
+ contextMenu: null
1711
+ }));
1712
+ }, []);
1713
+ const confirmRenameFolder = React2.useCallback(async () => {
1714
+ if (!state.editingFolder || !state.editingName.trim() || !onFolderRename) return;
1715
+ try {
1716
+ await onFolderRename(state.editingFolder, state.editingName.trim());
1717
+ setState((prev) => ({
1718
+ ...prev,
1719
+ editingFolder: null,
1720
+ editingName: ""
1721
+ }));
1722
+ } catch (error) {
1723
+ console.error("\u91CD\u547D\u540D\u6587\u4EF6\u5939\u5931\u8D25:", error);
1724
+ }
1725
+ }, [state.editingFolder, state.editingName, onFolderRename]);
1726
+ const cancelRenameFolder = React2.useCallback(() => {
1727
+ setState((prev) => ({
1728
+ ...prev,
1729
+ editingFolder: null,
1730
+ editingName: ""
1731
+ }));
1732
+ }, []);
1733
+ const deleteFolder = React2.useCallback(async (folderId, folderName) => {
1734
+ if (!window.confirm(`\u786E\u5B9A\u8981\u5220\u9664\u6587\u4EF6\u5939"${folderName}"\u5417\uFF1F\u6B64\u64CD\u4F5C\u5C06\u5220\u9664\u6587\u4EF6\u5939\u5185\u7684\u6240\u6709\u6587\u4EF6\u3002`)) {
1735
+ return;
1736
+ }
1737
+ if (!onFolderDelete) return;
1738
+ try {
1739
+ await onFolderDelete(folderId);
1740
+ setState((prev) => ({ ...prev, contextMenu: null }));
1741
+ } catch (error) {
1742
+ console.error("\u5220\u9664\u6587\u4EF6\u5939\u5931\u8D25:", error);
1743
+ }
1744
+ }, [onFolderDelete]);
1745
+ const handleContextMenu = React2.useCallback((e, folderId) => {
1746
+ e.preventDefault();
1747
+ setState((prev) => ({
1748
+ ...prev,
1749
+ contextMenu: {
1750
+ folderId,
1751
+ x: e.clientX,
1752
+ y: e.clientY
1753
+ }
1754
+ }));
1755
+ }, []);
1756
+ const closeContextMenu = React2.useCallback(() => {
1757
+ setState((prev) => ({ ...prev, contextMenu: null }));
1758
+ }, []);
1759
+ const handleDragOver = React2.useCallback((e, folderId) => {
1760
+ if (!allowDrag) return;
1761
+ e.preventDefault();
1762
+ setState((prev) => ({ ...prev, dragOverFolder: folderId }));
1763
+ }, [allowDrag]);
1764
+ const handleDragLeave = React2.useCallback(() => {
1765
+ setState((prev) => ({ ...prev, dragOverFolder: null }));
1766
+ }, []);
1767
+ const handleDrop = React2.useCallback(async (e, folderId) => {
1768
+ if (!allowDrag || !onFileMove) return;
1769
+ e.preventDefault();
1770
+ setState((prev) => ({ ...prev, dragOverFolder: null }));
1771
+ try {
1772
+ const fileIds = JSON.parse(e.dataTransfer.getData("application/json"));
1773
+ await onFileMove(fileIds, folderId);
1774
+ } catch (error) {
1775
+ console.error("\u79FB\u52A8\u6587\u4EF6\u5931\u8D25:", error);
1776
+ }
1777
+ }, [allowDrag, onFileMove]);
1778
+ const formatSize = React2.useCallback((bytes) => {
1779
+ if (bytes === 0) return "0 B";
1780
+ const k = 1024;
1781
+ const sizes = ["B", "KB", "MB", "GB", "TB"];
1782
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
1783
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
1784
+ }, []);
1785
+ const renderFolderNode = React2.useCallback((folder, level = 0) => {
1786
+ const isExpanded = state.expandedFolders.has(folder.id);
1787
+ const isSelected = currentFolderId === folder.id;
1788
+ const isEditing = state.editingFolder === folder.id;
1789
+ const isDragOver = state.dragOverFolder === folder.id;
1790
+ return /* @__PURE__ */ React2__default.default.createElement("div", { key: folder.id, className: "select-none" }, /* @__PURE__ */ React2__default.default.createElement(
1791
+ "div",
1792
+ {
1793
+ className: `flex items-center py-1 px-2 rounded-md cursor-pointer transition-colors ${isSelected ? "bg-blue-100 text-blue-800" : isDragOver ? "bg-green-100" : "hover:bg-gray-100"}`,
1794
+ style: { paddingLeft: `${level * 16 + 8}px` },
1795
+ onClick: () => selectFolder(folder.id),
1796
+ onContextMenu: (e) => handleContextMenu(e, folder.id),
1797
+ onDragOver: allowDrag ? (e) => handleDragOver(e, folder.id) : void 0,
1798
+ onDragLeave: allowDrag ? handleDragLeave : void 0,
1799
+ onDrop: allowDrag ? (e) => handleDrop(e, folder.id) : void 0
1800
+ },
1801
+ folder.children.length > 0 && /* @__PURE__ */ React2__default.default.createElement(
1802
+ "button",
1803
+ {
1804
+ onClick: (e) => {
1805
+ e.stopPropagation();
1806
+ toggleFolder(folder.id);
1807
+ },
1808
+ className: "mr-1 p-1 hover:bg-gray-200 rounded"
1809
+ },
1810
+ /* @__PURE__ */ React2__default.default.createElement("span", { className: `text-xs transition-transform ${isExpanded ? "rotate-90" : ""}` }, "\u25B6")
1811
+ ),
1812
+ /* @__PURE__ */ React2__default.default.createElement("span", { className: "mr-2 text-yellow-600" }, isExpanded ? "\u{1F4C2}" : "\u{1F4C1}"),
1813
+ /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex-1 flex items-center justify-between" }, isEditing ? /* @__PURE__ */ React2__default.default.createElement(
1814
+ "input",
1815
+ {
1816
+ type: "text",
1817
+ value: state.editingName,
1818
+ onChange: (e) => setState((prev) => ({ ...prev, editingName: e.target.value })),
1819
+ onBlur: confirmRenameFolder,
1820
+ onKeyDown: (e) => {
1821
+ if (e.key === "Enter") {
1822
+ confirmRenameFolder();
1823
+ } else if (e.key === "Escape") {
1824
+ cancelRenameFolder();
1825
+ }
1826
+ },
1827
+ onClick: (e) => e.stopPropagation(),
1828
+ className: "flex-1 px-1 py-0 text-sm border rounded focus:outline-none focus:ring-1 focus:ring-blue-500",
1829
+ autoFocus: true
1830
+ }
1831
+ ) : /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-sm truncate" }, folder.name), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center space-x-2 text-xs text-gray-500 ml-2" }, showFileCount && /* @__PURE__ */ React2__default.default.createElement("span", null, folder.fileCount, " \u9879"), showSize && folder.totalSize > 0 && /* @__PURE__ */ React2__default.default.createElement("span", null, formatSize(folder.totalSize))))
1832
+ ), state.creatingFolder === folder.id && /* @__PURE__ */ React2__default.default.createElement(
1833
+ "div",
1834
+ {
1835
+ className: "flex items-center py-1 px-2 ml-4",
1836
+ style: { paddingLeft: `${(level + 1) * 16 + 8}px` }
1837
+ },
1838
+ /* @__PURE__ */ React2__default.default.createElement("span", { className: "mr-2 text-yellow-600" }, "\u{1F4C1}"),
1839
+ /* @__PURE__ */ React2__default.default.createElement(
1840
+ "input",
1841
+ {
1842
+ type: "text",
1843
+ value: state.newFolderName,
1844
+ onChange: (e) => setState((prev) => ({ ...prev, newFolderName: e.target.value })),
1845
+ onBlur: confirmCreateFolder,
1846
+ onKeyDown: (e) => {
1847
+ if (e.key === "Enter") {
1848
+ confirmCreateFolder();
1849
+ } else if (e.key === "Escape") {
1850
+ cancelCreateFolder();
1851
+ }
1852
+ },
1853
+ className: "flex-1 px-1 py-0 text-sm border rounded focus:outline-none focus:ring-1 focus:ring-blue-500",
1854
+ autoFocus: true
1855
+ }
1856
+ )
1857
+ ), isExpanded && folder.children.map(
1858
+ (child) => renderFolderNode(child, level + 1)
1859
+ ));
1860
+ }, [
1861
+ state.expandedFolders,
1862
+ state.editingFolder,
1863
+ state.editingName,
1864
+ state.creatingFolder,
1865
+ state.newFolderName,
1866
+ state.dragOverFolder,
1867
+ currentFolderId,
1868
+ allowDrag,
1869
+ showFileCount,
1870
+ showSize,
1871
+ selectFolder,
1872
+ toggleFolder,
1873
+ handleContextMenu,
1874
+ handleDragOver,
1875
+ handleDragLeave,
1876
+ handleDrop,
1877
+ confirmRenameFolder,
1878
+ cancelRenameFolder,
1879
+ confirmCreateFolder,
1880
+ cancelCreateFolder,
1881
+ formatSize
1882
+ ]);
1883
+ const renderContextMenu = () => {
1884
+ if (!state.contextMenu) return null;
1885
+ const folder = findFolderById(folderTree, state.contextMenu.folderId);
1886
+ if (!folder) return null;
1887
+ return /* @__PURE__ */ React2__default.default.createElement(
1888
+ "div",
1889
+ {
1890
+ className: "fixed bg-white border border-gray-200 rounded-md shadow-lg z-50 py-1",
1891
+ style: {
1892
+ left: state.contextMenu.x,
1893
+ top: state.contextMenu.y
1894
+ },
1895
+ onClick: closeContextMenu
1896
+ },
1897
+ allowCreate && /* @__PURE__ */ React2__default.default.createElement(
1898
+ "button",
1899
+ {
1900
+ onClick: () => startCreateFolder(folder.id),
1901
+ className: "w-full px-4 py-2 text-left text-sm hover:bg-gray-100 flex items-center"
1902
+ },
1903
+ /* @__PURE__ */ React2__default.default.createElement("span", { className: "mr-2" }, "\u{1F4C1}"),
1904
+ "\u65B0\u5EFA\u5B50\u6587\u4EF6\u5939"
1905
+ ),
1906
+ allowRename && /* @__PURE__ */ React2__default.default.createElement(
1907
+ "button",
1908
+ {
1909
+ onClick: () => startRenameFolder(folder.id, folder.name),
1910
+ className: "w-full px-4 py-2 text-left text-sm hover:bg-gray-100 flex items-center"
1911
+ },
1912
+ /* @__PURE__ */ React2__default.default.createElement("span", { className: "mr-2" }, "\u270F\uFE0F"),
1913
+ "\u91CD\u547D\u540D"
1914
+ ),
1915
+ allowDelete && /* @__PURE__ */ React2__default.default.createElement(
1916
+ "button",
1917
+ {
1918
+ onClick: () => deleteFolder(folder.id, folder.name),
1919
+ className: "w-full px-4 py-2 text-left text-sm hover:bg-gray-100 text-red-600 flex items-center"
1920
+ },
1921
+ /* @__PURE__ */ React2__default.default.createElement("span", { className: "mr-2" }, "\u{1F5D1}\uFE0F"),
1922
+ "\u5220\u9664\u6587\u4EF6\u5939"
1923
+ )
1924
+ );
1925
+ };
1926
+ const findFolderById = (folders, id) => {
1927
+ for (const folder of folders) {
1928
+ if (folder.id === id) return folder;
1929
+ const found = findFolderById(folder.children, id);
1930
+ if (found) return found;
1931
+ }
1932
+ return null;
1933
+ };
1934
+ React2__default.default.useEffect(() => {
1935
+ if (!state.contextMenu) return;
1936
+ const handleClickOutside = () => {
1937
+ closeContextMenu();
1938
+ };
1939
+ document.addEventListener("click", handleClickOutside);
1940
+ return () => document.removeEventListener("click", handleClickOutside);
1941
+ }, [state.contextMenu, closeContextMenu]);
1942
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-between p-2 border-b bg-gray-50" }, /* @__PURE__ */ React2__default.default.createElement("h3", { className: "text-sm font-medium text-gray-700" }, "\u6587\u4EF6\u5939"), allowCreate && /* @__PURE__ */ React2__default.default.createElement(
1943
+ "button",
1944
+ {
1945
+ onClick: () => startCreateFolder(),
1946
+ className: "px-2 py-1 text-xs text-blue-600 border border-blue-300 rounded hover:bg-blue-50",
1947
+ title: "\u65B0\u5EFA\u6587\u4EF6\u5939"
1948
+ },
1949
+ "\u2795"
1950
+ )), /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-2 max-h-96 overflow-y-auto" }, folderTree.length === 0 ? /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-center text-gray-500 py-8" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-2xl mb-2" }, "\u{1F4C1}"), /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-sm" }, "\u6682\u65E0\u6587\u4EF6\u5939"), allowCreate && /* @__PURE__ */ React2__default.default.createElement(
1951
+ "button",
1952
+ {
1953
+ onClick: () => startCreateFolder(),
1954
+ className: "mt-2 text-blue-600 hover:text-blue-800 text-sm"
1955
+ },
1956
+ "\u521B\u5EFA\u7B2C\u4E00\u4E2A\u6587\u4EF6\u5939"
1957
+ )) : /* @__PURE__ */ React2__default.default.createElement("div", { className: "space-y-1" }, folderTree.map((folder) => renderFolderNode(folder))), state.creatingFolder === null && /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center py-1 px-2" }, /* @__PURE__ */ React2__default.default.createElement("span", { className: "mr-2 text-yellow-600" }, "\u{1F4C1}"), /* @__PURE__ */ React2__default.default.createElement(
1958
+ "input",
1959
+ {
1960
+ type: "text",
1961
+ value: state.newFolderName,
1962
+ onChange: (e) => setState((prev) => ({ ...prev, newFolderName: e.target.value })),
1963
+ onBlur: confirmCreateFolder,
1964
+ onKeyDown: (e) => {
1965
+ if (e.key === "Enter") {
1966
+ confirmCreateFolder();
1967
+ } else if (e.key === "Escape") {
1968
+ cancelCreateFolder();
1969
+ }
1970
+ },
1971
+ className: "flex-1 px-1 py-0 text-sm border rounded focus:outline-none focus:ring-1 focus:ring-blue-500",
1972
+ autoFocus: true
1973
+ }
1974
+ ))), renderContextMenu());
1975
+ };
1976
+ var FolderManager_default = FolderManager;
1977
+ var FileShareModal = ({
1978
+ files,
1979
+ onClose,
1980
+ onShareSuccess
1981
+ }) => {
1982
+ const [shareOptions, setShareOptions] = React2.useState({
1983
+ expireType: "7days",
1984
+ requirePassword: false,
1985
+ password: "",
1986
+ permission: "view",
1987
+ downloadLimit: void 0
1988
+ });
1989
+ const [loading, setLoading] = React2.useState(false);
1990
+ const [shareInfo, setShareInfo] = React2.useState(null);
1991
+ const [error, setError] = React2.useState(null);
1992
+ const generatePassword = React2.useCallback(() => {
1993
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
1994
+ let password = "";
1995
+ for (let i = 0; i < 6; i++) {
1996
+ password += chars.charAt(Math.floor(Math.random() * chars.length));
1997
+ }
1998
+ setShareOptions((prev) => ({ ...prev, password }));
1999
+ }, []);
2000
+ const getExpiresAt = React2.useCallback(() => {
2001
+ const now = /* @__PURE__ */ new Date();
2002
+ switch (shareOptions.expireType) {
2003
+ case "never":
2004
+ return void 0;
2005
+ case "1hour":
2006
+ return new Date(now.getTime() + 60 * 60 * 1e3);
2007
+ case "1day":
2008
+ return new Date(now.getTime() + 24 * 60 * 60 * 1e3);
2009
+ case "7days":
2010
+ return new Date(now.getTime() + 7 * 24 * 60 * 60 * 1e3);
2011
+ case "30days":
2012
+ return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1e3);
2013
+ case "custom":
2014
+ return shareOptions.customExpireTime;
2015
+ default:
2016
+ return void 0;
2017
+ }
2018
+ }, [shareOptions.expireType, shareOptions.customExpireTime]);
2019
+ const handleCreateShare = React2.useCallback(async () => {
2020
+ setLoading(true);
2021
+ setError(null);
2022
+ try {
2023
+ const expiresAt = getExpiresAt();
2024
+ const mockShareInfo = {
2025
+ shareUrl: `${window.location.origin}/share/${generateShareCode()}`,
2026
+ password: shareOptions.requirePassword ? shareOptions.password : void 0,
2027
+ expiresAt,
2028
+ permission: shareOptions.permission,
2029
+ shareCode: generateShareCode()
2030
+ };
2031
+ setShareInfo(mockShareInfo);
2032
+ if (onShareSuccess) {
2033
+ onShareSuccess(mockShareInfo);
2034
+ }
2035
+ } catch (error2) {
2036
+ console.error("\u521B\u5EFA\u5206\u4EAB\u5931\u8D25:", error2);
2037
+ setError(error2 instanceof Error ? error2.message : "\u521B\u5EFA\u5206\u4EAB\u5931\u8D25");
2038
+ } finally {
2039
+ setLoading(false);
2040
+ }
2041
+ }, [files, shareOptions, getExpiresAt, onShareSuccess]);
2042
+ const generateShareCode = React2.useCallback(() => {
2043
+ return Math.random().toString(36).substring(2, 10).toUpperCase();
2044
+ }, []);
2045
+ const copyToClipboard = React2.useCallback(async (text) => {
2046
+ try {
2047
+ await navigator.clipboard.writeText(text);
2048
+ console.log("\u590D\u5236\u6210\u529F");
2049
+ } catch (error2) {
2050
+ console.error("\u590D\u5236\u5931\u8D25:", error2);
2051
+ const textArea = document.createElement("textarea");
2052
+ textArea.value = text;
2053
+ document.body.appendChild(textArea);
2054
+ textArea.select();
2055
+ document.execCommand("copy");
2056
+ document.body.removeChild(textArea);
2057
+ }
2058
+ }, []);
2059
+ const formatFileList = React2.useCallback(() => {
2060
+ if (files.length === 0) return "0 \u4E2A\u6587\u4EF6";
2061
+ if (files.length === 1 && files[0]) {
2062
+ return files[0].originalName;
2063
+ }
2064
+ return `${files.length} \u4E2A\u6587\u4EF6`;
2065
+ }, [files]);
2066
+ const renderShareSettings = () => {
2067
+ if (shareInfo) return null;
2068
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "bg-gray-50 p-4 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("h3", { className: "font-medium text-gray-900 mb-2" }, "\u8981\u5206\u4EAB\u7684\u6587\u4EF6"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "space-y-2" }, files.map((file) => /* @__PURE__ */ React2__default.default.createElement("div", { key: file.id, className: "flex items-center justify-between text-sm" }, /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-gray-700 truncate" }, file.originalName), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-gray-500 text-xs" }, (file.size / 1024 / 1024).toFixed(2), " MB"))))), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-2" }, "\u8FC7\u671F\u65F6\u95F4"), /* @__PURE__ */ React2__default.default.createElement(
2069
+ "select",
2070
+ {
2071
+ value: shareOptions.expireType,
2072
+ onChange: (e) => setShareOptions((prev) => ({
2073
+ ...prev,
2074
+ expireType: e.target.value
2075
+ })),
2076
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500"
2077
+ },
2078
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "never" }, "\u6C38\u4E0D\u8FC7\u671F"),
2079
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "1hour" }, "1\u5C0F\u65F6\u540E"),
2080
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "1day" }, "1\u5929\u540E"),
2081
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "7days" }, "7\u5929\u540E"),
2082
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "30days" }, "30\u5929\u540E"),
2083
+ /* @__PURE__ */ React2__default.default.createElement("option", { value: "custom" }, "\u81EA\u5B9A\u4E49\u65F6\u95F4")
2084
+ ), shareOptions.expireType === "custom" && /* @__PURE__ */ React2__default.default.createElement("div", { className: "mt-2" }, /* @__PURE__ */ React2__default.default.createElement(
2085
+ "input",
2086
+ {
2087
+ type: "datetime-local",
2088
+ value: shareOptions.customExpireTime?.toISOString().slice(0, 16) || "",
2089
+ onChange: (e) => setShareOptions((prev) => ({
2090
+ ...prev,
2091
+ customExpireTime: e.target.value ? new Date(e.target.value) : void 0
2092
+ })),
2093
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500",
2094
+ min: (/* @__PURE__ */ new Date()).toISOString().slice(0, 16)
2095
+ }
2096
+ ))), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-2" }, "\u8BBF\u95EE\u6743\u9650"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React2__default.default.createElement("label", { className: "flex items-center" }, /* @__PURE__ */ React2__default.default.createElement(
2097
+ "input",
2098
+ {
2099
+ type: "radio",
2100
+ name: "permission",
2101
+ value: "view",
2102
+ checked: shareOptions.permission === "view",
2103
+ onChange: (e) => setShareOptions((prev) => ({
2104
+ ...prev,
2105
+ permission: e.target.value
2106
+ })),
2107
+ className: "mr-2"
2108
+ }
2109
+ ), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-sm" }, "\u4EC5\u9884\u89C8\uFF08\u4E0D\u5141\u8BB8\u4E0B\u8F7D\uFF09")), /* @__PURE__ */ React2__default.default.createElement("label", { className: "flex items-center" }, /* @__PURE__ */ React2__default.default.createElement(
2110
+ "input",
2111
+ {
2112
+ type: "radio",
2113
+ name: "permission",
2114
+ value: "download",
2115
+ checked: shareOptions.permission === "download",
2116
+ onChange: (e) => setShareOptions((prev) => ({
2117
+ ...prev,
2118
+ permission: e.target.value
2119
+ })),
2120
+ className: "mr-2"
2121
+ }
2122
+ ), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-sm" }, "\u5141\u8BB8\u4E0B\u8F7D")))), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "flex items-center mb-2" }, /* @__PURE__ */ React2__default.default.createElement(
2123
+ "input",
2124
+ {
2125
+ type: "checkbox",
2126
+ checked: shareOptions.requirePassword,
2127
+ onChange: (e) => setShareOptions((prev) => ({
2128
+ ...prev,
2129
+ requirePassword: e.target.checked,
2130
+ password: e.target.checked ? prev.password : ""
2131
+ })),
2132
+ className: "mr-2"
2133
+ }
2134
+ ), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-sm font-medium text-gray-700" }, "\u8BBE\u7F6E\u8BBF\u95EE\u5BC6\u7801")), shareOptions.requirePassword && /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex space-x-2" }, /* @__PURE__ */ React2__default.default.createElement(
2135
+ "input",
2136
+ {
2137
+ type: "text",
2138
+ value: shareOptions.password,
2139
+ onChange: (e) => setShareOptions((prev) => ({
2140
+ ...prev,
2141
+ password: e.target.value
2142
+ })),
2143
+ placeholder: "\u8F93\u5165\u8BBF\u95EE\u5BC6\u7801",
2144
+ className: "flex-1 px-3 py-2 border border-gray-300 rounded-md focus:ring-blue-500 focus:border-blue-500",
2145
+ maxLength: 20
2146
+ }
2147
+ ), /* @__PURE__ */ React2__default.default.createElement(
2148
+ "button",
2149
+ {
2150
+ type: "button",
2151
+ onClick: generatePassword,
2152
+ className: "px-3 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50"
2153
+ },
2154
+ "\u968F\u673A\u751F\u6210"
2155
+ ))), shareOptions.permission === "download" && /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-2" }, "\u4E0B\u8F7D\u6B21\u6570\u9650\u5236"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center space-x-2" }, /* @__PURE__ */ React2__default.default.createElement(
2156
+ "input",
2157
+ {
2158
+ type: "checkbox",
2159
+ checked: shareOptions.downloadLimit !== void 0,
2160
+ onChange: (e) => setShareOptions((prev) => ({
2161
+ ...prev,
2162
+ downloadLimit: e.target.checked ? 10 : void 0
2163
+ })),
2164
+ className: "mr-2"
2165
+ }
2166
+ ), /* @__PURE__ */ React2__default.default.createElement("span", { className: "text-sm text-gray-700" }, "\u9650\u5236\u4E0B\u8F7D\u6B21\u6570"), shareOptions.downloadLimit !== void 0 && /* @__PURE__ */ React2__default.default.createElement(
2167
+ "input",
2168
+ {
2169
+ type: "number",
2170
+ value: shareOptions.downloadLimit,
2171
+ onChange: (e) => setShareOptions((prev) => ({
2172
+ ...prev,
2173
+ downloadLimit: parseInt(e.target.value) || 1
2174
+ })),
2175
+ min: 1,
2176
+ max: 1e3,
2177
+ className: "w-20 px-2 py-1 text-sm border border-gray-300 rounded focus:ring-blue-500 focus:border-blue-500"
2178
+ }
2179
+ ))));
2180
+ };
2181
+ const renderShareResult = () => {
2182
+ if (!shareInfo) return null;
2183
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-center" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "text-4xl mb-4" }, "\u2705"), /* @__PURE__ */ React2__default.default.createElement("h3", { className: "text-lg font-medium text-gray-900 mb-2" }, "\u5206\u4EAB\u94FE\u63A5\u5DF2\u521B\u5EFA"), /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-sm text-gray-600" }, formatFileList(), " \u5DF2\u6210\u529F\u521B\u5EFA\u5206\u4EAB\u94FE\u63A5")), /* @__PURE__ */ React2__default.default.createElement("div", { className: "bg-gray-50 p-4 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-2" }, "\u5206\u4EAB\u94FE\u63A5"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex space-x-2" }, /* @__PURE__ */ React2__default.default.createElement(
2184
+ "input",
2185
+ {
2186
+ type: "text",
2187
+ value: shareInfo.shareUrl,
2188
+ readOnly: true,
2189
+ className: "flex-1 px-3 py-2 text-sm bg-white border border-gray-300 rounded-md"
2190
+ }
2191
+ ), /* @__PURE__ */ React2__default.default.createElement(
2192
+ "button",
2193
+ {
2194
+ onClick: () => copyToClipboard(shareInfo.shareUrl),
2195
+ className: "px-3 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50"
2196
+ },
2197
+ "\u590D\u5236\u94FE\u63A5"
2198
+ ))), shareInfo.password && /* @__PURE__ */ React2__default.default.createElement("div", { className: "bg-yellow-50 p-4 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-2" }, "\u8BBF\u95EE\u5BC6\u7801"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex space-x-2" }, /* @__PURE__ */ React2__default.default.createElement(
2199
+ "input",
2200
+ {
2201
+ type: "text",
2202
+ value: shareInfo.password,
2203
+ readOnly: true,
2204
+ className: "flex-1 px-3 py-2 text-sm bg-white border border-gray-300 rounded-md"
2205
+ }
2206
+ ), /* @__PURE__ */ React2__default.default.createElement(
2207
+ "button",
2208
+ {
2209
+ onClick: () => copyToClipboard(shareInfo.password),
2210
+ className: "px-3 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50"
2211
+ },
2212
+ "\u590D\u5236\u5BC6\u7801"
2213
+ )), /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-xs text-yellow-800 mt-2" }, "\u26A0\uFE0F \u8BF7\u59A5\u5584\u4FDD\u7BA1\u8BBF\u95EE\u5BC6\u7801\uFF0C\u8BBF\u95EE\u8005\u9700\u8981\u6B64\u5BC6\u7801\u624D\u80FD\u67E5\u770B\u6587\u4EF6")), /* @__PURE__ */ React2__default.default.createElement("div", { className: "bg-blue-50 p-4 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("h4", { className: "text-sm font-medium text-blue-900 mb-2" }, "\u5206\u4EAB\u4FE1\u606F"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "space-y-1 text-sm text-blue-800" }, /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium" }, "\u6743\u9650\uFF1A"), shareInfo.permission === "view" ? "\u4EC5\u9884\u89C8" : "\u5141\u8BB8\u4E0B\u8F7D"), shareInfo.expiresAt && /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium" }, "\u8FC7\u671F\u65F6\u95F4\uFF1A"), shareInfo.expiresAt.toLocaleString()), /* @__PURE__ */ React2__default.default.createElement("div", null, /* @__PURE__ */ React2__default.default.createElement("span", { className: "font-medium" }, "\u5206\u4EAB\u4EE3\u7801\uFF1A"), shareInfo.shareCode))), /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex space-x-2" }, /* @__PURE__ */ React2__default.default.createElement(
2214
+ "button",
2215
+ {
2216
+ onClick: () => {
2217
+ const shareText = [
2218
+ `\u6587\u4EF6\u5206\u4EAB\uFF1A${formatFileList()}`,
2219
+ `\u94FE\u63A5\uFF1A${shareInfo.shareUrl}`,
2220
+ shareInfo.password ? `\u5BC6\u7801\uFF1A${shareInfo.password}` : "",
2221
+ shareInfo.expiresAt ? `\u8FC7\u671F\u65F6\u95F4\uFF1A${shareInfo.expiresAt.toLocaleString()}` : "\u6C38\u4E0D\u8FC7\u671F"
2222
+ ].filter(Boolean).join("\n");
2223
+ copyToClipboard(shareText);
2224
+ },
2225
+ className: "flex-1 px-4 py-2 text-sm text-blue-600 border border-blue-300 rounded-md hover:bg-blue-50"
2226
+ },
2227
+ "\u{1F4CB} \u590D\u5236\u5B8C\u6574\u4FE1\u606F"
2228
+ ), /* @__PURE__ */ React2__default.default.createElement(
2229
+ "button",
2230
+ {
2231
+ onClick: () => {
2232
+ console.log("\u5176\u4ED6\u5206\u4EAB\u65B9\u5F0F");
2233
+ },
2234
+ className: "px-4 py-2 text-sm text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50"
2235
+ },
2236
+ "\u{1F517} \u5176\u4ED6\u5206\u4EAB\u65B9\u5F0F"
2237
+ )));
2238
+ };
2239
+ return /* @__PURE__ */ React2__default.default.createElement("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "bg-white rounded-lg max-w-md w-full max-h-[90vh] overflow-hidden" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-between p-4 border-b" }, /* @__PURE__ */ React2__default.default.createElement("h2", { className: "text-lg font-medium" }, shareInfo ? "\u5206\u4EAB\u6210\u529F" : "\u521B\u5EFA\u5206\u4EAB\u94FE\u63A5"), /* @__PURE__ */ React2__default.default.createElement(
2240
+ "button",
2241
+ {
2242
+ onClick: onClose,
2243
+ className: "p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100"
2244
+ },
2245
+ "\u2715"
2246
+ )), /* @__PURE__ */ React2__default.default.createElement("div", { className: "p-6 max-h-[calc(90vh-120px)] overflow-y-auto" }, error && /* @__PURE__ */ React2__default.default.createElement("div", { className: "mb-4 p-4 bg-red-50 border border-red-200 rounded-lg" }, /* @__PURE__ */ React2__default.default.createElement("p", { className: "text-red-800 text-sm" }, error)), renderShareSettings(), renderShareResult()), !shareInfo && /* @__PURE__ */ React2__default.default.createElement("div", { className: "flex items-center justify-end space-x-2 p-4 border-t bg-gray-50" }, /* @__PURE__ */ React2__default.default.createElement(
2247
+ "button",
2248
+ {
2249
+ onClick: onClose,
2250
+ className: "px-4 py-2 text-sm text-gray-600 border border-gray-300 rounded-md hover:bg-gray-50"
2251
+ },
2252
+ "\u53D6\u6D88"
2253
+ ), /* @__PURE__ */ React2__default.default.createElement(
2254
+ "button",
2255
+ {
2256
+ onClick: handleCreateShare,
2257
+ disabled: loading || shareOptions.requirePassword && !shareOptions.password,
2258
+ className: "px-4 py-2 text-sm text-white bg-blue-600 rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed"
2259
+ },
2260
+ loading ? /* @__PURE__ */ React2__default.default.createElement("span", { className: "flex items-center" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2" }), "\u521B\u5EFA\u4E2D...") : "\u521B\u5EFA\u5206\u4EAB\u94FE\u63A5"
2261
+ ))));
2262
+ };
2263
+ var FileShareModal_default = FileShareModal;
1043
2264
 
1044
2265
  Object.defineProperty(exports, "CDNProviderError", {
1045
2266
  enumerable: true,
@@ -1077,14 +2298,16 @@ exports.DEFAULT_REQUEST_TIMEOUT = DEFAULT_REQUEST_TIMEOUT;
1077
2298
  exports.DEFAULT_UPLOAD_TIMEOUT = DEFAULT_UPLOAD_TIMEOUT;
1078
2299
  exports.DOCUMENT_EXTENSIONS = DOCUMENT_EXTENSIONS;
1079
2300
  exports.DOCUMENT_MIME_TYPES = DOCUMENT_MIME_TYPES;
1080
- exports.DefaultFileUploader = FileUploader_default;
1081
2301
  exports.ERROR_CODES = ERROR_CODES;
2302
+ exports.FileShareModal = FileShareModal_default;
1082
2303
  exports.FileUploader = FileUploader;
2304
+ exports.FolderManager = FolderManager_default;
1083
2305
  exports.IMAGE_EXTENSIONS = IMAGE_EXTENSIONS;
1084
2306
  exports.IMAGE_MIME_TYPES = IMAGE_MIME_TYPES;
1085
2307
  exports.UNIVERSAL_FILE_NAME = UNIVERSAL_FILE_NAME;
1086
2308
  exports.UNIVERSAL_FILE_VERSION = UNIVERSAL_FILE_VERSION;
1087
2309
  exports.UniversalFileClient = UniversalFileClient;
2310
+ exports.UniversalFileManager = UniversalFileManager;
1088
2311
  exports.VIDEO_EXTENSIONS = VIDEO_EXTENSIONS;
1089
2312
  exports.VIDEO_MIME_TYPES = VIDEO_MIME_TYPES;
1090
2313
  exports.buildQueryString = buildQueryString;