@ai-group/chat-sdk 3.5.7 → 3.5.9

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.
@@ -1,24 +1,28 @@
1
1
  import _taggedTemplateLiteral from "@babel/runtime/helpers/esm/taggedTemplateLiteral";
2
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15;
2
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17;
3
3
  import { css } from "@emotion/css";
4
4
  import { withBasicStyles } from "../../styles/common";
5
5
  export var useStyles = withBasicStyles(function () {
6
6
  return {
7
7
  container: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n "]))),
8
8
  containerNoPreview: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n "]))),
9
- directoryPanel: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n "]))),
9
+ directoryPanel: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n "]))),
10
10
  directoryTitle: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n "]))),
11
- directoryTreeContent: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n padding: 4px 8px;\n\n .ant-tree {\n background: transparent;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n }\n .ant-tree-directory .ant-tree-treenode {\n &::before {\n border-radius: 4px;\n }\n }\n /* \u62D6\u62FD\u6307\u793A\u7EBF\uFF1A\u84DD\u8272\u865A\u7EBF */\n .ant-tree .ant-tree-drop-indicator {\n background: transparent !important;\n border: 1px dashed #1677ff;\n height: 2px;\n }\n /* \u62D6\u62FD\u60AC\u505C\u76EE\u6807\uFF1A\u84DD\u8272\u865A\u7EBF\u8FB9\u6846 */\n .ant-tree .ant-tree-treenode.drag-over > .ant-tree-node-content-wrapper {\n outline: 1px dashed #1677ff;\n outline-offset: -1px;\n border-radius: 4px;\n }\n /* \u62D6\u62FD\u4E2D\u7684\u8282\u70B9\u534A\u900F\u660E */\n .ant-tree .ant-tree-treenode-dragging {\n opacity: 0.4;\n }\n "]))),
12
- previewPanel: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n "]))),
13
- previewTitle: css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n "]))),
14
- previewContent: css(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n "]))),
15
- emptyContainer: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
16
- loadingContainer: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
17
- treeNodeTitle: css(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n "]))),
18
- moreIcon: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n color: #999;\n font-size: 12px;\n transition: all 0.2s;\n\n &:hover {\n border-radius: 50%;\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n "]))),
19
- treeNodeTitleHover: css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n "]))),
20
- inlineInput: css(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n width: 100%;\n .ant-input {\n height: 22px;\n font-size: 13px;\n padding: 0 6px;\n border-radius: 4px;\n }\n "]))),
21
- copyBtn: css(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n "])))
11
+ directoryTreeContent: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n padding: 4px 8px;\n flex: 1;\n\n .ant-tree {\n background: transparent;\n height: 100%;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n overflow: hidden;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n }\n .ant-tree-directory .ant-tree-treenode {\n position: relative;\n &::before {\n border-radius: 4px;\n }\n }\n /* \u81EA\u5B9A\u4E49\u62D6\u62FD\u6837\u5F0F \u2014 \u57FA\u4E8E ant-tree-treenode \u5B9A\u4F4D\uFF0C\u8986\u76D6\u6574\u884C */\n .ant-tree-treenode.folder-tree-drop-before::after {\n content: \"\";\n position: absolute;\n top: -2px;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n border-top: 2px dashed #1677ff;\n z-index: 10;\n pointer-events: none;\n }\n .ant-tree-treenode.folder-tree-drop-inside::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px dashed #1677ff;\n border-radius: 4px;\n background: rgba(22, 119, 255, 0.04);\n z-index: 10;\n pointer-events: none;\n }\n .ant-tree-treenode.folder-tree-drop-after::after {\n content: \"\";\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n border-bottom: 2px dashed #1677ff;\n z-index: 10;\n pointer-events: none;\n }\n "]))),
12
+ /** 自定义拖拽 - 节点可拖拽样式 */
13
+ dragNodeHandle: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n cursor: grab;\n user-select: none;\n\n &:active {\n cursor: grabbing;\n }\n "]))),
14
+ /** 树节点容器,用于相对定位 drop indicator */
15
+ treeNodeWrapper: css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n position: relative;\n min-width: 0;\n overflow: hidden;\n "]))),
16
+ previewPanel: css(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n "]))),
17
+ previewTitle: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n "]))),
18
+ previewContent: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n "]))),
19
+ emptyContainer: css(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
20
+ loadingContainer: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
21
+ treeNodeTitle: css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-width: 0;\n overflow: hidden;\n padding-right: 4px;\n\n > span:first-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n "]))),
22
+ moreIcon: css(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n color: #999;\n font-size: 12px;\n transition: all 0.2s;\n\n &:hover {\n border-radius: 50%;\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n "]))),
23
+ treeNodeTitleHover: css(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n "]))),
24
+ inlineInput: css(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["\n width: 100%;\n .ant-input {\n height: 22px;\n font-size: 13px;\n padding: 0 6px;\n border-radius: 4px;\n }\n "]))),
25
+ copyBtn: css(_templateObject17 || (_templateObject17 = _taggedTemplateLiteral(["\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n "])))
22
26
  };
23
27
  });
24
28
  //# sourceMappingURL=styles.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","previewPanel","_templateObject6","previewTitle","_templateObject7","previewContent","_templateObject8","emptyContainer","_templateObject9","loadingContainer","_templateObject10","treeNodeTitle","_templateObject11","moreIcon","_templateObject12","treeNodeTitleHover","_templateObject13","inlineInput","_templateObject14","copyBtn","_templateObject15"],"sources":["../../../../src/components/FolderTree/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n `,\n containerNoPreview: css`\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n `,\n directoryPanel: css`\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n `,\n directoryTitle: css`\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n `,\n directoryTreeContent: css`\n padding: 4px 8px;\n\n .ant-tree {\n background: transparent;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n }\n .ant-tree-directory .ant-tree-treenode {\n &::before {\n border-radius: 4px;\n }\n }\n /* 拖拽指示线:蓝色虚线 */\n .ant-tree .ant-tree-drop-indicator {\n background: transparent !important;\n border: 1px dashed #1677ff;\n height: 2px;\n }\n /* 拖拽悬停目标:蓝色虚线边框 */\n .ant-tree .ant-tree-treenode.drag-over > .ant-tree-node-content-wrapper {\n outline: 1px dashed #1677ff;\n outline-offset: -1px;\n border-radius: 4px;\n }\n /* 拖拽中的节点半透明 */\n .ant-tree .ant-tree-treenode-dragging {\n opacity: 0.4;\n }\n `,\n previewPanel: css`\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n previewTitle: css`\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n `,\n previewContent: css`\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n `,\n emptyContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n loadingContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n treeNodeTitle: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n `,\n moreIcon: css`\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n color: #999;\n font-size: 12px;\n transition: all 0.2s;\n\n &:hover {\n border-radius: 50%;\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n `,\n treeNodeTitleHover: css`\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n `,\n inlineInput: css`\n width: 100%;\n .ant-input {\n height: 22px;\n font-size: 13px;\n padding: 0 6px;\n border-radius: 4px;\n }\n `,\n copyBtn: css`\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n `,\n}));\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,6KAQb;IACDC,kBAAkB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,oIAOtB;IACDG,cAAc,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,qJAKlB;IACDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,2IAMlB;IACDO,oBAAoB,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,gnCAyCxB;IACDS,YAAY,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,mHAMhB;IACDW,YAAY,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,qPAUhB;IACDa,cAAc,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,gHAMlB;IACDe,cAAc,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,2GAKlB;IACDiB,gBAAgB,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,2GAKpB;IACDmB,aAAa,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,wHAKjB;IACDqB,QAAQ,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,4QAcZ;IACDuB,kBAAkB,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,4EAItB;IACDyB,WAAW,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA,sJAQf;IACD2B,OAAO,EAAEhC,GAAG,CAAAiC,iBAAA,KAAAA,iBAAA,GAAA5B,sBAAA;EAQd,CAAC;AAAA,CAAC,CAAC"}
1
+ {"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","dragNodeHandle","_templateObject6","treeNodeWrapper","_templateObject7","previewPanel","_templateObject8","previewTitle","_templateObject9","previewContent","_templateObject10","emptyContainer","_templateObject11","loadingContainer","_templateObject12","treeNodeTitle","_templateObject13","moreIcon","_templateObject14","treeNodeTitleHover","_templateObject15","inlineInput","_templateObject16","copyBtn","_templateObject17"],"sources":["../../../../src/components/FolderTree/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n `,\n containerNoPreview: css`\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n `,\n directoryPanel: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n `,\n directoryTitle: css`\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n `,\n directoryTreeContent: css`\n padding: 4px 8px;\n flex: 1;\n\n .ant-tree {\n background: transparent;\n height: 100%;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n overflow: hidden;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n }\n .ant-tree-directory .ant-tree-treenode {\n position: relative;\n &::before {\n border-radius: 4px;\n }\n }\n /* 自定义拖拽样式 — 基于 ant-tree-treenode 定位,覆盖整行 */\n .ant-tree-treenode.folder-tree-drop-before::after {\n content: \"\";\n position: absolute;\n top: -2px;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n border-top: 2px dashed #1677ff;\n z-index: 10;\n pointer-events: none;\n }\n .ant-tree-treenode.folder-tree-drop-inside::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px dashed #1677ff;\n border-radius: 4px;\n background: rgba(22, 119, 255, 0.04);\n z-index: 10;\n pointer-events: none;\n }\n .ant-tree-treenode.folder-tree-drop-after::after {\n content: \"\";\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n border-bottom: 2px dashed #1677ff;\n z-index: 10;\n pointer-events: none;\n }\n `,\n\n /** 自定义拖拽 - 节点可拖拽样式 */\n dragNodeHandle: css`\n cursor: grab;\n user-select: none;\n\n &:active {\n cursor: grabbing;\n }\n `,\n /** 树节点容器,用于相对定位 drop indicator */\n treeNodeWrapper: css`\n position: relative;\n min-width: 0;\n overflow: hidden;\n `,\n previewPanel: css`\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n previewTitle: css`\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n `,\n previewContent: css`\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n `,\n emptyContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n loadingContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n treeNodeTitle: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-width: 0;\n overflow: hidden;\n padding-right: 4px;\n\n > span:first-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n `,\n moreIcon: css`\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n color: #999;\n font-size: 12px;\n transition: all 0.2s;\n\n &:hover {\n border-radius: 50%;\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n `,\n treeNodeTitleHover: css`\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n `,\n inlineInput: css`\n width: 100%;\n .ant-input {\n height: 22px;\n font-size: 13px;\n padding: 0 6px;\n border-radius: 4px;\n }\n `,\n copyBtn: css`\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n `,\n}));\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,6KAQb;IACDC,kBAAkB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,oIAOtB;IACDG,cAAc,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,sMAOlB;IACDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,2IAMlB;IACDO,oBAAoB,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,2qDAoEtB;IAEH;IACAS,cAAc,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,yGAOlB;IACD;IACAW,eAAe,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,+EAInB;IACDa,YAAY,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,mHAMhB;IACDe,YAAY,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,qPAUhB;IACDiB,cAAc,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,gHAMlB;IACDmB,cAAc,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,2GAKlB;IACDqB,gBAAgB,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,2GAKpB;IACDuB,aAAa,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,0RAajB;IACDyB,QAAQ,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA,4QAcZ;IACD2B,kBAAkB,EAAEhC,GAAG,CAAAiC,iBAAA,KAAAA,iBAAA,GAAA5B,sBAAA,4EAItB;IACD6B,WAAW,EAAElC,GAAG,CAAAmC,iBAAA,KAAAA,iBAAA,GAAA9B,sBAAA,sJAQf;IACD+B,OAAO,EAAEpC,GAAG,CAAAqC,iBAAA,KAAAA,iBAAA,GAAAhC,sBAAA;EAQd,CAAC;AAAA,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ /// <reference types="react" />
2
+ import type { DataNode } from "antd/es/tree";
3
+ /**
4
+ * Drop position:
5
+ * -1 = before the node (gap above)
6
+ * 0 = inside the node (as child, for folders only)
7
+ * 1 = after the node (gap below)
8
+ */
9
+ export type DropPosition = -1 | 0 | 1;
10
+ export interface DragState {
11
+ /** 拖拽中的节点 key */
12
+ dragNodeKey: string | null;
13
+ /** 当前悬停的目标节点 key */
14
+ dropNodeKey: string | null;
15
+ /** drop 位置 */
16
+ dropPosition: DropPosition;
17
+ }
18
+ export interface UseFolderDragOptions {
19
+ /** 是否启用拖拽('file' | 'folder' | 'all') */
20
+ dragMode: "file" | "folder" | "all" | false;
21
+ /** 拖拽完成回调 */
22
+ onDrop?: (dragNode: DataNode, dropNode: DataNode, dropPosition: DropPosition) => void;
23
+ /** 拖拽进入节点时回调(用于自动展开) */
24
+ onDragEnterExpand?: (nodeKey: string) => void;
25
+ }
26
+ export interface UseFolderDragReturn {
27
+ dragState: DragState;
28
+ /** 绑定到 draggable 元素的 onDragStart */
29
+ onDragStart: (e: React.DragEvent, node: DataNode) => void;
30
+ /** 绑定到 draggable 元素的 onDragEnd */
31
+ onDragEnd: (e: React.DragEvent) => void;
32
+ /** 绑定到每个树节点容器的 onDragEnter */
33
+ onItemDragEnter: (e: React.DragEvent, node: DataNode) => void;
34
+ /** 绑定到每个树节点容器的 onDragOver */
35
+ onItemDragOver: (e: React.DragEvent, node: DataNode) => void;
36
+ /** 绑定到每个树节点容器的 onDragLeave */
37
+ onItemDragLeave: (e: React.DragEvent) => void;
38
+ /** 绑定到每个树节点容器的 onDrop */
39
+ onItemDrop: (e: React.DragEvent, node: DataNode) => void;
40
+ /** 绑定到树内容容器(directoryTreeContent)的 onDragOver,处理拖到空白区域 */
41
+ onContainerDragOver: (e: React.DragEvent) => void;
42
+ /** 绑定到树内容容器(directoryTreeContent)的 onDrop,处理拖到空白区域 */
43
+ onContainerDrop: (e: React.DragEvent) => void;
44
+ /** 清除拖拽状态 */
45
+ clearDragState: () => void;
46
+ /** 是否正在拖拽中 */
47
+ isDragging: boolean;
48
+ /** 判断节点是否可拖拽 */
49
+ canDragNode: (node: DataNode & {
50
+ _isTempNode?: boolean;
51
+ }) => boolean;
52
+ }
53
+ export declare function useFolderDrag(options: UseFolderDragOptions): UseFolderDragReturn;
@@ -0,0 +1,324 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import { useCallback, useRef, useState } from "react";
4
+
5
+ /**
6
+ * Drop position:
7
+ * -1 = before the node (gap above)
8
+ * 0 = inside the node (as child, for folders only)
9
+ * 1 = after the node (gap below)
10
+ */
11
+
12
+ /**
13
+ * 根据鼠标 Y 坐标和节点 DOM rect 计算 dropPosition
14
+ */
15
+ function calcDropPositionByRect(clientY, rect, isFolder) {
16
+ var top = rect.top;
17
+ var height = rect.height;
18
+ var relativeY = clientY - top;
19
+
20
+ // 上半部分 1/3:before
21
+ if (relativeY < height / 3) {
22
+ return {
23
+ dropPosition: -1,
24
+ insideThreshold: false
25
+ };
26
+ }
27
+ // 下半部分 1/3:after
28
+ if (relativeY > height * 2 / 3) {
29
+ return {
30
+ dropPosition: 1,
31
+ insideThreshold: false
32
+ };
33
+ }
34
+ // 中间 1/3:如果是文件夹,drop inside;如果是文件,drop after
35
+ if (isFolder) {
36
+ return {
37
+ dropPosition: 0,
38
+ insideThreshold: true
39
+ };
40
+ }
41
+ return {
42
+ dropPosition: 1,
43
+ insideThreshold: false
44
+ };
45
+ }
46
+ var INDICATOR_BEFORE_CLASS = "folder-tree-drop-before";
47
+ var INDICATOR_INSIDE_CLASS = "folder-tree-drop-inside";
48
+ var INDICATOR_AFTER_CLASS = "folder-tree-drop-after";
49
+ var INDICATOR_CLASSES = [INDICATOR_BEFORE_CLASS, INDICATOR_INSIDE_CLASS, INDICATOR_AFTER_CLASS];
50
+
51
+ /** 从 data-node-key 元素找到对应的 ant-tree-treenode */
52
+ function getTreeNodeEl(dataNodeKeyEl) {
53
+ return dataNodeKeyEl.closest(".ant-tree-treenode");
54
+ }
55
+
56
+ /** 清除所有 treenode 上的 indicator class */
57
+ function clearAllTreenodeIndicators() {
58
+ document.querySelectorAll(".ant-tree-treenode").forEach(function (el) {
59
+ var _el$classList;
60
+ (_el$classList = el.classList).remove.apply(_el$classList, INDICATOR_CLASSES);
61
+ });
62
+ }
63
+ export function useFolderDrag(options) {
64
+ var dragMode = options.dragMode,
65
+ onDrop = options.onDrop,
66
+ onDragEnterExpand = options.onDragEnterExpand;
67
+ var _useState = useState({
68
+ dragNodeKey: null,
69
+ dropNodeKey: null,
70
+ dropPosition: 0
71
+ }),
72
+ _useState2 = _slicedToArray(_useState, 2),
73
+ dragState = _useState2[0],
74
+ setDragState = _useState2[1];
75
+ var _useState3 = useState(false),
76
+ _useState4 = _slicedToArray(_useState3, 2),
77
+ isDragging = _useState4[0],
78
+ setIsDragging = _useState4[1];
79
+
80
+ // 用 ref 追踪拖拽中数据,避免闭包问题
81
+ var dragNodeRef = useRef(null);
82
+ var expandTimerRef = useRef(null);
83
+ var prevDropTargetRef = useRef(null);
84
+ var canDragNode = useCallback(function (node) {
85
+ if (node._isTempNode) return false;
86
+ if (dragMode === "file") return !!node.isLeaf;
87
+ if (dragMode === "folder") return !node.isLeaf;
88
+ return true; // 'all'
89
+ }, [dragMode]);
90
+ var clearAllIndicators = useCallback(function () {
91
+ clearAllTreenodeIndicators();
92
+ }, []);
93
+ var clearDragState = useCallback(function () {
94
+ clearAllIndicators();
95
+ // 恢复所有 treenode 的透明度
96
+ document.querySelectorAll(".ant-tree-treenode").forEach(function (el) {
97
+ el.style.opacity = "";
98
+ });
99
+ setDragState({
100
+ dragNodeKey: null,
101
+ dropNodeKey: null,
102
+ dropPosition: 0
103
+ });
104
+ setIsDragging(false);
105
+ dragNodeRef.current = null;
106
+ prevDropTargetRef.current = null;
107
+ if (expandTimerRef.current) {
108
+ clearTimeout(expandTimerRef.current);
109
+ expandTimerRef.current = null;
110
+ }
111
+ }, [clearAllIndicators]);
112
+ var onDragStart = useCallback(function (e, node) {
113
+ if (!dragMode) return;
114
+ var nd = node;
115
+ if (!canDragNode(nd)) {
116
+ e.preventDefault();
117
+ return;
118
+ }
119
+ dragNodeRef.current = node;
120
+ setIsDragging(true);
121
+ setDragState(function (prev) {
122
+ return _objectSpread(_objectSpread({}, prev), {}, {
123
+ dragNodeKey: String(node.key)
124
+ });
125
+ });
126
+
127
+ // 标记被拖拽的节点(在 treenode 上加 translucent)
128
+ var treeNodeEl = getTreeNodeEl(e.currentTarget);
129
+ if (treeNodeEl) {
130
+ treeNodeEl.style.opacity = "0.4";
131
+ }
132
+ e.dataTransfer.effectAllowed = "move";
133
+ e.dataTransfer.setData("text/plain", String(node.key));
134
+ }, [dragMode, canDragNode]);
135
+ var onDragEnd = useCallback(function (_e) {
136
+ clearDragState();
137
+ }, [clearDragState]);
138
+ var onItemDragEnter = useCallback(function (e, node) {
139
+ e.preventDefault();
140
+ e.stopPropagation();
141
+ if (!dragNodeRef.current) return;
142
+ var nodeKey = String(node.key);
143
+ var dragKey = String(dragNodeRef.current.key);
144
+
145
+ // 不能拖到自己身上
146
+ if (nodeKey === dragKey) return;
147
+
148
+ // 自动展开收起状态的文件夹
149
+ if (!node.isLeaf) {
150
+ if (expandTimerRef.current) {
151
+ clearTimeout(expandTimerRef.current);
152
+ }
153
+ expandTimerRef.current = setTimeout(function () {
154
+ onDragEnterExpand === null || onDragEnterExpand === void 0 || onDragEnterExpand(nodeKey);
155
+ }, 800);
156
+ }
157
+ }, [onDragEnterExpand]);
158
+ var onItemDragOver = useCallback(function (e, node) {
159
+ var _currentTreeNode$clas;
160
+ e.preventDefault();
161
+ e.stopPropagation();
162
+ if (!dragNodeRef.current) return;
163
+ var nodeKey = String(node.key);
164
+ var dragKey = String(dragNodeRef.current.key);
165
+ if (nodeKey === dragKey) return;
166
+ var rect = e.currentTarget.getBoundingClientRect();
167
+ var isFolder = !node.isLeaf;
168
+ var _calcDropPositionByRe = calcDropPositionByRect(e.clientY, rect, isFolder),
169
+ dropPosition = _calcDropPositionByRe.dropPosition;
170
+
171
+ // 如果节点是文件且计算结果是 inside(0),改为 after(1)
172
+ var finalDropPosition = !isFolder && dropPosition === 0 ? 1 : dropPosition;
173
+ var currentTreeNode = getTreeNodeEl(e.currentTarget);
174
+ if (!currentTreeNode) return;
175
+
176
+ // 清除上一个节点的 indicator
177
+ if (prevDropTargetRef.current && prevDropTargetRef.current !== nodeKey) {
178
+ var _document$querySelect;
179
+ var prevTreeNode = (_document$querySelect = document.querySelector(".ant-tree-treenode [data-node-key=\"".concat(prevDropTargetRef.current, "\"]"))) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.closest(".ant-tree-treenode");
180
+ if (prevTreeNode) {
181
+ var _prevTreeNode$classLi;
182
+ (_prevTreeNode$classLi = prevTreeNode.classList).remove.apply(_prevTreeNode$classLi, INDICATOR_CLASSES);
183
+ }
184
+ }
185
+ prevDropTargetRef.current = nodeKey;
186
+
187
+ // 在当前 treenode 上设置 indicator class
188
+ (_currentTreeNode$clas = currentTreeNode.classList).remove.apply(_currentTreeNode$clas, INDICATOR_CLASSES);
189
+ var cls = finalDropPosition === -1 ? INDICATOR_BEFORE_CLASS : finalDropPosition === 0 ? INDICATOR_INSIDE_CLASS : INDICATOR_AFTER_CLASS;
190
+ currentTreeNode.classList.add(cls);
191
+ setDragState({
192
+ dragNodeKey: dragKey,
193
+ dropNodeKey: nodeKey,
194
+ dropPosition: finalDropPosition
195
+ });
196
+ e.dataTransfer.dropEffect = "move";
197
+ }, []);
198
+ var onItemDragLeave = useCallback(function (_e) {
199
+ // 不清除 dragState,因为可能只是进入子元素触发的 leave
200
+ }, []);
201
+ var onItemDrop = useCallback(function (e, node) {
202
+ e.preventDefault();
203
+ e.stopPropagation();
204
+ if (!dragNodeRef.current) return;
205
+ var nodeKey = String(node.key);
206
+ var dragKey = String(dragNodeRef.current.key);
207
+ if (nodeKey === dragKey) {
208
+ clearDragState();
209
+ return;
210
+ }
211
+ var rect = e.currentTarget.getBoundingClientRect();
212
+ var isFolder = !node.isLeaf;
213
+ var _calcDropPositionByRe2 = calcDropPositionByRect(e.clientY, rect, isFolder),
214
+ dropPosition = _calcDropPositionByRe2.dropPosition;
215
+ var finalDropPosition = !isFolder && dropPosition === 0 ? 1 : dropPosition;
216
+ onDrop === null || onDrop === void 0 || onDrop(dragNodeRef.current, node, finalDropPosition);
217
+ clearDragState();
218
+ }, [onDrop, clearDragState]);
219
+
220
+ // ====== 容器级别的事件处理(用于拖到空白区域/底部) ======
221
+
222
+ /**
223
+ * 获取容器内所有可见的 data-node-key 元素的 rect 列表,
224
+ * 用于判断鼠标是否在最后一个节点下方
225
+ */
226
+ var getLastNodeRect = useCallback(function (containerEl) {
227
+ var nodeEls = containerEl.querySelectorAll("[data-node-key]");
228
+ if (nodeEls.length === 0) return null;
229
+ var lastEl = nodeEls[nodeEls.length - 1];
230
+ return lastEl.getBoundingClientRect();
231
+ }, []);
232
+ var onContainerDragOver = useCallback(function (e) {
233
+ if (!dragNodeRef.current) return;
234
+ var containerEl = e.currentTarget;
235
+
236
+ // 检查鼠标是否在某个节点上(通过判断 event target 是否在 data-node-key 元素内)
237
+ var targetEl = e.target;
238
+ var isOnNode = targetEl.closest("[data-node-key]");
239
+ if (isOnNode) {
240
+ // 鼠标在节点上,由 onItemDragOver 处理,这里清除底部相关的 indicator
241
+ if (prevDropTargetRef.current === "__bottom_placeholder__") {
242
+ clearAllIndicators();
243
+ prevDropTargetRef.current = null;
244
+ }
245
+ return;
246
+ }
247
+
248
+ // 鼠标在空白区域,检查是否在所有节点下方
249
+ var lastRect = getLastNodeRect(containerEl);
250
+ if (lastRect && e.clientY > lastRect.bottom) {
251
+ e.preventDefault();
252
+ e.stopPropagation();
253
+
254
+ // 清除其他节点的 indicator
255
+ if (prevDropTargetRef.current && prevDropTargetRef.current !== "__bottom_placeholder__") {
256
+ var _document$querySelect2;
257
+ var prevTreeNode = (_document$querySelect2 = document.querySelector(".ant-tree-treenode [data-node-key=\"".concat(prevDropTargetRef.current, "\"]"))) === null || _document$querySelect2 === void 0 ? void 0 : _document$querySelect2.closest(".ant-tree-treenode");
258
+ if (prevTreeNode) {
259
+ var _prevTreeNode$classLi2;
260
+ (_prevTreeNode$classLi2 = prevTreeNode.classList).remove.apply(_prevTreeNode$classLi2, INDICATOR_CLASSES);
261
+ }
262
+ }
263
+ prevDropTargetRef.current = "__bottom_placeholder__";
264
+
265
+ // 在最后一个 treenode 上显示 after 样式
266
+ var lastNodeEls = containerEl.querySelectorAll(".ant-tree-treenode");
267
+ var lastTreenode = lastNodeEls[lastNodeEls.length - 1];
268
+ if (lastTreenode) {
269
+ var _lastTreenode$classLi;
270
+ (_lastTreenode$classLi = lastTreenode.classList).remove.apply(_lastTreenode$classLi, INDICATOR_CLASSES);
271
+ lastTreenode.classList.add(INDICATOR_AFTER_CLASS);
272
+ }
273
+ setDragState({
274
+ dragNodeKey: String(dragNodeRef.current.key),
275
+ dropNodeKey: "__bottom_placeholder__",
276
+ dropPosition: 1
277
+ });
278
+ e.dataTransfer.dropEffect = "move";
279
+ }
280
+ }, [clearAllIndicators, getLastNodeRect]);
281
+ var onContainerDrop = useCallback(function (e) {
282
+ if (!dragNodeRef.current) {
283
+ return;
284
+ }
285
+ var containerEl = e.currentTarget;
286
+ var targetEl = e.target;
287
+ var isOnNode = targetEl.closest("[data-node-key]");
288
+ if (isOnNode) {
289
+ // 鼠标在节点上,由 onItemDrop 处理
290
+ return;
291
+ }
292
+
293
+ // 检查是否在最后一个节点下方
294
+ var lastRect = getLastNodeRect(containerEl);
295
+ if (lastRect && e.clientY > lastRect.bottom) {
296
+ e.preventDefault();
297
+ e.stopPropagation();
298
+
299
+ // 拖到最底部:视为 insert after 最后一个根节点
300
+ var placeholderNode = {
301
+ key: "__bottom_placeholder__",
302
+ title: "",
303
+ isLeaf: true
304
+ };
305
+ onDrop === null || onDrop === void 0 || onDrop(dragNodeRef.current, placeholderNode, 1);
306
+ clearDragState();
307
+ }
308
+ }, [onDrop, clearDragState, getLastNodeRect]);
309
+ return {
310
+ dragState: dragState,
311
+ onDragStart: onDragStart,
312
+ onDragEnd: onDragEnd,
313
+ onItemDragEnter: onItemDragEnter,
314
+ onItemDragOver: onItemDragOver,
315
+ onItemDragLeave: onItemDragLeave,
316
+ onItemDrop: onItemDrop,
317
+ onContainerDragOver: onContainerDragOver,
318
+ onContainerDrop: onContainerDrop,
319
+ clearDragState: clearDragState,
320
+ isDragging: isDragging,
321
+ canDragNode: canDragNode
322
+ };
323
+ }
324
+ //# sourceMappingURL=useFolderDrag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useRef","useState","calcDropPositionByRect","clientY","rect","isFolder","top","height","relativeY","dropPosition","insideThreshold","INDICATOR_BEFORE_CLASS","INDICATOR_INSIDE_CLASS","INDICATOR_AFTER_CLASS","INDICATOR_CLASSES","getTreeNodeEl","dataNodeKeyEl","closest","clearAllTreenodeIndicators","document","querySelectorAll","forEach","el","_el$classList","classList","remove","apply","useFolderDrag","options","dragMode","onDrop","onDragEnterExpand","_useState","dragNodeKey","dropNodeKey","_useState2","_slicedToArray","dragState","setDragState","_useState3","_useState4","isDragging","setIsDragging","dragNodeRef","expandTimerRef","prevDropTargetRef","canDragNode","node","_isTempNode","isLeaf","clearAllIndicators","clearDragState","style","opacity","current","clearTimeout","onDragStart","e","nd","preventDefault","prev","_objectSpread","String","key","treeNodeEl","currentTarget","dataTransfer","effectAllowed","setData","onDragEnd","_e","onItemDragEnter","stopPropagation","nodeKey","dragKey","setTimeout","onItemDragOver","_currentTreeNode$clas","getBoundingClientRect","_calcDropPositionByRe","finalDropPosition","currentTreeNode","_document$querySelect","prevTreeNode","querySelector","concat","_prevTreeNode$classLi","cls","add","dropEffect","onItemDragLeave","onItemDrop","_calcDropPositionByRe2","getLastNodeRect","containerEl","nodeEls","length","lastEl","onContainerDragOver","targetEl","target","isOnNode","lastRect","bottom","_document$querySelect2","_prevTreeNode$classLi2","lastNodeEls","lastTreenode","_lastTreenode$classLi","onContainerDrop","placeholderNode","title"],"sources":["../../../../src/components/FolderTree/useFolderDrag.ts"],"sourcesContent":["import { useCallback, useRef, useState } from \"react\";\nimport type { DataNode } from \"antd/es/tree\";\n\n/**\n * Drop position:\n * -1 = before the node (gap above)\n * 0 = inside the node (as child, for folders only)\n * 1 = after the node (gap below)\n */\nexport type DropPosition = -1 | 0 | 1;\n\nexport interface DragState {\n /** 拖拽中的节点 key */\n dragNodeKey: string | null;\n /** 当前悬停的目标节点 key */\n dropNodeKey: string | null;\n /** drop 位置 */\n dropPosition: DropPosition;\n}\n\nexport interface UseFolderDragOptions {\n /** 是否启用拖拽('file' | 'folder' | 'all') */\n dragMode: \"file\" | \"folder\" | \"all\" | false;\n /** 拖拽完成回调 */\n onDrop?: (dragNode: DataNode, dropNode: DataNode, dropPosition: DropPosition) => void;\n /** 拖拽进入节点时回调(用于自动展开) */\n onDragEnterExpand?: (nodeKey: string) => void;\n}\n\nexport interface UseFolderDragReturn {\n dragState: DragState;\n /** 绑定到 draggable 元素的 onDragStart */\n onDragStart: (e: React.DragEvent, node: DataNode) => void;\n /** 绑定到 draggable 元素的 onDragEnd */\n onDragEnd: (e: React.DragEvent) => void;\n /** 绑定到每个树节点容器的 onDragEnter */\n onItemDragEnter: (e: React.DragEvent, node: DataNode) => void;\n /** 绑定到每个树节点容器的 onDragOver */\n onItemDragOver: (e: React.DragEvent, node: DataNode) => void;\n /** 绑定到每个树节点容器的 onDragLeave */\n onItemDragLeave: (e: React.DragEvent) => void;\n /** 绑定到每个树节点容器的 onDrop */\n onItemDrop: (e: React.DragEvent, node: DataNode) => void;\n /** 绑定到树内容容器(directoryTreeContent)的 onDragOver,处理拖到空白区域 */\n onContainerDragOver: (e: React.DragEvent) => void;\n /** 绑定到树内容容器(directoryTreeContent)的 onDrop,处理拖到空白区域 */\n onContainerDrop: (e: React.DragEvent) => void;\n /** 清除拖拽状态 */\n clearDragState: () => void;\n /** 是否正在拖拽中 */\n isDragging: boolean;\n /** 判断节点是否可拖拽 */\n canDragNode: (node: DataNode & { _isTempNode?: boolean }) => boolean;\n}\n\n/**\n * 根据鼠标 Y 坐标和节点 DOM rect 计算 dropPosition\n */\nfunction calcDropPositionByRect(\n clientY: number,\n rect: DOMRect,\n isFolder: boolean,\n): { dropPosition: DropPosition; insideThreshold: boolean } {\n const top = rect.top;\n const height = rect.height;\n const relativeY = clientY - top;\n\n // 上半部分 1/3:before\n if (relativeY < height / 3) {\n return { dropPosition: -1, insideThreshold: false };\n }\n // 下半部分 1/3:after\n if (relativeY > (height * 2) / 3) {\n return { dropPosition: 1, insideThreshold: false };\n }\n // 中间 1/3:如果是文件夹,drop inside;如果是文件,drop after\n if (isFolder) {\n return { dropPosition: 0, insideThreshold: true };\n }\n return { dropPosition: 1, insideThreshold: false };\n}\n\nconst INDICATOR_BEFORE_CLASS = \"folder-tree-drop-before\";\nconst INDICATOR_INSIDE_CLASS = \"folder-tree-drop-inside\";\nconst INDICATOR_AFTER_CLASS = \"folder-tree-drop-after\";\n\nconst INDICATOR_CLASSES = [INDICATOR_BEFORE_CLASS, INDICATOR_INSIDE_CLASS, INDICATOR_AFTER_CLASS];\n\n/** 从 data-node-key 元素找到对应的 ant-tree-treenode */\nfunction getTreeNodeEl(dataNodeKeyEl: HTMLElement): HTMLElement | null {\n return dataNodeKeyEl.closest(\".ant-tree-treenode\") as HTMLElement | null;\n}\n\n/** 清除所有 treenode 上的 indicator class */\nfunction clearAllTreenodeIndicators() {\n document.querySelectorAll(\".ant-tree-treenode\").forEach((el) => {\n el.classList.remove(...INDICATOR_CLASSES);\n });\n}\n\nexport function useFolderDrag(options: UseFolderDragOptions): UseFolderDragReturn {\n const { dragMode, onDrop, onDragEnterExpand } = options;\n\n const [dragState, setDragState] = useState<DragState>({\n dragNodeKey: null,\n dropNodeKey: null,\n dropPosition: 0,\n });\n const [isDragging, setIsDragging] = useState(false);\n\n // 用 ref 追踪拖拽中数据,避免闭包问题\n const dragNodeRef = useRef<DataNode | null>(null);\n const expandTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const prevDropTargetRef = useRef<string | null>(null);\n\n const canDragNode = useCallback(\n (node: DataNode & { _isTempNode?: boolean }) => {\n if (node._isTempNode) return false;\n if (dragMode === \"file\") return !!node.isLeaf;\n if (dragMode === \"folder\") return !node.isLeaf;\n return true; // 'all'\n },\n [dragMode],\n );\n\n const clearAllIndicators = useCallback(() => {\n clearAllTreenodeIndicators();\n }, []);\n\n const clearDragState = useCallback(() => {\n clearAllIndicators();\n // 恢复所有 treenode 的透明度\n document.querySelectorAll(\".ant-tree-treenode\").forEach((el) => {\n (el as HTMLElement).style.opacity = \"\";\n });\n\n setDragState({\n dragNodeKey: null,\n dropNodeKey: null,\n dropPosition: 0,\n });\n setIsDragging(false);\n dragNodeRef.current = null;\n prevDropTargetRef.current = null;\n if (expandTimerRef.current) {\n clearTimeout(expandTimerRef.current);\n expandTimerRef.current = null;\n }\n }, [clearAllIndicators]);\n\n const onDragStart = useCallback(\n (e: React.DragEvent, node: DataNode) => {\n if (!dragMode) return;\n const nd = node as DataNode & { _isTempNode?: boolean };\n if (!canDragNode(nd)) {\n e.preventDefault();\n return;\n }\n\n dragNodeRef.current = node;\n setIsDragging(true);\n setDragState((prev) => ({\n ...prev,\n dragNodeKey: String(node.key),\n }));\n\n // 标记被拖拽的节点(在 treenode 上加 translucent)\n const treeNodeEl = getTreeNodeEl(e.currentTarget as HTMLElement);\n if (treeNodeEl) {\n treeNodeEl.style.opacity = \"0.4\";\n }\n\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", String(node.key));\n },\n [dragMode, canDragNode],\n );\n\n const onDragEnd = useCallback(\n (_e: React.DragEvent) => {\n clearDragState();\n },\n [clearDragState],\n );\n\n const onItemDragEnter = useCallback(\n (e: React.DragEvent, node: DataNode) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!dragNodeRef.current) return;\n\n const nodeKey = String(node.key);\n const dragKey = String(dragNodeRef.current.key);\n\n // 不能拖到自己身上\n if (nodeKey === dragKey) return;\n\n // 自动展开收起状态的文件夹\n if (!node.isLeaf) {\n if (expandTimerRef.current) {\n clearTimeout(expandTimerRef.current);\n }\n expandTimerRef.current = setTimeout(() => {\n onDragEnterExpand?.(nodeKey);\n }, 800);\n }\n },\n [onDragEnterExpand],\n );\n\n const onItemDragOver = useCallback(\n (e: React.DragEvent, node: DataNode) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!dragNodeRef.current) return;\n\n const nodeKey = String(node.key);\n const dragKey = String(dragNodeRef.current.key);\n if (nodeKey === dragKey) return;\n\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const isFolder = !node.isLeaf;\n const { dropPosition } = calcDropPositionByRect(e.clientY, rect, isFolder);\n\n // 如果节点是文件且计算结果是 inside(0),改为 after(1)\n const finalDropPosition = (!isFolder && dropPosition === 0 ? 1 : dropPosition) as DropPosition;\n\n const currentTreeNode = getTreeNodeEl(e.currentTarget as HTMLElement);\n if (!currentTreeNode) return;\n\n // 清除上一个节点的 indicator\n if (prevDropTargetRef.current && prevDropTargetRef.current !== nodeKey) {\n const prevTreeNode = document.querySelector(\n `.ant-tree-treenode [data-node-key=\"${prevDropTargetRef.current}\"]`,\n )?.closest(\".ant-tree-treenode\");\n if (prevTreeNode) {\n prevTreeNode.classList.remove(...INDICATOR_CLASSES);\n }\n }\n prevDropTargetRef.current = nodeKey;\n\n // 在当前 treenode 上设置 indicator class\n currentTreeNode.classList.remove(...INDICATOR_CLASSES);\n const cls =\n finalDropPosition === -1\n ? INDICATOR_BEFORE_CLASS\n : finalDropPosition === 0\n ? INDICATOR_INSIDE_CLASS\n : INDICATOR_AFTER_CLASS;\n currentTreeNode.classList.add(cls);\n\n setDragState({\n dragNodeKey: dragKey,\n dropNodeKey: nodeKey,\n dropPosition: finalDropPosition,\n });\n\n e.dataTransfer.dropEffect = \"move\";\n },\n [],\n );\n\n const onItemDragLeave = useCallback((_e: React.DragEvent) => {\n // 不清除 dragState,因为可能只是进入子元素触发的 leave\n }, []);\n\n const onItemDrop = useCallback(\n (e: React.DragEvent, node: DataNode) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!dragNodeRef.current) return;\n\n const nodeKey = String(node.key);\n const dragKey = String(dragNodeRef.current.key);\n if (nodeKey === dragKey) {\n clearDragState();\n return;\n }\n\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const isFolder = !node.isLeaf;\n const { dropPosition } = calcDropPositionByRect(e.clientY, rect, isFolder);\n const finalDropPosition = (!isFolder && dropPosition === 0 ? 1 : dropPosition) as DropPosition;\n\n onDrop?.(dragNodeRef.current, node, finalDropPosition);\n clearDragState();\n },\n [onDrop, clearDragState],\n );\n\n // ====== 容器级别的事件处理(用于拖到空白区域/底部) ======\n\n /**\n * 获取容器内所有可见的 data-node-key 元素的 rect 列表,\n * 用于判断鼠标是否在最后一个节点下方\n */\n const getLastNodeRect = useCallback(\n (containerEl: HTMLElement): DOMRect | null => {\n const nodeEls = containerEl.querySelectorAll(\"[data-node-key]\");\n if (nodeEls.length === 0) return null;\n const lastEl = nodeEls[nodeEls.length - 1];\n return lastEl.getBoundingClientRect();\n },\n [],\n );\n\n const onContainerDragOver = useCallback(\n (e: React.DragEvent) => {\n if (!dragNodeRef.current) return;\n\n const containerEl = e.currentTarget as HTMLElement;\n\n // 检查鼠标是否在某个节点上(通过判断 event target 是否在 data-node-key 元素内)\n const targetEl = e.target as HTMLElement;\n const isOnNode = targetEl.closest(\"[data-node-key]\");\n\n if (isOnNode) {\n // 鼠标在节点上,由 onItemDragOver 处理,这里清除底部相关的 indicator\n if (prevDropTargetRef.current === \"__bottom_placeholder__\") {\n clearAllIndicators();\n prevDropTargetRef.current = null;\n }\n return;\n }\n\n // 鼠标在空白区域,检查是否在所有节点下方\n const lastRect = getLastNodeRect(containerEl);\n if (lastRect && e.clientY > lastRect.bottom) {\n e.preventDefault();\n e.stopPropagation();\n\n // 清除其他节点的 indicator\n if (prevDropTargetRef.current && prevDropTargetRef.current !== \"__bottom_placeholder__\") {\n const prevTreeNode = document.querySelector(\n `.ant-tree-treenode [data-node-key=\"${prevDropTargetRef.current}\"]`,\n )?.closest(\".ant-tree-treenode\");\n if (prevTreeNode) {\n prevTreeNode.classList.remove(...INDICATOR_CLASSES);\n }\n }\n prevDropTargetRef.current = \"__bottom_placeholder__\";\n\n // 在最后一个 treenode 上显示 after 样式\n const lastNodeEls = containerEl.querySelectorAll(\".ant-tree-treenode\");\n const lastTreenode = lastNodeEls[lastNodeEls.length - 1] as HTMLElement | undefined;\n if (lastTreenode) {\n lastTreenode.classList.remove(...INDICATOR_CLASSES);\n lastTreenode.classList.add(INDICATOR_AFTER_CLASS);\n }\n\n setDragState({\n dragNodeKey: String(dragNodeRef.current.key),\n dropNodeKey: \"__bottom_placeholder__\",\n dropPosition: 1 as DropPosition,\n });\n\n e.dataTransfer.dropEffect = \"move\";\n }\n },\n [clearAllIndicators, getLastNodeRect],\n );\n\n const onContainerDrop = useCallback(\n (e: React.DragEvent) => {\n if (!dragNodeRef.current) {\n return;\n }\n\n const containerEl = e.currentTarget as HTMLElement;\n const targetEl = e.target as HTMLElement;\n const isOnNode = targetEl.closest(\"[data-node-key]\");\n\n if (isOnNode) {\n // 鼠标在节点上,由 onItemDrop 处理\n return;\n }\n\n // 检查是否在最后一个节点下方\n const lastRect = getLastNodeRect(containerEl);\n if (lastRect && e.clientY > lastRect.bottom) {\n e.preventDefault();\n e.stopPropagation();\n\n // 拖到最底部:视为 insert after 最后一个根节点\n const placeholderNode: DataNode = {\n key: \"__bottom_placeholder__\",\n title: \"\",\n isLeaf: true,\n };\n onDrop?.(dragNodeRef.current, placeholderNode, 1 as DropPosition);\n clearDragState();\n }\n },\n [onDrop, clearDragState, getLastNodeRect],\n );\n\n return {\n dragState,\n onDragStart,\n onDragEnd,\n onItemDragEnter,\n onItemDragOver,\n onItemDragLeave,\n onItemDrop,\n onContainerDragOver,\n onContainerDrop,\n clearDragState,\n isDragging,\n canDragNode,\n };\n}"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-group/chat-sdk",
3
- "version": "3.5.7",
3
+ "version": "3.5.9",
4
4
  "private": false,
5
5
  "description": "面向 AI 中台平台的前端集成 SDK,支持 OAuth2 安全认证、聊天机器人、智能编辑器、多模态对话,适配 SaaS / 私有化双场景。",
6
6
  "main": "dist/cjs/index.js",