@ai-group/chat-sdk 3.5.12 → 3.5.13

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,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAdkChatbot/styles.tsx"],
4
- "sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n wrapper: css`\n padding: 0 16px;\n min-height: 300px;\n width: 100%;\n height: 100%;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n `,\n\n list: css`\n flex: 1;\n margin-top: 16px;\n overflow-y: auto;\n /* Chrome, Safari, Edge, Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n /* Firefox */\n scrollbar-width: none;\n /* IE 10+ */\n -ms-overflow-style: none;\n `,\n\n prologue: css`\n margin-bottom: 12px;\n `,\n\n suggestion: css`\n margin-bottom: 12px;\n `,\n\n suggestContent: css`\n display: inline-flex;\n border: 2px solid #e7e7e7;\n border-radius: 8px;\n `,\n\n userMsg: css`\n display: flex;\n justify-content: flex-end;\n margin-bottom: 24px;\n `,\n\n userContainer: css`\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n `,\n\n card: css`\n display: inline-flex;\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 100%;\n white-space: pre-line;\n word-break: break-all;\n `,\n\n botMsg: css`\n margin-bottom: 12px;\n `,\n\n // 新增样式\n welcomeWrapper: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 40px 20px;\n text-align: center;\n `,\n\n welcomeIcon: css`\n width: 64px;\n height: 64px;\n border-radius: 12px;\n margin-bottom: 16px;\n `,\n\n welcomeTitle: css`\n font-size: 24px;\n font-weight: 600;\n color: rgba(0, 0, 0, 0.88);\n margin-bottom: 8px;\n `,\n\n welcomeDesc: css`\n font-size: 14px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 24px;\n `,\n\n suggestionWrapper: css`\n margin-top: 16px;\n `,\n\n successBadge: css`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n background: #f6ffed;\n border: 1px solid #b7eb8f;\n border-radius: 4px;\n color: #52c41a;\n font-size: 13px;\n margin-bottom: 12px;\n `,\n\n fileSection: css`\n margin: 12px 0;\n `,\n\n fileHeader: css`\n font-size: 13px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 8px;\n `,\n\n metaFooter: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #f0f0f0;\n `,\n\n actionIcons: css`\n color: rgba(0, 0, 0, 0.45);\n\n & > span {\n cursor: pointer;\n transition: color 0.2s;\n\n &:hover {\n color: #1890ff;\n }\n }\n `,\n\n fnCall: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 11px;\n border-radius: 24px;\n line-height: 16px;\n border: 1px solid #e7e7e7;\n cursor: pointer;\n `,\n\n confirm: css`\n padding: 12px;\n border-radius: 12px;\n border: 1px solid #e7e7e7;\n `,\n\n footer: css`\n /* senderWrap and tip moved to top-level keys so they are\n accessible as styles.senderWrap and styles.tip in the component */\n `,\n\n sender: css`\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 12px;\n border: 1px solid #e7e7e7;\n border-radius: 24px;\n\n /* .input moved to top-level key so component can use styles.input */\n `,\n\n senderWrap: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n `,\n\n tip: css`\n padding: 4px;\n font-size: 12px;\n text-align: center;\n color: rgba(0, 0, 0, 0.4);\n `,\n\n input: css`\n padding: 0;\n margin: 5px 0;\n line-height: 22px;\n font-size: 15px;\n border-radius: 0;\n border: none;\n\n &:focus {\n box-shadow: none;\n }\n `,\n}));\n\nexport default useStyles;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoB;AACpB,oBAAgC;AAEzB,IAAM,gBAAY,+BAAgB,OAAO;AAAA,EAC9C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BT,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcN,UAAU;AAAA;AAAA;AAAA,EAIV,YAAY;AAAA;AAAA;AAAA,EAIZ,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUN,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKR,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb,mBAAmB;AAAA;AAAA;AAAA,EAInB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAad,aAAa;AAAA;AAAA;AAAA,EAIb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUZ,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAab,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKR,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOZ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYT,EAAE;AAEF,IAAO,iBAAQ;",
4
+ "sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n wrapper: css`\n padding: 0 16px;\n min-height: 300px;\n height: 100%;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n `,\n\n list: css`\n flex: 1;\n margin-top: 16px;\n overflow-y: auto;\n /* Chrome, Safari, Edge, Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n /* Firefox */\n scrollbar-width: none;\n /* IE 10+ */\n -ms-overflow-style: none;\n `,\n\n prologue: css`\n margin-bottom: 12px;\n `,\n\n suggestion: css`\n margin-bottom: 12px;\n `,\n\n suggestContent: css`\n display: inline-flex;\n border: 2px solid #e7e7e7;\n border-radius: 8px;\n `,\n\n userMsg: css`\n display: flex;\n justify-content: flex-end;\n margin-bottom: 24px;\n `,\n\n userContainer: css`\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n `,\n\n card: css`\n display: inline-flex;\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 100%;\n white-space: pre-line;\n word-break: break-all;\n `,\n\n botMsg: css`\n margin-bottom: 12px;\n `,\n\n emptyWrapper: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 200px;\n `,\n\n // 新增样式\n welcomeWrapper: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 40px 20px;\n text-align: center;\n `,\n\n welcomeIcon: css`\n width: 64px;\n height: 64px;\n border-radius: 12px;\n margin-bottom: 16px;\n `,\n\n welcomeTitle: css`\n font-size: 24px;\n font-weight: 600;\n color: rgba(0, 0, 0, 0.88);\n margin-bottom: 8px;\n `,\n\n welcomeDesc: css`\n font-size: 14px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 24px;\n `,\n\n suggestionWrapper: css`\n margin-top: 16px;\n `,\n\n successBadge: css`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n background: #f6ffed;\n border: 1px solid #b7eb8f;\n border-radius: 4px;\n color: #52c41a;\n font-size: 13px;\n margin-bottom: 12px;\n `,\n\n fileSection: css`\n margin: 12px 0;\n `,\n\n fileHeader: css`\n font-size: 13px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 8px;\n `,\n\n metaFooter: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #f0f0f0;\n `,\n\n actionIcons: css`\n color: rgba(0, 0, 0, 0.45);\n\n & > span {\n cursor: pointer;\n transition: color 0.2s;\n\n &:hover {\n color: #1890ff;\n }\n }\n `,\n\n fnCall: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 11px;\n border-radius: 24px;\n line-height: 16px;\n border: 1px solid #e7e7e7;\n cursor: pointer;\n `,\n\n confirm: css`\n padding: 12px;\n border-radius: 12px;\n border: 1px solid #e7e7e7;\n `,\n\n footer: css`\n /* senderWrap and tip moved to top-level keys so they are\n accessible as styles.senderWrap and styles.tip in the component */\n `,\n\n sender: css`\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 12px;\n border: 1px solid #e7e7e7;\n border-radius: 24px;\n\n /* .input moved to top-level key so component can use styles.input */\n `,\n\n senderWrap: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n `,\n\n tip: css`\n padding: 4px;\n font-size: 12px;\n text-align: center;\n color: rgba(0, 0, 0, 0.4);\n `,\n\n input: css`\n padding: 0;\n margin: 5px 0;\n line-height: 22px;\n font-size: 15px;\n border-radius: 0;\n border: none;\n\n &:focus {\n box-shadow: none;\n }\n `,\n}));\n\nexport default useStyles;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoB;AACpB,oBAAgC;AAEzB,IAAM,gBAAY,+BAAgB,OAAO;AAAA,EAC9C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BT,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcN,UAAU;AAAA;AAAA;AAAA,EAIV,YAAY;AAAA;AAAA;AAAA,EAIZ,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUN,QAAQ;AAAA;AAAA;AAAA,EAIR,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASd,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb,mBAAmB;AAAA;AAAA;AAAA,EAInB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAad,aAAa;AAAA;AAAA;AAAA,EAIb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUZ,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAab,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKR,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOZ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYT,EAAE;AAEF,IAAO,iBAAQ;",
6
6
  "names": []
7
7
  }
@@ -273,7 +273,11 @@ export interface XAdkChatbotProps extends Partial<XAdkSenderProps> {
273
273
  welcome?: ReactNode;
274
274
  /** 显示函数调用详情 */
275
275
  showFnCallDetail?: boolean;
276
- /** 是否初始化完成,初始化完成后自动滚动到最新消息 */
276
+ /**
277
+ * 数据是否就绪,就绪后触发首次自动滚底。默认 true。
278
+ * 仅在需要等待异步加载历史消息的场景(如 XAdkProvider 内)才需设为 false,
279
+ * 待数据加载完成后再切换为 true;独立使用时无需关心此属性。
280
+ */
277
281
  initialized?: boolean;
278
282
  /**
279
283
  * 当前会话 ID,切换时自动重置滚动状态并置底。
@@ -345,4 +349,6 @@ export interface XAdkChatbotProps extends Partial<XAdkSenderProps> {
345
349
  stream?: boolean;
346
350
  /** 点击对话中附件卡片的回调(非图片、非音视频文件) */
347
351
  onFileClick?: (file: FileItem) => void;
352
+ /** 消息列表为空时展示的自定义空状态组件 */
353
+ empty?: ReactNode | (() => ReactNode);
348
354
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/XAdkChatbot.ts"],
4
- "sourcesContent": ["import type { CSSProperties, JSX, ReactNode } from \"react\";\nimport { type XAdkSenderProps } from \"./XAdkSender\";\nimport { type SendContent } from \"./XAiSender\";\nimport { type FileItem } from \"./FileGallery\";\nimport { type ToolRenderKind } from \"./FunctionCallRender\";\nimport { type ChatPresetInput, type ChatStrategies } from \"./ChatStrategies\";\n\n/**\n * XAdkChatbot 命令式 API\n */\nexport interface XAdkChatbotHandle {\n /** 手动滚动到底部 */\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n}\n\n/**\n * 消息分组接口\n */\nexport interface ChatGroup {\n id: string;\n role: \"user\" | \"bot\";\n msgs: IMessage[];\n invocationId?: string;\n allFiles: any[];\n /** 点赞状态: 1=赞, -1=踩, 0=未反馈 */\n isLike?: number;\n}\n\nexport interface IInvocation {\n id: string;\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId: string;\n startTime: number;\n endTime: number;\n sessionId: string;\n invocationId: string;\n duration: number;\n attributes: Record<string, string>;\n botName: string;\n workspaceNo: string;\n status: number;\n agentName: string;\n agentNo: string;\n agentVersionNo: string;\n userId: string;\n}\n\nexport interface AgentRunRequest {\n stream?: boolean;\n sessionId: string | undefined;\n content: {\n parts: Array<{\n text?: string;\n functionResponse?: {\n id?: string;\n name?: string;\n response?: any;\n };\n }>;\n role: string;\n };\n files?: Array<{\n fileName: string;\n fileId?: string;\n tempUrl: string;\n type?: string;\n mimeType: string;\n }>;\n stateDelta?: any;\n}\nexport interface Blob {\n displayName?: string;\n mimeType?: string;\n data: string;\n}\n\nexport interface FunctionCall {\n id?: string;\n name: string;\n args: { [key: string]: any };\n}\n\nexport interface FunctionResponse {\n id?: string;\n name: string;\n response: { [key: string]: any };\n}\n\nexport interface FileData {\n displayName: string;\n mimeType: string;\n fileUri: string;\n}\n\nexport interface ExecutableCode {\n language: \"UNKNOWN\" | \"PYTHON\";\n code: string;\n}\n\nexport interface CodeExecutionResult {\n outcome: \"UNKNOWN\" | \"OK\" | \"FAILED\" | \"DEADLINE_EXCEEDED\";\n output: string;\n}\n\nexport interface Part {\n text?: string;\n inlineData?: Blob;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n thought?: boolean;\n fileData?: FileData;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n errorMessage?: string;\n}\n\nexport interface GenAiContent {\n role: string;\n parts: Part[];\n}\n\nexport interface LlmRequest {\n contents: GenAiContent[];\n}\n\nexport interface LlmResponse {\n partial?: boolean;\n content: GenAiContent;\n error?: string;\n errorMessage?: string;\n errorCode?: string;\n longRunningToolIds?: string[];\n}\n\nexport interface UsageMetadata {\n candidatesTokenCount?: number;\n promptTokenCount?: number;\n totalTokenCount?: number;\n [key: string]: any;\n}\n\nexport interface EventActions {\n message?: string;\n artifactDelta?: any;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n finishReason?: string;\n}\n\nexport interface Event extends LlmResponse {\n id?: string;\n author?: string;\n modelCode?: string;\n invocationId?: string;\n actions?: EventActions;\n longRunningToolIds?: string[];\n branch?: string;\n timestamp?: number;\n finishReason?: string;\n usageMetadata?: UsageMetadata;\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n groundingMetadata?: {\n searchEntryPoint?: {\n renderedContent?: any;\n };\n };\n isLike?: number;\n sessionId?: string;\n}\n\nexport interface SessionState {\n [key: string]: unknown;\n}\n\nexport interface Session {\n id?: string;\n appName?: string;\n userId?: string;\n state?: SessionState;\n events?: Event[];\n lastUpdateTime?: number;\n}\n\nexport interface TimeTick {\n position: number;\n label: string;\n}\n\nexport interface IMessage {\n /** 前端生成的唯一标识 */\n id: string;\n /** 单次请求的唯一标识 */\n invocationId?: string;\n /** 单个Event的唯一标识,一个event里有可能有多个parts的消息 */\n eventId?: string;\n /** 消息发起人:智能体名称、user */\n author?: string;\n role: \"bot\" | \"user\";\n /** 时间戳 */\n timestamp?: number;\n isLoading?: boolean;\n /** 函数调用 */\n functionCall?: FunctionCall;\n /** 函数调用结果 */\n functionResponse?: FunctionResponse;\n /** 文件上传 */\n inlineData?: Blob;\n /** 文本消息 */\n text?: string;\n /** 文件信息 */\n fileData?: FileData[];\n /** 思考 */\n thought?: boolean;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n renderedContent?: any;\n /** 原始数据 */\n raw?: any;\n /** 模型编码,通常来自 stream 事件或历史消息 */\n modelCode?: string;\n /** 事件级 token 使用量等模型调用元数据 */\n usageMetadata?: UsageMetadata;\n /** 结束原因,通常来自最后一条 stream 事件 */\n finishReason?: string;\n // 下面暂时没有用到\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n invocationIndex?: any;\n finalResponsePartIndex?: any;\n toolUseIndex?: any;\n /** 是否赞/踩 */\n isLike?: number;\n}\n\nexport type ActionProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => JSX.Element | null;\n\nexport type ActionExtraProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => ReactNode;\n\n/**\n * 自定义工具调用渲染函数\n * - 返回 ReactNode:使用自定义渲染\n * - 返回 null:降级使用默认渲染\n *\n * @example\n * renderFunctionCall={(msg) => {\n * if (msg.functionCall?.name === 'my_tool') return <MyToolRender msg={msg} />;\n * return null; // 其他工具使用默认渲染\n * }}\n */\nexport type RenderFunctionCall = (msg: IMessage) => ReactNode | null;\n\nexport interface XAdkChatbotProps extends Partial<XAdkSenderProps> {\n /**\n * 自定义工具调用渲染函数\n * 返回 null 则降级使用默认渲染\n */\n renderFunctionCall?: RenderFunctionCall;\n /**\n * 工具名 → 渲染类型的解析策略,默认使用 defaultToolKindResolver\n */\n toolKindResolver?: (name: string | undefined) => ToolRenderKind;\n /**\n * 聊天策略,可由 Provider preset 自动下发,也可在组件局部覆盖。\n */\n strategies?: ChatStrategies;\n /**\n * 组件直用时的协议预设。默认沿用 xgroup-adk 以兼容既有业务接入;\n * 需要中立行为时可传入 base。\n */\n preset?: ChatPresetInput;\n className?: string;\n style?: CSSProperties;\n // 加载状态\n loading?: boolean;\n /** 消息列表 */\n messages: IMessage[];\n /** 开场白 */\n prologue?: string;\n /** 建议回复 */\n suggestions?: string[];\n /** 欢迎页面 */\n welcome?: ReactNode;\n /** 显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 是否初始化完成,初始化完成后自动滚动到最新消息 */\n initialized?: boolean;\n /**\n * 当前会话 ID,切换时自动重置滚动状态并置底。\n * 不传则退化为仅依赖 initialized 的单次置底行为。\n */\n sessionId?: string;\n /** 提交回调 */\n onSubmit?: ({ text, files }: SendContent) => void;\n /** 函数调用确认回调 */\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 停止回调 */\n onStop?: () => void;\n /** 清除回调 */\n onClear?: () => void;\n /** 建议回复回调 */\n onSuggest?: (text: string) => void;\n\n // ========== 新增功能 ==========\n\n /** Agent 名称 (欢迎页面) */\n agentName?: string;\n /** Agent 图标 (欢迎页面) */\n agentIcon?: string;\n /** Agent 描述 (欢迎页面) */\n description?: string;\n\n /** 是否显示重试按钮 */\n showRetry?: boolean;\n /** 是否显示复制按钮 */\n showCopy?: boolean;\n /** 是否显示日志按钮 */\n showLog?: boolean;\n\n /** 重试回调 */\n onRetry?: () => void;\n /** 复制回调 */\n onCopy?: (text: string) => void;\n /** 查看日志回调 */\n onShowLog?: (invocationId: string, timestamp?: number) => void;\n\n /** 是否启用消息分组 (默认 true) */\n enableGrouping?: boolean;\n\n /** 是否自动解析 process 内容并展示思维链 (默认 true) */\n enableProcessParsing?: boolean;\n\n /** 消息功能区 */\n actions?: ActionProps;\n /** 追加在消息功能区之后的内容,适合展示 token 消耗等业务扩展信息 */\n actionsExtra?: ActionExtraProps;\n\n /**\n * Process 解析选项\n * @example\n * // 业务项目格式 (注释模式)\n * parseOptions={{ mode: 'comment' }}\n *\n * @example\n * // 自定义格式\n * parseOptions={{\n * mode: 'custom',\n * customPatterns: [\n * { regex: /\\[REASONING\\]([\\s\\S]*?)\\[\\/REASONING\\]/g, type: 'reasoning' }\n * ]\n * }}\n */\n parseOptions?: {\n mode?: \"xml\" | \"comment\" | \"custom\";\n customPatterns?: Array<{ regex: RegExp; type: string }>;\n finalMarker?: string;\n };\n\n /** 是否禁用输入 */\n disabled?: boolean;\n\n /** 是否流式响应 */\n stream?: boolean;\n\n /** 点击对话中附件卡片的回调(非图片、非音视频文件) */\n onFileClick?: (file: FileItem) => void;\n}\n"],
4
+ "sourcesContent": ["import type { CSSProperties, JSX, ReactNode } from \"react\";\nimport { type XAdkSenderProps } from \"./XAdkSender\";\nimport { type SendContent } from \"./XAiSender\";\nimport { type FileItem } from \"./FileGallery\";\nimport { type ToolRenderKind } from \"./FunctionCallRender\";\nimport { type ChatPresetInput, type ChatStrategies } from \"./ChatStrategies\";\n\n/**\n * XAdkChatbot 命令式 API\n */\nexport interface XAdkChatbotHandle {\n /** 手动滚动到底部 */\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n}\n\n/**\n * 消息分组接口\n */\nexport interface ChatGroup {\n id: string;\n role: \"user\" | \"bot\";\n msgs: IMessage[];\n invocationId?: string;\n allFiles: any[];\n /** 点赞状态: 1=赞, -1=踩, 0=未反馈 */\n isLike?: number;\n}\n\nexport interface IInvocation {\n id: string;\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId: string;\n startTime: number;\n endTime: number;\n sessionId: string;\n invocationId: string;\n duration: number;\n attributes: Record<string, string>;\n botName: string;\n workspaceNo: string;\n status: number;\n agentName: string;\n agentNo: string;\n agentVersionNo: string;\n userId: string;\n}\n\nexport interface AgentRunRequest {\n stream?: boolean;\n sessionId: string | undefined;\n content: {\n parts: Array<{\n text?: string;\n functionResponse?: {\n id?: string;\n name?: string;\n response?: any;\n };\n }>;\n role: string;\n };\n files?: Array<{\n fileName: string;\n fileId?: string;\n tempUrl: string;\n type?: string;\n mimeType: string;\n }>;\n stateDelta?: any;\n}\nexport interface Blob {\n displayName?: string;\n mimeType?: string;\n data: string;\n}\n\nexport interface FunctionCall {\n id?: string;\n name: string;\n args: { [key: string]: any };\n}\n\nexport interface FunctionResponse {\n id?: string;\n name: string;\n response: { [key: string]: any };\n}\n\nexport interface FileData {\n displayName: string;\n mimeType: string;\n fileUri: string;\n}\n\nexport interface ExecutableCode {\n language: \"UNKNOWN\" | \"PYTHON\";\n code: string;\n}\n\nexport interface CodeExecutionResult {\n outcome: \"UNKNOWN\" | \"OK\" | \"FAILED\" | \"DEADLINE_EXCEEDED\";\n output: string;\n}\n\nexport interface Part {\n text?: string;\n inlineData?: Blob;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n thought?: boolean;\n fileData?: FileData;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n errorMessage?: string;\n}\n\nexport interface GenAiContent {\n role: string;\n parts: Part[];\n}\n\nexport interface LlmRequest {\n contents: GenAiContent[];\n}\n\nexport interface LlmResponse {\n partial?: boolean;\n content: GenAiContent;\n error?: string;\n errorMessage?: string;\n errorCode?: string;\n longRunningToolIds?: string[];\n}\n\nexport interface UsageMetadata {\n candidatesTokenCount?: number;\n promptTokenCount?: number;\n totalTokenCount?: number;\n [key: string]: any;\n}\n\nexport interface EventActions {\n message?: string;\n artifactDelta?: any;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n finishReason?: string;\n}\n\nexport interface Event extends LlmResponse {\n id?: string;\n author?: string;\n modelCode?: string;\n invocationId?: string;\n actions?: EventActions;\n longRunningToolIds?: string[];\n branch?: string;\n timestamp?: number;\n finishReason?: string;\n usageMetadata?: UsageMetadata;\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n groundingMetadata?: {\n searchEntryPoint?: {\n renderedContent?: any;\n };\n };\n isLike?: number;\n sessionId?: string;\n}\n\nexport interface SessionState {\n [key: string]: unknown;\n}\n\nexport interface Session {\n id?: string;\n appName?: string;\n userId?: string;\n state?: SessionState;\n events?: Event[];\n lastUpdateTime?: number;\n}\n\nexport interface TimeTick {\n position: number;\n label: string;\n}\n\nexport interface IMessage {\n /** 前端生成的唯一标识 */\n id: string;\n /** 单次请求的唯一标识 */\n invocationId?: string;\n /** 单个Event的唯一标识,一个event里有可能有多个parts的消息 */\n eventId?: string;\n /** 消息发起人:智能体名称、user */\n author?: string;\n role: \"bot\" | \"user\";\n /** 时间戳 */\n timestamp?: number;\n isLoading?: boolean;\n /** 函数调用 */\n functionCall?: FunctionCall;\n /** 函数调用结果 */\n functionResponse?: FunctionResponse;\n /** 文件上传 */\n inlineData?: Blob;\n /** 文本消息 */\n text?: string;\n /** 文件信息 */\n fileData?: FileData[];\n /** 思考 */\n thought?: boolean;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n renderedContent?: any;\n /** 原始数据 */\n raw?: any;\n /** 模型编码,通常来自 stream 事件或历史消息 */\n modelCode?: string;\n /** 事件级 token 使用量等模型调用元数据 */\n usageMetadata?: UsageMetadata;\n /** 结束原因,通常来自最后一条 stream 事件 */\n finishReason?: string;\n // 下面暂时没有用到\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n invocationIndex?: any;\n finalResponsePartIndex?: any;\n toolUseIndex?: any;\n /** 是否赞/踩 */\n isLike?: number;\n}\n\nexport type ActionProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => JSX.Element | null;\n\nexport type ActionExtraProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => ReactNode;\n\n/**\n * 自定义工具调用渲染函数\n * - 返回 ReactNode:使用自定义渲染\n * - 返回 null:降级使用默认渲染\n *\n * @example\n * renderFunctionCall={(msg) => {\n * if (msg.functionCall?.name === 'my_tool') return <MyToolRender msg={msg} />;\n * return null; // 其他工具使用默认渲染\n * }}\n */\nexport type RenderFunctionCall = (msg: IMessage) => ReactNode | null;\n\nexport interface XAdkChatbotProps extends Partial<XAdkSenderProps> {\n /**\n * 自定义工具调用渲染函数\n * 返回 null 则降级使用默认渲染\n */\n renderFunctionCall?: RenderFunctionCall;\n /**\n * 工具名 → 渲染类型的解析策略,默认使用 defaultToolKindResolver\n */\n toolKindResolver?: (name: string | undefined) => ToolRenderKind;\n /**\n * 聊天策略,可由 Provider preset 自动下发,也可在组件局部覆盖。\n */\n strategies?: ChatStrategies;\n /**\n * 组件直用时的协议预设。默认沿用 xgroup-adk 以兼容既有业务接入;\n * 需要中立行为时可传入 base。\n */\n preset?: ChatPresetInput;\n className?: string;\n style?: CSSProperties;\n // 加载状态\n loading?: boolean;\n /** 消息列表 */\n messages: IMessage[];\n /** 开场白 */\n prologue?: string;\n /** 建议回复 */\n suggestions?: string[];\n /** 欢迎页面 */\n welcome?: ReactNode;\n /** 显示函数调用详情 */\n showFnCallDetail?: boolean;\n /**\n * 数据是否就绪,就绪后触发首次自动滚底。默认 true。\n * 仅在需要等待异步加载历史消息的场景(如 XAdkProvider 内)才需设为 false,\n * 待数据加载完成后再切换为 true;独立使用时无需关心此属性。\n */\n initialized?: boolean;\n /**\n * 当前会话 ID,切换时自动重置滚动状态并置底。\n * 不传则退化为仅依赖 initialized 的单次置底行为。\n */\n sessionId?: string;\n /** 提交回调 */\n onSubmit?: ({ text, files }: SendContent) => void;\n /** 函数调用确认回调 */\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 停止回调 */\n onStop?: () => void;\n /** 清除回调 */\n onClear?: () => void;\n /** 建议回复回调 */\n onSuggest?: (text: string) => void;\n\n // ========== 新增功能 ==========\n\n /** Agent 名称 (欢迎页面) */\n agentName?: string;\n /** Agent 图标 (欢迎页面) */\n agentIcon?: string;\n /** Agent 描述 (欢迎页面) */\n description?: string;\n\n /** 是否显示重试按钮 */\n showRetry?: boolean;\n /** 是否显示复制按钮 */\n showCopy?: boolean;\n /** 是否显示日志按钮 */\n showLog?: boolean;\n\n /** 重试回调 */\n onRetry?: () => void;\n /** 复制回调 */\n onCopy?: (text: string) => void;\n /** 查看日志回调 */\n onShowLog?: (invocationId: string, timestamp?: number) => void;\n\n /** 是否启用消息分组 (默认 true) */\n enableGrouping?: boolean;\n\n /** 是否自动解析 process 内容并展示思维链 (默认 true) */\n enableProcessParsing?: boolean;\n\n /** 消息功能区 */\n actions?: ActionProps;\n /** 追加在消息功能区之后的内容,适合展示 token 消耗等业务扩展信息 */\n actionsExtra?: ActionExtraProps;\n\n /**\n * Process 解析选项\n * @example\n * // 业务项目格式 (注释模式)\n * parseOptions={{ mode: 'comment' }}\n *\n * @example\n * // 自定义格式\n * parseOptions={{\n * mode: 'custom',\n * customPatterns: [\n * { regex: /\\[REASONING\\]([\\s\\S]*?)\\[\\/REASONING\\]/g, type: 'reasoning' }\n * ]\n * }}\n */\n parseOptions?: {\n mode?: \"xml\" | \"comment\" | \"custom\";\n customPatterns?: Array<{ regex: RegExp; type: string }>;\n finalMarker?: string;\n };\n\n /** 是否禁用输入 */\n disabled?: boolean;\n\n /** 是否流式响应 */\n stream?: boolean;\n\n /** 点击对话中附件卡片的回调(非图片、非音视频文件) */\n onFileClick?: (file: FileItem) => void;\n\n /** 消息列表为空时展示的自定义空状态组件 */\n empty?: ReactNode | (() => ReactNode);\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -22,7 +22,7 @@ export interface DirectoryTreeComponentProps {
22
22
  /** 编辑值变化回调 */
23
23
  onEditValueChange?: (value: string) => void;
24
24
  /** 编辑确认回调 */
25
- onEditConfirm?: () => void;
25
+ onEditConfirm?: (value?: string) => void;
26
26
  /** 编辑取消回调 */
27
27
  onEditCancel?: () => void;
28
28
  /** 新建上下文 */
@@ -1,5 +1,6 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
- import React, { useCallback, useMemo } from "react";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
4
  import { Tree, Dropdown, Input } from "antd";
4
5
  import { FileOutlined, FolderOutlined, MoreOutlined } from "@ant-design/icons";
5
6
  import clsx from "clsx";
@@ -8,30 +9,83 @@ import { useFolderDrag } from "./useFolderDrag";
8
9
  import { jsx as _jsx } from "react/jsx-runtime";
9
10
  import { jsxs as _jsxs } from "react/jsx-runtime";
10
11
  var AntDirectoryTree = Tree.DirectoryTree;
11
- var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
12
- var treeData = _ref.treeData,
13
- selectedKeys = _ref.selectedKeys,
14
- expandedKeys = _ref.expandedKeys,
15
- onSelect = _ref.onSelect,
16
- onExpand = _ref.onExpand,
17
- _ref$showLine = _ref.showLine,
18
- showLine = _ref$showLine === void 0 ? false : _ref$showLine,
19
- switcherIcon = _ref.switcherIcon,
20
- _ref$defaultExpandAll = _ref.defaultExpandAll,
21
- defaultExpandAll = _ref$defaultExpandAll === void 0 ? true : _ref$defaultExpandAll,
12
+ var InlineEditInput = function InlineEditInput(_ref) {
13
+ var editKey = _ref.editKey,
14
+ value = _ref.value,
22
15
  className = _ref.className,
23
- directoryIcons = _ref.directoryIcons,
24
- directoryTitle = _ref.directoryTitle,
25
- moreActions = _ref.moreActions,
26
- width = _ref.width,
27
- draggable = _ref.draggable,
28
- onDrop = _ref.onDrop,
29
- editNode = _ref.editNode,
30
- onEditValueChange = _ref.onEditValueChange,
31
- onEditConfirm = _ref.onEditConfirm,
32
- onEditCancel = _ref.onEditCancel,
33
- createInfo = _ref.createInfo,
34
- onStartRename = _ref.onStartRename;
16
+ onValueChange = _ref.onValueChange,
17
+ onConfirm = _ref.onConfirm,
18
+ onCancel = _ref.onCancel;
19
+ var _useState = useState(value),
20
+ _useState2 = _slicedToArray(_useState, 2),
21
+ draft = _useState2[0],
22
+ setDraft = _useState2[1];
23
+ var committedRef = useRef(false);
24
+ useEffect(function () {
25
+ setDraft(value);
26
+ committedRef.current = false;
27
+ }, [editKey, value]);
28
+ var commit = useCallback(function () {
29
+ if (committedRef.current) return;
30
+ committedRef.current = true;
31
+ onValueChange === null || onValueChange === void 0 || onValueChange(draft);
32
+ onConfirm === null || onConfirm === void 0 || onConfirm(draft);
33
+ }, [draft, onConfirm, onValueChange]);
34
+ return /*#__PURE__*/_jsx(Input, {
35
+ size: "small",
36
+ value: draft,
37
+ onChange: function onChange(e) {
38
+ return setDraft(e.target.value);
39
+ },
40
+ onBlur: commit,
41
+ onPressEnter: commit,
42
+ onKeyDown: function onKeyDown(e) {
43
+ e.stopPropagation();
44
+ if (e.key === "Escape") {
45
+ committedRef.current = true;
46
+ onCancel === null || onCancel === void 0 || onCancel();
47
+ }
48
+ },
49
+ autoFocus: true,
50
+ className: className,
51
+ onClick: function onClick(e) {
52
+ return e.stopPropagation();
53
+ },
54
+ onMouseDown: function onMouseDown(e) {
55
+ return e.stopPropagation();
56
+ },
57
+ onSelect: function onSelect(e) {
58
+ return e.stopPropagation();
59
+ },
60
+ onFocus: function onFocus(e) {
61
+ return e.stopPropagation();
62
+ }
63
+ });
64
+ };
65
+ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref2) {
66
+ var treeData = _ref2.treeData,
67
+ selectedKeys = _ref2.selectedKeys,
68
+ expandedKeys = _ref2.expandedKeys,
69
+ onSelect = _ref2.onSelect,
70
+ onExpand = _ref2.onExpand,
71
+ _ref2$showLine = _ref2.showLine,
72
+ showLine = _ref2$showLine === void 0 ? false : _ref2$showLine,
73
+ switcherIcon = _ref2.switcherIcon,
74
+ _ref2$defaultExpandAl = _ref2.defaultExpandAll,
75
+ defaultExpandAll = _ref2$defaultExpandAl === void 0 ? true : _ref2$defaultExpandAl,
76
+ className = _ref2.className,
77
+ directoryIcons = _ref2.directoryIcons,
78
+ directoryTitle = _ref2.directoryTitle,
79
+ moreActions = _ref2.moreActions,
80
+ width = _ref2.width,
81
+ draggable = _ref2.draggable,
82
+ onDrop = _ref2.onDrop,
83
+ editNode = _ref2.editNode,
84
+ onEditValueChange = _ref2.onEditValueChange,
85
+ onEditConfirm = _ref2.onEditConfirm,
86
+ onEditCancel = _ref2.onEditCancel,
87
+ createInfo = _ref2.createInfo,
88
+ onStartRename = _ref2.onStartRename;
35
89
  var styles = useStyles();
36
90
  var getIcon = useCallback(function (node) {
37
91
  if (directoryIcons === false || directoryIcons === null) {
@@ -59,38 +113,16 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
59
113
  return s !== "";
60
114
  });
61
115
  }, []);
62
- var renderInlineInput = useCallback(function (value) {
116
+ var renderInlineInput = useCallback(function (key, value) {
63
117
  return /*#__PURE__*/_jsx("span", {
64
118
  className: styles.treeNodeTitle,
65
- children: /*#__PURE__*/_jsx(Input, {
66
- size: "small",
119
+ children: /*#__PURE__*/_jsx(InlineEditInput, {
120
+ editKey: key,
67
121
  value: value,
68
- onChange: function onChange(e) {
69
- return onEditValueChange === null || onEditValueChange === void 0 ? void 0 : onEditValueChange(e.target.value);
70
- },
71
- onBlur: function onBlur() {
72
- return onEditConfirm === null || onEditConfirm === void 0 ? void 0 : onEditConfirm();
73
- },
74
- onPressEnter: function onPressEnter() {
75
- return onEditConfirm === null || onEditConfirm === void 0 ? void 0 : onEditConfirm();
76
- },
77
- onKeyDown: function onKeyDown(e) {
78
- if (e.key === "Escape") {
79
- e.stopPropagation();
80
- onEditCancel === null || onEditCancel === void 0 || onEditCancel();
81
- }
82
- },
83
- autoFocus: true,
84
122
  className: styles.inlineInput,
85
- onClick: function onClick(e) {
86
- return e.stopPropagation();
87
- },
88
- onSelect: function onSelect(e) {
89
- return e.stopPropagation();
90
- },
91
- onFocus: function onFocus(e) {
92
- return e.stopPropagation();
93
- }
123
+ onValueChange: onEditValueChange,
124
+ onConfirm: onEditConfirm,
125
+ onCancel: onEditCancel
94
126
  })
95
127
  });
96
128
  }, [onEditValueChange, onEditConfirm, onEditCancel, styles]);
@@ -191,7 +223,7 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
191
223
 
192
224
  // 编辑态:直接渲染 inline input
193
225
  if (isEditing) {
194
- baseNode.title = renderInlineInput(editNode.currentValue);
226
+ baseNode.title = renderInlineInput(editNode.key, editNode.currentValue);
195
227
  return baseNode;
196
228
  }
197
229
 
@@ -255,7 +287,7 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
255
287
  if (targetParentKey === parentKey || targetParentKey === "" && parentKey === "" || targetParentKey === "/" && parentKey === "") {
256
288
  var tempNode = {
257
289
  key: editNode.key,
258
- title: renderInlineInput(editNode.currentValue),
290
+ title: renderInlineInput(editNode.key, editNode.currentValue),
259
291
  icon: createInfo.type === "folder" ? /*#__PURE__*/_jsx(FolderOutlined, {}) : /*#__PURE__*/_jsx(FileOutlined, {}),
260
292
  isLeaf: createInfo.type === "file",
261
293
  path: editNode.key,
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useMemo","Tree","Dropdown","Input","FileOutlined","FolderOutlined","MoreOutlined","clsx","useStyles","useFolderDrag","jsx","_jsx","jsxs","_jsxs","AntDirectoryTree","DirectoryTree","DirectoryTreeComponent","_ref","treeData","selectedKeys","expandedKeys","onSelect","onExpand","_ref$showLine","showLine","switcherIcon","_ref$defaultExpandAll","defaultExpandAll","className","directoryIcons","directoryTitle","moreActions","width","draggable","onDrop","editNode","onEditValueChange","onEditConfirm","onEditCancel","createInfo","onStartRename","styles","getIcon","node","type","icon","directory","filePath","path","toLowerCase","extension","split","pop","buildPathSegments","parentSegments","arguments","length","undefined","concat","_toConsumableArray","filter","s","renderInlineInput","value","treeNodeTitle","children","size","onChange","e","target","onBlur","onPressEnter","onKeyDown","key","stopPropagation","autoFocus","inlineInput","onClick","onFocus","dragMode","handleDragDrop","dragNode","dropNode","dropPosition","dragNd","dropNd","originalDragNode","_originalNode","originalDropNode","dragKey","String","dropKey","dragFileName","newPath","fileName","title","extra","oldPath","isLeaf","dropParentPath","includes","substring","lastIndexOf","handleDragEnterExpand","nodeKey","isExpanded","expanded","nativeEvent","_useFolderDrag","onDragEnterExpand","onDragStart","onDragEnd","onItemDragEnter","onItemDragOver","onItemDragLeave","onItemDrop","onContainerDragOver","onContainerDrop","canDragNode","convertToTreeData","nodes","parentKey","result","map","pathSegments","fullPath","join","replace","isEditing","nodeChildren","baseNode","currentValue","titleContent","treeNodeTitleHover","menu","startRename","trigger","placement","moreIcon","nodeData","draggableDiv","treeNodeWrapper","dragNodeHandle","onDragEnter","onDragOver","onDragLeave","mode","targetParentKey","tempNode","_isTempNode","push","treeDataConverted","handleSelect","keys","info","_info$nativeEvent","closest","titleNode","directoryPanel","style","directoryTreeContent","multiple","blockNode"],"sources":["../../../../src/components/FolderTree/DirectoryTree.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport { Tree, Dropdown, Input } from \"antd\";\nimport { FileOutlined, FolderOutlined, MoreOutlined } from \"@ant-design/icons\";\nimport type { TreeProps } from \"antd\";\nimport type { DataNode } from \"antd/es/tree\";\nimport clsx from \"clsx\";\nimport type {\n FolderTreeData,\n FolderTreeProps,\n EditNodeInfo,\n CreateNodeContext,\n} from \"./types\";\nimport { useStyles } from \"./styles\";\nimport { useFolderDrag, type DropPosition } from \"./useFolderDrag\";\n\nconst { DirectoryTree: AntDirectoryTree } = Tree;\n\nexport interface DirectoryTreeComponentProps {\n treeData: FolderTreeData[];\n directoryIcons?: FolderTreeProps[\"directoryIcons\"];\n selectedKeys?: string[];\n expandedKeys?: string[];\n onSelect?: TreeProps[\"onSelect\"];\n onExpand?: TreeProps[\"onExpand\"];\n showLine?: FolderTreeProps[\"showLine\"];\n switcherIcon?: FolderTreeProps[\"switcherIcon\"];\n defaultExpandAll?: boolean;\n className?: string;\n directoryTitle?: FolderTreeProps[\"directoryTitle\"];\n moreActions?: FolderTreeProps[\"moreActions\"];\n width?: number | string;\n draggable?: FolderTreeProps[\"draggable\"];\n onDrop?: FolderTreeProps[\"onDrop\"];\n /** 当前编辑节点信息 */\n editNode?: EditNodeInfo | null;\n /** 编辑值变化回调 */\n onEditValueChange?: (value: string) => void;\n /** 编辑确认回调 */\n onEditConfirm?: () => void;\n /** 编辑取消回调 */\n onEditCancel?: () => void;\n /** 新建上下文 */\n createInfo?: CreateNodeContext | null;\n /** 开始重命名回调(由父组件注入) */\n onStartRename?: (fullPath: string, node: FolderTreeData) => void;\n}\n\nconst DirectoryTreeComponent: React.FC<DirectoryTreeComponentProps> = ({\n treeData,\n selectedKeys,\n expandedKeys,\n onSelect,\n onExpand,\n showLine = false,\n switcherIcon,\n defaultExpandAll = true,\n className,\n directoryIcons,\n directoryTitle,\n moreActions,\n width,\n draggable,\n onDrop,\n editNode,\n onEditValueChange,\n onEditConfirm,\n onEditCancel,\n createInfo,\n onStartRename,\n}) => {\n const styles = useStyles();\n\n const getIcon = useCallback(\n (node: FolderTreeData) => {\n if (directoryIcons === false || directoryIcons === null) {\n return null;\n }\n if (node.type == \"folder\") {\n const icon = directoryIcons?.directory;\n if (typeof icon === \"function\") return icon();\n return icon || <FolderOutlined />;\n }\n const filePath = node.path.toLowerCase();\n const extension = filePath.split(\".\").pop();\n if (extension) {\n const icon = directoryIcons?.[extension];\n if (icon) return typeof icon === \"function\" ? icon() : icon;\n }\n return <FileOutlined />;\n },\n [directoryIcons],\n );\n\n const buildPathSegments = useCallback(\n (node: FolderTreeData, parentSegments: string[] = []): string[] => {\n if (node.path === \"/\" && parentSegments.length === 0) {\n return [\"/\"];\n }\n return [...parentSegments, node.path].filter((s) => s !== \"\");\n },\n [],\n );\n\n const renderInlineInput = useCallback(\n (value: string) => (\n <span className={styles.treeNodeTitle}>\n <Input\n size=\"small\"\n value={value}\n onChange={(e) => onEditValueChange?.(e.target.value)}\n onBlur={() => onEditConfirm?.()}\n onPressEnter={() => onEditConfirm?.()}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onEditCancel?.();\n }\n }}\n autoFocus\n className={styles.inlineInput}\n onClick={(e) => e.stopPropagation()}\n onSelect={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n />\n </span>\n ),\n [onEditValueChange, onEditConfirm, onEditCancel, styles],\n );\n\n // ====== 拖拽模式 ======\n const dragMode = draggable === true ? \"file\" : draggable || false;\n\n // ====== 自定义拖拽 hook ======\n const handleDragDrop = useCallback(\n (dragNode: DataNode, dropNode: DataNode, dropPosition: DropPosition) => {\n const dragNd = dragNode as DataNode & { _originalNode?: FolderTreeData };\n const dropNd = dropNode as DataNode & { _originalNode?: FolderTreeData };\n const originalDragNode = dragNd._originalNode;\n const originalDropNode = dropNd._originalNode;\n if (!originalDragNode) return;\n\n const dragKey = String(dragNode.key);\n const dropKey = String(dropNode.key);\n const dragFileName = originalDragNode.path;\n let newPath: string;\n\n // 拖到底部 drop zone:放在根级别末尾\n if (!originalDropNode && dropKey === \"__bottom_placeholder__\") {\n newPath = dragFileName;\n onDrop?.({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: { title: \"\", path: \"\" },\n });\n return;\n }\n\n if (!originalDropNode) return;\n\n if (!dropNode.isLeaf && dropPosition === 0) {\n // 拖入文件夹内部\n newPath = `${dropKey}/${dragFileName}`;\n } else {\n // 拖到节点旁边(同级)\n const dropParentPath = dropKey.includes(\"/\")\n ? dropKey.substring(0, dropKey.lastIndexOf(\"/\"))\n : \"\";\n newPath = dropParentPath\n ? `${dropParentPath}/${dragFileName}`\n : dragFileName;\n }\n\n onDrop?.({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: originalDropNode,\n });\n },\n [onDrop],\n );\n\n const handleDragEnterExpand = useCallback(\n (nodeKey: string) => {\n const isExpanded = expandedKeys?.includes(nodeKey);\n if (!isExpanded) {\n onExpand?.([...(expandedKeys || []), nodeKey], {\n node: null as any,\n expanded: true,\n nativeEvent: null as any,\n });\n }\n },\n [expandedKeys, onExpand],\n );\n\n const {\n onDragStart,\n onDragEnd,\n onItemDragEnter,\n onItemDragOver,\n onItemDragLeave,\n onItemDrop,\n onContainerDragOver,\n onContainerDrop,\n canDragNode,\n } = useFolderDrag({\n dragMode,\n onDrop: handleDragDrop,\n onDragEnterExpand: handleDragEnterExpand,\n });\n\n // ====== 转换树数据 ======\n // 注意:convertToTreeData 不依赖拖拽状态,拖拽效果通过 DOM 操作实现\n const convertToTreeData = useCallback(\n (\n nodes: FolderTreeData[],\n parentSegments: string[] = [],\n parentKey: string = \"\",\n ): DataNode[] => {\n const result = nodes.map((node) => {\n const pathSegments = buildPathSegments(node, parentSegments);\n const fullPath = pathSegments.join(\"/\").replace(/^\\/+/, \"\");\n\n const isEditing = editNode && editNode.key === fullPath;\n\n const nodeChildren = node.children\n ? convertToTreeData(node.children, pathSegments, fullPath)\n : undefined;\n\n const baseNode: any = {\n key: fullPath,\n path: fullPath,\n pathSegments,\n icon: getIcon(node),\n isLeaf: !(node.type === \"folder\"),\n _originalNode: node,\n children: nodeChildren,\n };\n\n // 编辑态:直接渲染 inline input\n if (isEditing) {\n baseNode.title = renderInlineInput(editNode!.currentValue);\n return baseNode;\n }\n\n // title 内容(按钮、菜单等)\n const titleContent = (\n <span\n className={clsx(\n styles.treeNodeTitle,\n moreActions && styles.treeNodeTitleHover,\n )}\n >\n <span>{node.title}</span>\n {moreActions && (\n <Dropdown\n menu={moreActions(node, {\n startRename: () => onStartRename?.(fullPath, node),\n })}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n >\n <span\n className={clsx(styles.moreIcon, \"folder-tree-more-icon\")}\n onClick={(e) => e.stopPropagation()}\n >\n <MoreOutlined />\n </span>\n </Dropdown>\n )}\n </span>\n );\n\n // 启用拖拽时:在 title 外层包裹具有 data-node-key 属性的容器,\n // 用于 DOM 查询和事件绑定。拖拽状态通过 CSS class 控制。\n if (dragMode) {\n const nodeData = baseNode as DataNode & {\n _isTempNode?: boolean;\n };\n const draggableDiv = canDragNode(nodeData);\n\n baseNode.title = (\n <div\n className={clsx(\n styles.treeNodeWrapper,\n draggableDiv && styles.dragNodeHandle,\n )}\n data-node-key={fullPath}\n draggable={draggableDiv}\n onDragStart={\n draggableDiv ? (e) => onDragStart(e, baseNode) : undefined\n }\n onDragEnd={draggableDiv ? onDragEnd : undefined}\n onDragEnter={(e) => onItemDragEnter(e, baseNode)}\n onDragOver={(e) => onItemDragOver(e, baseNode)}\n onDragLeave={onItemDragLeave}\n onDrop={(e) => onItemDrop(e, baseNode)}\n >\n {titleContent}\n </div>\n );\n } else {\n baseNode.title = titleContent;\n }\n\n return baseNode;\n });\n\n // 新建模式:在目标父节点下插入临时节点\n if (createInfo && editNode && editNode.mode === \"create\") {\n const targetParentKey = createInfo.parentKey;\n if (\n targetParentKey === parentKey ||\n (targetParentKey === \"\" && parentKey === \"\") ||\n (targetParentKey === \"/\" && parentKey === \"\")\n ) {\n const tempNode: any = {\n key: editNode.key,\n title: renderInlineInput(editNode.currentValue),\n icon:\n createInfo.type === \"folder\" ? (\n <FolderOutlined />\n ) : (\n <FileOutlined />\n ),\n isLeaf: createInfo.type === \"file\",\n path: editNode.key,\n pathSegments: [editNode.key],\n _originalNode: null,\n _isTempNode: true,\n };\n result.push(tempNode);\n }\n }\n\n return result;\n },\n [\n buildPathSegments,\n getIcon,\n moreActions,\n styles,\n editNode,\n renderInlineInput,\n createInfo,\n onStartRename,\n dragMode,\n canDragNode,\n onDragStart,\n onDragEnd,\n onItemDragEnter,\n onItemDragOver,\n onItemDragLeave,\n onItemDrop,\n ],\n );\n\n const treeDataConverted = useMemo(\n () => convertToTreeData(treeData, [], \"\"),\n [treeData, convertToTreeData],\n );\n\n const handleSelect: TreeProps[\"onSelect\"] = useCallback(\n (keys: any, info: any) => {\n // 编辑态不响应选中\n if (editNode) return;\n // 临时节点不可选中\n const node = info.node as DataNode & { _isTempNode?: boolean };\n if (node._isTempNode) return;\n // 点击 moreActions 区域不触发选中\n const target = info.nativeEvent?.target as HTMLElement | null;\n if (\n target &&\n (target.closest(\".folder-tree-more-icon\") ||\n target.closest(\".ant-dropdown\"))\n ) {\n return;\n }\n onSelect?.(keys, info);\n },\n [onSelect, editNode],\n );\n\n const titleNode =\n directoryTitle === false || directoryTitle === null\n ? null\n : typeof directoryTitle === \"function\"\n ? directoryTitle()\n : directoryTitle;\n\n return (\n <div className={clsx(styles.directoryPanel, className)} style={{ width }}>\n {titleNode && <div className={styles.directoryTitle}>{titleNode}</div>}\n <div\n className={styles.directoryTreeContent}\n onDragOver={dragMode ? onContainerDragOver : undefined}\n onDrop={dragMode ? onContainerDrop : undefined}\n >\n <AntDirectoryTree\n style={\n {\n \"--ant-tree-directory-node-selected-bg\": \"rgba(0,0,0,0.03)\",\n \"--ant-tree-directory-node-selected-color\": \"#1a1c1e\",\n } as React.CSSProperties\n }\n treeData={treeDataConverted}\n selectedKeys={selectedKeys}\n expandedKeys={expandedKeys}\n onSelect={handleSelect}\n onExpand={onExpand}\n multiple={false}\n blockNode\n showLine={showLine as any}\n switcherIcon={switcherIcon}\n defaultExpandAll={defaultExpandAll}\n draggable={false}\n />\n </div>\n </div>\n );\n};\n\nexport default DirectoryTreeComponent;\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACnD,SAASC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,QAAQ,MAAM;AAC5C,SAASC,YAAY,EAAEC,cAAc,EAAEC,YAAY,QAAQ,mBAAmB;AAG9E,OAAOC,IAAI,MAAM,MAAM;AAOvB,SAASC,SAAS;AAClB,SAASC,aAAa;AAA6C,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAEnE,IAAuBC,gBAAgB,GAAKb,IAAI,CAAxCc,aAAa;AAgCrB,IAAMC,sBAA6D,GAAG,SAAhEA,sBAA6DA,CAAAC,IAAA,EAsB7D;EAAA,IArBJC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IACRC,YAAY,GAAAF,IAAA,CAAZE,YAAY;IACZC,YAAY,GAAAH,IAAA,CAAZG,YAAY;IACZC,QAAQ,GAAAJ,IAAA,CAARI,QAAQ;IACRC,QAAQ,GAAAL,IAAA,CAARK,QAAQ;IAAAC,aAAA,GAAAN,IAAA,CACRO,QAAQ;IAARA,QAAQ,GAAAD,aAAA,cAAG,KAAK,GAAAA,aAAA;IAChBE,YAAY,GAAAR,IAAA,CAAZQ,YAAY;IAAAC,qBAAA,GAAAT,IAAA,CACZU,gBAAgB;IAAhBA,gBAAgB,GAAAD,qBAAA,cAAG,IAAI,GAAAA,qBAAA;IACvBE,SAAS,GAAAX,IAAA,CAATW,SAAS;IACTC,cAAc,GAAAZ,IAAA,CAAdY,cAAc;IACdC,cAAc,GAAAb,IAAA,CAAda,cAAc;IACdC,WAAW,GAAAd,IAAA,CAAXc,WAAW;IACXC,KAAK,GAAAf,IAAA,CAALe,KAAK;IACLC,SAAS,GAAAhB,IAAA,CAATgB,SAAS;IACTC,MAAM,GAAAjB,IAAA,CAANiB,MAAM;IACNC,QAAQ,GAAAlB,IAAA,CAARkB,QAAQ;IACRC,iBAAiB,GAAAnB,IAAA,CAAjBmB,iBAAiB;IACjBC,aAAa,GAAApB,IAAA,CAAboB,aAAa;IACbC,YAAY,GAAArB,IAAA,CAAZqB,YAAY;IACZC,UAAU,GAAAtB,IAAA,CAAVsB,UAAU;IACVC,aAAa,GAAAvB,IAAA,CAAbuB,aAAa;EAEb,IAAMC,MAAM,GAAGjC,SAAS,CAAC,CAAC;EAE1B,IAAMkC,OAAO,GAAG3C,WAAW,CACzB,UAAC4C,IAAoB,EAAK;IACxB,IAAId,cAAc,KAAK,KAAK,IAAIA,cAAc,KAAK,IAAI,EAAE;MACvD,OAAO,IAAI;IACb;IACA,IAAIc,IAAI,CAACC,IAAI,IAAI,QAAQ,EAAE;MACzB,IAAMC,IAAI,GAAGhB,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAEiB,SAAS;MACtC,IAAI,OAAOD,IAAI,KAAK,UAAU,EAAE,OAAOA,IAAI,CAAC,CAAC;MAC7C,OAAOA,IAAI,iBAAIlC,IAAA,CAACN,cAAc,IAAE,CAAC;IACnC;IACA,IAAM0C,QAAQ,GAAGJ,IAAI,CAACK,IAAI,CAACC,WAAW,CAAC,CAAC;IACxC,IAAMC,SAAS,GAAGH,QAAQ,CAACI,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;IAC3C,IAAIF,SAAS,EAAE;MACb,IAAML,KAAI,GAAGhB,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAGqB,SAAS,CAAC;MACxC,IAAIL,KAAI,EAAE,OAAO,OAAOA,KAAI,KAAK,UAAU,GAAGA,KAAI,CAAC,CAAC,GAAGA,KAAI;IAC7D;IACA,oBAAOlC,IAAA,CAACP,YAAY,IAAE,CAAC;EACzB,CAAC,EACD,CAACyB,cAAc,CACjB,CAAC;EAED,IAAMwB,iBAAiB,GAAGtD,WAAW,CACnC,UAAC4C,IAAoB,EAA8C;IAAA,IAA5CW,cAAwB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;IAClD,IAAIZ,IAAI,CAACK,IAAI,KAAK,GAAG,IAAIM,cAAc,CAACE,MAAM,KAAK,CAAC,EAAE;MACpD,OAAO,CAAC,GAAG,CAAC;IACd;IACA,OAAO,GAAAE,MAAA,CAAAC,kBAAA,CAAIL,cAAc,IAAEX,IAAI,CAACK,IAAI,GAAEY,MAAM,CAAC,UAACC,CAAC;MAAA,OAAKA,CAAC,KAAK,EAAE;IAAA,EAAC;EAC/D,CAAC,EACD,EACF,CAAC;EAED,IAAMC,iBAAiB,GAAG/D,WAAW,CACnC,UAACgE,KAAa;IAAA,oBACZpD,IAAA;MAAMiB,SAAS,EAAEa,MAAM,CAACuB,aAAc;MAAAC,QAAA,eACpCtD,IAAA,CAACR,KAAK;QACJ+D,IAAI,EAAC,OAAO;QACZH,KAAK,EAAEA,KAAM;QACbI,QAAQ,EAAE,SAAAA,SAACC,CAAC;UAAA,OAAKhC,iBAAiB,aAAjBA,iBAAiB,uBAAjBA,iBAAiB,CAAGgC,CAAC,CAACC,MAAM,CAACN,KAAK,CAAC;QAAA,CAAC;QACrDO,MAAM,EAAE,SAAAA,OAAA;UAAA,OAAMjC,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAG,CAAC;QAAA,CAAC;QAChCkC,YAAY,EAAE,SAAAA,aAAA;UAAA,OAAMlC,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAG,CAAC;QAAA,CAAC;QACtCmC,SAAS,EAAE,SAAAA,UAACJ,CAAC,EAAK;UAChB,IAAIA,CAAC,CAACK,GAAG,KAAK,QAAQ,EAAE;YACtBL,CAAC,CAACM,eAAe,CAAC,CAAC;YACnBpC,YAAY,aAAZA,YAAY,eAAZA,YAAY,CAAG,CAAC;UAClB;QACF,CAAE;QACFqC,SAAS;QACT/C,SAAS,EAAEa,MAAM,CAACmC,WAAY;QAC9BC,OAAO,EAAE,SAAAA,QAACT,CAAC;UAAA,OAAKA,CAAC,CAACM,eAAe,CAAC,CAAC;QAAA,CAAC;QACpCrD,QAAQ,EAAE,SAAAA,SAAC+C,CAAC;UAAA,OAAKA,CAAC,CAACM,eAAe,CAAC,CAAC;QAAA,CAAC;QACrCI,OAAO,EAAE,SAAAA,QAACV,CAAC;UAAA,OAAKA,CAAC,CAACM,eAAe,CAAC,CAAC;QAAA;MAAC,CACrC;IAAC,CACE,CAAC;EAAA,CACR,EACD,CAACtC,iBAAiB,EAAEC,aAAa,EAAEC,YAAY,EAAEG,MAAM,CACzD,CAAC;;EAED;EACA,IAAMsC,QAAQ,GAAG9C,SAAS,KAAK,IAAI,GAAG,MAAM,GAAGA,SAAS,IAAI,KAAK;;EAEjE;EACA,IAAM+C,cAAc,GAAGjF,WAAW,CAChC,UAACkF,QAAkB,EAAEC,QAAkB,EAAEC,YAA0B,EAAK;IACtE,IAAMC,MAAM,GAAGH,QAAyD;IACxE,IAAMI,MAAM,GAAGH,QAAyD;IACxE,IAAMI,gBAAgB,GAAGF,MAAM,CAACG,aAAa;IAC7C,IAAMC,gBAAgB,GAAGH,MAAM,CAACE,aAAa;IAC7C,IAAI,CAACD,gBAAgB,EAAE;IAEvB,IAAMG,OAAO,GAAGC,MAAM,CAACT,QAAQ,CAACR,GAAG,CAAC;IACpC,IAAMkB,OAAO,GAAGD,MAAM,CAACR,QAAQ,CAACT,GAAG,CAAC;IACpC,IAAMmB,YAAY,GAAGN,gBAAgB,CAACtC,IAAI;IAC1C,IAAI6C,OAAe;;IAEnB;IACA,IAAI,CAACL,gBAAgB,IAAIG,OAAO,KAAK,wBAAwB,EAAE;MAC7DE,OAAO,GAAGD,YAAY;MACtB1D,MAAM,aAANA,MAAM,eAANA,MAAM,CAAG;QACP4D,QAAQ,EAAER,gBAAgB,CAACS,KAAK;QAChCC,KAAK,EAAEV,gBAAgB,CAACU,KAAK;QAC7BC,OAAO,EAAER,OAAO;QAChBI,OAAO,EAAPA,OAAO;QACPZ,QAAQ,EAAEK,gBAAgB;QAC1BJ,QAAQ,EAAE;UAAEa,KAAK,EAAE,EAAE;UAAE/C,IAAI,EAAE;QAAG;MAClC,CAAC,CAAC;MACF;IACF;IAEA,IAAI,CAACwC,gBAAgB,EAAE;IAEvB,IAAI,CAACN,QAAQ,CAACgB,MAAM,IAAIf,YAAY,KAAK,CAAC,EAAE;MAC1C;MACAU,OAAO,MAAAnC,MAAA,CAAMiC,OAAO,OAAAjC,MAAA,CAAIkC,YAAY,CAAE;IACxC,CAAC,MAAM;MACL;MACA,IAAMO,cAAc,GAAGR,OAAO,CAACS,QAAQ,CAAC,GAAG,CAAC,GACxCT,OAAO,CAACU,SAAS,CAAC,CAAC,EAAEV,OAAO,CAACW,WAAW,CAAC,GAAG,CAAC,CAAC,GAC9C,EAAE;MACNT,OAAO,GAAGM,cAAc,MAAAzC,MAAA,CACjByC,cAAc,OAAAzC,MAAA,CAAIkC,YAAY,IACjCA,YAAY;IAClB;IAEA1D,MAAM,aAANA,MAAM,eAANA,MAAM,CAAG;MACP4D,QAAQ,EAAER,gBAAgB,CAACS,KAAK;MAChCC,KAAK,EAAEV,gBAAgB,CAACU,KAAK;MAC7BC,OAAO,EAAER,OAAO;MAChBI,OAAO,EAAPA,OAAO;MACPZ,QAAQ,EAAEK,gBAAgB;MAC1BJ,QAAQ,EAAEM;IACZ,CAAC,CAAC;EACJ,CAAC,EACD,CAACtD,MAAM,CACT,CAAC;EAED,IAAMqE,qBAAqB,GAAGxG,WAAW,CACvC,UAACyG,OAAe,EAAK;IACnB,IAAMC,UAAU,GAAGrF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEgF,QAAQ,CAACI,OAAO,CAAC;IAClD,IAAI,CAACC,UAAU,EAAE;MACfnF,QAAQ,aAARA,QAAQ,eAARA,QAAQ,IAAAoC,MAAA,CAAAC,kBAAA,CAAQvC,YAAY,IAAI,EAAE,IAAGoF,OAAO,IAAG;QAC7C7D,IAAI,EAAE,IAAW;QACjB+D,QAAQ,EAAE,IAAI;QACdC,WAAW,EAAE;MACf,CAAC,CAAC;IACJ;EACF,CAAC,EACD,CAACvF,YAAY,EAAEE,QAAQ,CACzB,CAAC;EAED,IAAAsF,cAAA,GAUInG,aAAa,CAAC;MAChBsE,QAAQ,EAARA,QAAQ;MACR7C,MAAM,EAAE8C,cAAc;MACtB6B,iBAAiB,EAAEN;IACrB,CAAC,CAAC;IAbAO,WAAW,GAAAF,cAAA,CAAXE,WAAW;IACXC,SAAS,GAAAH,cAAA,CAATG,SAAS;IACTC,eAAe,GAAAJ,cAAA,CAAfI,eAAe;IACfC,cAAc,GAAAL,cAAA,CAAdK,cAAc;IACdC,eAAe,GAAAN,cAAA,CAAfM,eAAe;IACfC,UAAU,GAAAP,cAAA,CAAVO,UAAU;IACVC,mBAAmB,GAAAR,cAAA,CAAnBQ,mBAAmB;IACnBC,eAAe,GAAAT,cAAA,CAAfS,eAAe;IACfC,WAAW,GAAAV,cAAA,CAAXU,WAAW;;EAOb;EACA;EACA,IAAMC,iBAAiB,GAAGxH,WAAW,CACnC,UACEyH,KAAuB,EAGR;IAAA,IAFflE,cAAwB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;IAAA,IAC7BkE,SAAiB,GAAAlE,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;IAEtB,IAAMmE,MAAM,GAAGF,KAAK,CAACG,GAAG,CAAC,UAAChF,IAAI,EAAK;MACjC,IAAMiF,YAAY,GAAGvE,iBAAiB,CAACV,IAAI,EAAEW,cAAc,CAAC;MAC5D,IAAMuE,QAAQ,GAAGD,YAAY,CAACE,IAAI,CAAC,GAAG,CAAC,CAACC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;MAE3D,IAAMC,SAAS,GAAG7F,QAAQ,IAAIA,QAAQ,CAACsC,GAAG,KAAKoD,QAAQ;MAEvD,IAAMI,YAAY,GAAGtF,IAAI,CAACsB,QAAQ,GAC9BsD,iBAAiB,CAAC5E,IAAI,CAACsB,QAAQ,EAAE2D,YAAY,EAAEC,QAAQ,CAAC,GACxDpE,SAAS;MAEb,IAAMyE,QAAa,GAAG;QACpBzD,GAAG,EAAEoD,QAAQ;QACb7E,IAAI,EAAE6E,QAAQ;QACdD,YAAY,EAAZA,YAAY;QACZ/E,IAAI,EAAEH,OAAO,CAACC,IAAI,CAAC;QACnBuD,MAAM,EAAE,EAAEvD,IAAI,CAACC,IAAI,KAAK,QAAQ,CAAC;QACjC2C,aAAa,EAAE5C,IAAI;QACnBsB,QAAQ,EAAEgE;MACZ,CAAC;;MAED;MACA,IAAID,SAAS,EAAE;QACbE,QAAQ,CAACnC,KAAK,GAAGjC,iBAAiB,CAAC3B,QAAQ,CAAEgG,YAAY,CAAC;QAC1D,OAAOD,QAAQ;MACjB;;MAEA;MACA,IAAME,YAAY,gBAChBvH,KAAA;QACEe,SAAS,EAAErB,IAAI,CACbkC,MAAM,CAACuB,aAAa,EACpBjC,WAAW,IAAIU,MAAM,CAAC4F,kBACxB,CAAE;QAAApE,QAAA,gBAEFtD,IAAA;UAAAsD,QAAA,EAAOtB,IAAI,CAACoD;QAAK,CAAO,CAAC,EACxBhE,WAAW,iBACVpB,IAAA,CAACT,QAAQ;UACPoI,IAAI,EAAEvG,WAAW,CAACY,IAAI,EAAE;YACtB4F,WAAW,EAAE,SAAAA,YAAA;cAAA,OAAM/F,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAGqF,QAAQ,EAAElF,IAAI,CAAC;YAAA;UACpD,CAAC,CAAE;UACH6F,OAAO,EAAE,CAAC,OAAO,CAAE;UACnBC,SAAS,EAAC,aAAa;UAAAxE,QAAA,eAEvBtD,IAAA;YACEiB,SAAS,EAAErB,IAAI,CAACkC,MAAM,CAACiG,QAAQ,EAAE,uBAAuB,CAAE;YAC1D7D,OAAO,EAAE,SAAAA,QAACT,CAAC;cAAA,OAAKA,CAAC,CAACM,eAAe,CAAC,CAAC;YAAA,CAAC;YAAAT,QAAA,eAEpCtD,IAAA,CAACL,YAAY,IAAE;UAAC,CACZ;QAAC,CACC,CACX;MAAA,CACG,CACP;;MAED;MACA;MACA,IAAIyE,QAAQ,EAAE;QACZ,IAAM4D,QAAQ,GAAGT,QAEhB;QACD,IAAMU,YAAY,GAAGtB,WAAW,CAACqB,QAAQ,CAAC;QAE1CT,QAAQ,CAACnC,KAAK,gBACZpF,IAAA;UACEiB,SAAS,EAAErB,IAAI,CACbkC,MAAM,CAACoG,eAAe,EACtBD,YAAY,IAAInG,MAAM,CAACqG,cACzB,CAAE;UACF,iBAAejB,QAAS;UACxB5F,SAAS,EAAE2G,YAAa;UACxB9B,WAAW,EACT8B,YAAY,GAAG,UAACxE,CAAC;YAAA,OAAK0C,WAAW,CAAC1C,CAAC,EAAE8D,QAAQ,CAAC;UAAA,IAAGzE,SAClD;UACDsD,SAAS,EAAE6B,YAAY,GAAG7B,SAAS,GAAGtD,SAAU;UAChDsF,WAAW,EAAE,SAAAA,YAAC3E,CAAC;YAAA,OAAK4C,eAAe,CAAC5C,CAAC,EAAE8D,QAAQ,CAAC;UAAA,CAAC;UACjDc,UAAU,EAAE,SAAAA,WAAC5E,CAAC;YAAA,OAAK6C,cAAc,CAAC7C,CAAC,EAAE8D,QAAQ,CAAC;UAAA,CAAC;UAC/Ce,WAAW,EAAE/B,eAAgB;UAC7BhF,MAAM,EAAE,SAAAA,OAACkC,CAAC;YAAA,OAAK+C,UAAU,CAAC/C,CAAC,EAAE8D,QAAQ,CAAC;UAAA,CAAC;UAAAjE,QAAA,EAEtCmE;QAAY,CACV,CACN;MACH,CAAC,MAAM;QACLF,QAAQ,CAACnC,KAAK,GAAGqC,YAAY;MAC/B;MAEA,OAAOF,QAAQ;IACjB,CAAC,CAAC;;IAEF;IACA,IAAI3F,UAAU,IAAIJ,QAAQ,IAAIA,QAAQ,CAAC+G,IAAI,KAAK,QAAQ,EAAE;MACxD,IAAMC,eAAe,GAAG5G,UAAU,CAACkF,SAAS;MAC5C,IACE0B,eAAe,KAAK1B,SAAS,IAC5B0B,eAAe,KAAK,EAAE,IAAI1B,SAAS,KAAK,EAAG,IAC3C0B,eAAe,KAAK,GAAG,IAAI1B,SAAS,KAAK,EAAG,EAC7C;QACA,IAAM2B,QAAa,GAAG;UACpB3E,GAAG,EAAEtC,QAAQ,CAACsC,GAAG;UACjBsB,KAAK,EAAEjC,iBAAiB,CAAC3B,QAAQ,CAACgG,YAAY,CAAC;UAC/CtF,IAAI,EACFN,UAAU,CAACK,IAAI,KAAK,QAAQ,gBAC1BjC,IAAA,CAACN,cAAc,IAAE,CAAC,gBAElBM,IAAA,CAACP,YAAY,IAAE,CAChB;UACH8F,MAAM,EAAE3D,UAAU,CAACK,IAAI,KAAK,MAAM;UAClCI,IAAI,EAAEb,QAAQ,CAACsC,GAAG;UAClBmD,YAAY,EAAE,CAACzF,QAAQ,CAACsC,GAAG,CAAC;UAC5Bc,aAAa,EAAE,IAAI;UACnB8D,WAAW,EAAE;QACf,CAAC;QACD3B,MAAM,CAAC4B,IAAI,CAACF,QAAQ,CAAC;MACvB;IACF;IAEA,OAAO1B,MAAM;EACf,CAAC,EACD,CACErE,iBAAiB,EACjBX,OAAO,EACPX,WAAW,EACXU,MAAM,EACNN,QAAQ,EACR2B,iBAAiB,EACjBvB,UAAU,EACVC,aAAa,EACbuC,QAAQ,EACRuC,WAAW,EACXR,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,cAAc,EACdC,eAAe,EACfC,UAAU,CAEd,CAAC;EAED,IAAMoC,iBAAiB,GAAGvJ,OAAO,CAC/B;IAAA,OAAMuH,iBAAiB,CAACrG,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;EAAA,GACzC,CAACA,QAAQ,EAAEqG,iBAAiB,CAC9B,CAAC;EAED,IAAMiC,YAAmC,GAAGzJ,WAAW,CACrD,UAAC0J,IAAS,EAAEC,IAAS,EAAK;IAAA,IAAAC,iBAAA;IACxB;IACA,IAAIxH,QAAQ,EAAE;IACd;IACA,IAAMQ,IAAI,GAAG+G,IAAI,CAAC/G,IAA4C;IAC9D,IAAIA,IAAI,CAAC0G,WAAW,EAAE;IACtB;IACA,IAAMhF,MAAM,IAAAsF,iBAAA,GAAGD,IAAI,CAAC/C,WAAW,cAAAgD,iBAAA,uBAAhBA,iBAAA,CAAkBtF,MAA4B;IAC7D,IACEA,MAAM,KACLA,MAAM,CAACuF,OAAO,CAAC,wBAAwB,CAAC,IACvCvF,MAAM,CAACuF,OAAO,CAAC,eAAe,CAAC,CAAC,EAClC;MACA;IACF;IACAvI,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAGoI,IAAI,EAAEC,IAAI,CAAC;EACxB,CAAC,EACD,CAACrI,QAAQ,EAAEc,QAAQ,CACrB,CAAC;EAED,IAAM0H,SAAS,GACb/H,cAAc,KAAK,KAAK,IAAIA,cAAc,KAAK,IAAI,GAC/C,IAAI,GACJ,OAAOA,cAAc,KAAK,UAAU,GAClCA,cAAc,CAAC,CAAC,GAChBA,cAAc;EAEtB,oBACEjB,KAAA;IAAKe,SAAS,EAAErB,IAAI,CAACkC,MAAM,CAACqH,cAAc,EAAElI,SAAS,CAAE;IAACmI,KAAK,EAAE;MAAE/H,KAAK,EAALA;IAAM,CAAE;IAAAiC,QAAA,GACtE4F,SAAS,iBAAIlJ,IAAA;MAAKiB,SAAS,EAAEa,MAAM,CAACX,cAAe;MAAAmC,QAAA,EAAE4F;IAAS,CAAM,CAAC,eACtElJ,IAAA;MACEiB,SAAS,EAAEa,MAAM,CAACuH,oBAAqB;MACvChB,UAAU,EAAEjE,QAAQ,GAAGqC,mBAAmB,GAAG3D,SAAU;MACvDvB,MAAM,EAAE6C,QAAQ,GAAGsC,eAAe,GAAG5D,SAAU;MAAAQ,QAAA,eAE/CtD,IAAA,CAACG,gBAAgB;QACfiJ,KAAK,EACH;UACE,uCAAuC,EAAE,kBAAkB;UAC3D,0CAA0C,EAAE;QAC9C,CACD;QACD7I,QAAQ,EAAEqI,iBAAkB;QAC5BpI,YAAY,EAAEA,YAAa;QAC3BC,YAAY,EAAEA,YAAa;QAC3BC,QAAQ,EAAEmI,YAAa;QACvBlI,QAAQ,EAAEA,QAAS;QACnB2I,QAAQ,EAAE,KAAM;QAChBC,SAAS;QACT1I,QAAQ,EAAEA,QAAgB;QAC1BC,YAAY,EAAEA,YAAa;QAC3BE,gBAAgB,EAAEA,gBAAiB;QACnCM,SAAS,EAAE;MAAM,CAClB;IAAC,CACC,CAAC;EAAA,CACH,CAAC;AAEV,CAAC;AAED,eAAejB,sBAAsB"}
1
+ {"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","Tree","Dropdown","Input","FileOutlined","FolderOutlined","MoreOutlined","clsx","useStyles","useFolderDrag","jsx","_jsx","jsxs","_jsxs","AntDirectoryTree","DirectoryTree","InlineEditInput","_ref","editKey","value","className","onValueChange","onConfirm","onCancel","_useState","_useState2","_slicedToArray","draft","setDraft","committedRef","current","commit","size","onChange","e","target","onBlur","onPressEnter","onKeyDown","stopPropagation","key","autoFocus","onClick","onMouseDown","onSelect","onFocus","DirectoryTreeComponent","_ref2","treeData","selectedKeys","expandedKeys","onExpand","_ref2$showLine","showLine","switcherIcon","_ref2$defaultExpandAl","defaultExpandAll","directoryIcons","directoryTitle","moreActions","width","draggable","onDrop","editNode","onEditValueChange","onEditConfirm","onEditCancel","createInfo","onStartRename","styles","getIcon","node","type","icon","directory","filePath","path","toLowerCase","extension","split","pop","buildPathSegments","parentSegments","arguments","length","undefined","concat","_toConsumableArray","filter","s","renderInlineInput","treeNodeTitle","children","inlineInput","dragMode","handleDragDrop","dragNode","dropNode","dropPosition","dragNd","dropNd","originalDragNode","_originalNode","originalDropNode","dragKey","String","dropKey","dragFileName","newPath","fileName","title","extra","oldPath","isLeaf","dropParentPath","includes","substring","lastIndexOf","handleDragEnterExpand","nodeKey","isExpanded","expanded","nativeEvent","_useFolderDrag","onDragEnterExpand","onDragStart","onDragEnd","onItemDragEnter","onItemDragOver","onItemDragLeave","onItemDrop","onContainerDragOver","onContainerDrop","canDragNode","convertToTreeData","nodes","parentKey","result","map","pathSegments","fullPath","join","replace","isEditing","nodeChildren","baseNode","currentValue","titleContent","treeNodeTitleHover","menu","startRename","trigger","placement","moreIcon","nodeData","draggableDiv","treeNodeWrapper","dragNodeHandle","onDragEnter","onDragOver","onDragLeave","mode","targetParentKey","tempNode","_isTempNode","push","treeDataConverted","handleSelect","keys","info","_info$nativeEvent","closest","titleNode","directoryPanel","style","directoryTreeContent","multiple","blockNode"],"sources":["../../../../src/components/FolderTree/DirectoryTree.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Tree, Dropdown, Input } from \"antd\";\nimport { FileOutlined, FolderOutlined, MoreOutlined } from \"@ant-design/icons\";\nimport type { TreeProps } from \"antd\";\nimport type { DataNode } from \"antd/es/tree\";\nimport clsx from \"clsx\";\nimport type {\n FolderTreeData,\n FolderTreeProps,\n EditNodeInfo,\n CreateNodeContext,\n} from \"./types\";\nimport { useStyles } from \"./styles\";\nimport { useFolderDrag, type DropPosition } from \"./useFolderDrag\";\n\nconst { DirectoryTree: AntDirectoryTree } = Tree;\n\nexport interface DirectoryTreeComponentProps {\n treeData: FolderTreeData[];\n directoryIcons?: FolderTreeProps[\"directoryIcons\"];\n selectedKeys?: string[];\n expandedKeys?: string[];\n onSelect?: TreeProps[\"onSelect\"];\n onExpand?: TreeProps[\"onExpand\"];\n showLine?: FolderTreeProps[\"showLine\"];\n switcherIcon?: FolderTreeProps[\"switcherIcon\"];\n defaultExpandAll?: boolean;\n className?: string;\n directoryTitle?: FolderTreeProps[\"directoryTitle\"];\n moreActions?: FolderTreeProps[\"moreActions\"];\n width?: number | string;\n draggable?: FolderTreeProps[\"draggable\"];\n onDrop?: FolderTreeProps[\"onDrop\"];\n /** 当前编辑节点信息 */\n editNode?: EditNodeInfo | null;\n /** 编辑值变化回调 */\n onEditValueChange?: (value: string) => void;\n /** 编辑确认回调 */\n onEditConfirm?: (value?: string) => void;\n /** 编辑取消回调 */\n onEditCancel?: () => void;\n /** 新建上下文 */\n createInfo?: CreateNodeContext | null;\n /** 开始重命名回调(由父组件注入) */\n onStartRename?: (fullPath: string, node: FolderTreeData) => void;\n}\n\ninterface InlineEditInputProps {\n editKey: string;\n value: string;\n className?: string;\n onValueChange?: (value: string) => void;\n onConfirm?: (value?: string) => void;\n onCancel?: () => void;\n}\n\nconst InlineEditInput: React.FC<InlineEditInputProps> = ({\n editKey,\n value,\n className,\n onValueChange,\n onConfirm,\n onCancel,\n}) => {\n const [draft, setDraft] = useState(value);\n const committedRef = useRef(false);\n\n useEffect(() => {\n setDraft(value);\n committedRef.current = false;\n }, [editKey, value]);\n\n const commit = useCallback(() => {\n if (committedRef.current) return;\n committedRef.current = true;\n onValueChange?.(draft);\n onConfirm?.(draft);\n }, [draft, onConfirm, onValueChange]);\n\n return (\n <Input\n size=\"small\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onPressEnter={commit}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Escape\") {\n committedRef.current = true;\n onCancel?.();\n }\n }}\n autoFocus\n className={className}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onSelect={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n />\n );\n};\n\nconst DirectoryTreeComponent: React.FC<DirectoryTreeComponentProps> = ({\n treeData,\n selectedKeys,\n expandedKeys,\n onSelect,\n onExpand,\n showLine = false,\n switcherIcon,\n defaultExpandAll = true,\n className,\n directoryIcons,\n directoryTitle,\n moreActions,\n width,\n draggable,\n onDrop,\n editNode,\n onEditValueChange,\n onEditConfirm,\n onEditCancel,\n createInfo,\n onStartRename,\n}) => {\n const styles = useStyles();\n\n const getIcon = useCallback(\n (node: FolderTreeData) => {\n if (directoryIcons === false || directoryIcons === null) {\n return null;\n }\n if (node.type == \"folder\") {\n const icon = directoryIcons?.directory;\n if (typeof icon === \"function\") return icon();\n return icon || <FolderOutlined />;\n }\n const filePath = node.path.toLowerCase();\n const extension = filePath.split(\".\").pop();\n if (extension) {\n const icon = directoryIcons?.[extension];\n if (icon) return typeof icon === \"function\" ? icon() : icon;\n }\n return <FileOutlined />;\n },\n [directoryIcons],\n );\n\n const buildPathSegments = useCallback(\n (node: FolderTreeData, parentSegments: string[] = []): string[] => {\n if (node.path === \"/\" && parentSegments.length === 0) {\n return [\"/\"];\n }\n return [...parentSegments, node.path].filter((s) => s !== \"\");\n },\n [],\n );\n\n const renderInlineInput = useCallback(\n (key: string, value: string) => (\n <span className={styles.treeNodeTitle}>\n <InlineEditInput\n editKey={key}\n value={value}\n className={styles.inlineInput}\n onValueChange={onEditValueChange}\n onConfirm={onEditConfirm}\n onCancel={onEditCancel}\n />\n </span>\n ),\n [onEditValueChange, onEditConfirm, onEditCancel, styles],\n );\n\n // ====== 拖拽模式 ======\n const dragMode = draggable === true ? \"file\" : draggable || false;\n\n // ====== 自定义拖拽 hook ======\n const handleDragDrop = useCallback(\n (dragNode: DataNode, dropNode: DataNode, dropPosition: DropPosition) => {\n const dragNd = dragNode as DataNode & { _originalNode?: FolderTreeData };\n const dropNd = dropNode as DataNode & { _originalNode?: FolderTreeData };\n const originalDragNode = dragNd._originalNode;\n const originalDropNode = dropNd._originalNode;\n if (!originalDragNode) return;\n\n const dragKey = String(dragNode.key);\n const dropKey = String(dropNode.key);\n const dragFileName = originalDragNode.path;\n let newPath: string;\n\n // 拖到底部 drop zone:放在根级别末尾\n if (!originalDropNode && dropKey === \"__bottom_placeholder__\") {\n newPath = dragFileName;\n onDrop?.({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: { title: \"\", path: \"\" },\n });\n return;\n }\n\n if (!originalDropNode) return;\n\n if (!dropNode.isLeaf && dropPosition === 0) {\n // 拖入文件夹内部\n newPath = `${dropKey}/${dragFileName}`;\n } else {\n // 拖到节点旁边(同级)\n const dropParentPath = dropKey.includes(\"/\")\n ? dropKey.substring(0, dropKey.lastIndexOf(\"/\"))\n : \"\";\n newPath = dropParentPath\n ? `${dropParentPath}/${dragFileName}`\n : dragFileName;\n }\n\n onDrop?.({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: originalDropNode,\n });\n },\n [onDrop],\n );\n\n const handleDragEnterExpand = useCallback(\n (nodeKey: string) => {\n const isExpanded = expandedKeys?.includes(nodeKey);\n if (!isExpanded) {\n onExpand?.([...(expandedKeys || []), nodeKey], {\n node: null as any,\n expanded: true,\n nativeEvent: null as any,\n });\n }\n },\n [expandedKeys, onExpand],\n );\n\n const {\n onDragStart,\n onDragEnd,\n onItemDragEnter,\n onItemDragOver,\n onItemDragLeave,\n onItemDrop,\n onContainerDragOver,\n onContainerDrop,\n canDragNode,\n } = useFolderDrag({\n dragMode,\n onDrop: handleDragDrop,\n onDragEnterExpand: handleDragEnterExpand,\n });\n\n // ====== 转换树数据 ======\n // 注意:convertToTreeData 不依赖拖拽状态,拖拽效果通过 DOM 操作实现\n const convertToTreeData = useCallback(\n (\n nodes: FolderTreeData[],\n parentSegments: string[] = [],\n parentKey: string = \"\",\n ): DataNode[] => {\n const result = nodes.map((node) => {\n const pathSegments = buildPathSegments(node, parentSegments);\n const fullPath = pathSegments.join(\"/\").replace(/^\\/+/, \"\");\n\n const isEditing = editNode && editNode.key === fullPath;\n\n const nodeChildren = node.children\n ? convertToTreeData(node.children, pathSegments, fullPath)\n : undefined;\n\n const baseNode: any = {\n key: fullPath,\n path: fullPath,\n pathSegments,\n icon: getIcon(node),\n isLeaf: !(node.type === \"folder\"),\n _originalNode: node,\n children: nodeChildren,\n };\n\n // 编辑态:直接渲染 inline input\n if (isEditing) {\n baseNode.title = renderInlineInput(\n editNode!.key,\n editNode!.currentValue,\n );\n return baseNode;\n }\n\n // title 内容(按钮、菜单等)\n const titleContent = (\n <span\n className={clsx(\n styles.treeNodeTitle,\n moreActions && styles.treeNodeTitleHover,\n )}\n >\n <span>{node.title}</span>\n {moreActions && (\n <Dropdown\n menu={moreActions(node, {\n startRename: () => onStartRename?.(fullPath, node),\n })}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n >\n <span\n className={clsx(styles.moreIcon, \"folder-tree-more-icon\")}\n onClick={(e) => e.stopPropagation()}\n >\n <MoreOutlined />\n </span>\n </Dropdown>\n )}\n </span>\n );\n\n // 启用拖拽时:在 title 外层包裹具有 data-node-key 属性的容器,\n // 用于 DOM 查询和事件绑定。拖拽状态通过 CSS class 控制。\n if (dragMode) {\n const nodeData = baseNode as DataNode & {\n _isTempNode?: boolean;\n };\n const draggableDiv = canDragNode(nodeData);\n\n baseNode.title = (\n <div\n className={clsx(\n styles.treeNodeWrapper,\n draggableDiv && styles.dragNodeHandle,\n )}\n data-node-key={fullPath}\n draggable={draggableDiv}\n onDragStart={\n draggableDiv ? (e) => onDragStart(e, baseNode) : undefined\n }\n onDragEnd={draggableDiv ? onDragEnd : undefined}\n onDragEnter={(e) => onItemDragEnter(e, baseNode)}\n onDragOver={(e) => onItemDragOver(e, baseNode)}\n onDragLeave={onItemDragLeave}\n onDrop={(e) => onItemDrop(e, baseNode)}\n >\n {titleContent}\n </div>\n );\n } else {\n baseNode.title = titleContent;\n }\n\n return baseNode;\n });\n\n // 新建模式:在目标父节点下插入临时节点\n if (createInfo && editNode && editNode.mode === \"create\") {\n const targetParentKey = createInfo.parentKey;\n if (\n targetParentKey === parentKey ||\n (targetParentKey === \"\" && parentKey === \"\") ||\n (targetParentKey === \"/\" && parentKey === \"\")\n ) {\n const tempNode: any = {\n key: editNode.key,\n title: renderInlineInput(editNode.key, editNode.currentValue),\n icon:\n createInfo.type === \"folder\" ? (\n <FolderOutlined />\n ) : (\n <FileOutlined />\n ),\n isLeaf: createInfo.type === \"file\",\n path: editNode.key,\n pathSegments: [editNode.key],\n _originalNode: null,\n _isTempNode: true,\n };\n result.push(tempNode);\n }\n }\n\n return result;\n },\n [\n buildPathSegments,\n getIcon,\n moreActions,\n styles,\n editNode,\n renderInlineInput,\n createInfo,\n onStartRename,\n dragMode,\n canDragNode,\n onDragStart,\n onDragEnd,\n onItemDragEnter,\n onItemDragOver,\n onItemDragLeave,\n onItemDrop,\n ],\n );\n\n const treeDataConverted = useMemo(\n () => convertToTreeData(treeData, [], \"\"),\n [treeData, convertToTreeData],\n );\n\n const handleSelect: TreeProps[\"onSelect\"] = useCallback(\n (keys: any, info: any) => {\n // 编辑态不响应选中\n if (editNode) return;\n // 临时节点不可选中\n const node = info.node as DataNode & { _isTempNode?: boolean };\n if (node._isTempNode) return;\n // 点击 moreActions 区域不触发选中\n const target = info.nativeEvent?.target as HTMLElement | null;\n if (\n target &&\n (target.closest(\".folder-tree-more-icon\") ||\n target.closest(\".ant-dropdown\"))\n ) {\n return;\n }\n onSelect?.(keys, info);\n },\n [onSelect, editNode],\n );\n\n const titleNode =\n directoryTitle === false || directoryTitle === null\n ? null\n : typeof directoryTitle === \"function\"\n ? directoryTitle()\n : directoryTitle;\n\n return (\n <div className={clsx(styles.directoryPanel, className)} style={{ width }}>\n {titleNode && <div className={styles.directoryTitle}>{titleNode}</div>}\n <div\n className={styles.directoryTreeContent}\n onDragOver={dragMode ? onContainerDragOver : undefined}\n onDrop={dragMode ? onContainerDrop : undefined}\n >\n <AntDirectoryTree\n style={\n {\n \"--ant-tree-directory-node-selected-bg\": \"rgba(0,0,0,0.03)\",\n \"--ant-tree-directory-node-selected-color\": \"#1a1c1e\",\n } as React.CSSProperties\n }\n treeData={treeDataConverted}\n selectedKeys={selectedKeys}\n expandedKeys={expandedKeys}\n onSelect={handleSelect}\n onExpand={onExpand}\n multiple={false}\n blockNode\n showLine={showLine as any}\n switcherIcon={switcherIcon}\n defaultExpandAll={defaultExpandAll}\n draggable={false}\n />\n </div>\n </div>\n );\n};\n\nexport default DirectoryTreeComponent;\n"],"mappings":"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"}
@@ -149,9 +149,9 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
149
149
  }, []);
150
150
 
151
151
  // 确认编辑
152
- var handleEditConfirm = useCallback(function () {
152
+ var handleEditConfirm = useCallback(function (value) {
153
153
  if (!editNode) return;
154
- var newValue = editNode.currentValue.trim();
154
+ var newValue = (value !== null && value !== void 0 ? value : editNode.currentValue).trim();
155
155
  if (editNode.mode === "rename") {
156
156
  var _findNodeAndValidate2 = findNodeAndValidate(editNode.key),
157
157
  node = _findNodeAndValidate2.node;
@@ -1 +1 @@
1
- {"version":3,"names":["React","useRef","useMemo","useCallback","useEffect","useState","forwardRef","useImperativeHandle","clsx","DirectoryTreeComponent","FilePreview","useStyles","jsx","_jsx","jsxs","_jsxs","getAllExpandedKeys","nodes","parentPath","arguments","length","undefined","keys","forEach","node","_node$children","currentPath","concat","path","children","push","apply","_toConsumableArray","normalizeTreeData","map","_objectSpread","type","FolderTree","props","ref","className","style","treeData","directoryIcons","previewRender","directoryTitle","previewTitle","_props$selectable","selectable","defaultSelectedFile","_props$defaultExpandA","defaultExpandAll","selectedFile","onSelectedFileChange","_props$directoryTreeW","directoryTreeWidth","emptyRender","defaultExpandedPaths","expandedPaths","onExpandedPathsChange","onFileClick","onFolderClick","fileContentService","moreActions","showLine","switcherIcon","_props$showPreview","showPreview","draggable","onDrop","onRename","onCreate","styles","normalizedTreeData","_useState","_useState2","_slicedToArray","editNode","setEditNode","_useState3","_useState4","createContext","setCreateContext","findNodeAndValidate","validateAsFile","isValid","segments","Array","isArray","filter","Boolean","split","findNode","index","currentSegment","_iterator","_createForOfIteratorHelper","_step","s","n","done","value","err","e","f","isValidSelectedFile","filePath","_findNodeAndValidate","key","handleEditValueChange","prev","currentValue","handleEditConfirm","newValue","trim","mode","_findNodeAndValidate2","oldTitle","originalTitle","newTitle","parentKey","name","extra","handleEditCancel","handleStartRename","fullPath","titleStr","title","String","_useState5","_useState6","selectedFileState","setSelectedFileState","controlled","_useState7","_useState8","expandedPathsState","setExpandedPathsState","_useState9","_useState10","validSelectedFile","setValidSelectedFile","_useState11","_useState12","fileContent","setFileContent","_useState13","_useState14","loadingContent","setLoadingContent","initializedExpandRef","current","loadContent","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_findNodeAndValidate3","content","wrap","_callee$","_context","next","abrupt","join","loadFileContent","sent","t0","Error","message","finish","stop","handleSelect","_keys","info","_keys$","selectedNodes","isFolder","some","isLeaf","pathArray","_findNodeAndValidate4","originalNode","fileName","nodeContent","isControlled","handleExpand","newPaths","createNode","options","defaultName","tempKey","Date","now","includes","container","containerNoPreview","background","backgroundColor","selectedKeys","expandedKeys","onSelect","onExpand","width","onEditValueChange","onEditConfirm","onEditCancel","createInfo","onStartRename","loading","getFileNode","_findNodeAndValidate5","displayName"],"sources":["../../../../src/components/FolderTree/index.tsx"],"sourcesContent":["import React, {\n useRef,\n useMemo,\n useCallback,\n useEffect,\n useState,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport type { TreeProps } from \"antd\";\nimport clsx from \"clsx\";\nimport type {\n FolderTreeData,\n FolderTreeProps,\n FolderTreeRef,\n EditNodeInfo,\n CreateNodeContext,\n} from \"./types\";\nimport DirectoryTreeComponent from \"./DirectoryTree\";\nimport FilePreview from \"./FilePreview\";\nimport { useStyles } from \"./styles\";\n\nexport type {\n FolderTreeData,\n FolderTreeProps,\n FileContentService,\n FolderTreeRef,\n} from \"./types\";\n\n// 展开所有节点\nfunction getAllExpandedKeys(\n nodes: FolderTreeData[],\n parentPath = \"\",\n): string[] {\n const keys: string[] = [];\n\n nodes.forEach((node) => {\n const currentPath = parentPath ? `${parentPath}/${node.path}` : node.path;\n\n if (node.children?.length) {\n keys.push(currentPath);\n keys.push(...getAllExpandedKeys(node.children, currentPath));\n }\n });\n\n return keys;\n}\n\n// 格式化数据\nfunction normalizeTreeData(nodes: FolderTreeData[]): FolderTreeData[] {\n return nodes.map((node) => ({\n ...node,\n type: node.type\n ? node.type\n : !!node.children && node.children.length > 0\n ? \"folder\"\n : \"file\",\n children: node.children ? normalizeTreeData(node.children) : undefined,\n }));\n}\n\nconst FolderTree = forwardRef<FolderTreeRef, FolderTreeProps>((props, ref) => {\n const {\n className,\n style,\n treeData,\n directoryIcons,\n previewRender,\n directoryTitle,\n previewTitle,\n selectable = true,\n defaultSelectedFile,\n defaultExpandAll = true,\n selectedFile,\n onSelectedFileChange,\n directoryTreeWidth = 280,\n emptyRender,\n defaultExpandedPaths,\n expandedPaths,\n onExpandedPathsChange,\n onFileClick,\n onFolderClick,\n fileContentService,\n moreActions,\n showLine,\n switcherIcon,\n showPreview = true,\n draggable,\n onDrop,\n onRename,\n onCreate,\n } = props;\n\n const styles = useStyles();\n\n const normalizedTreeData = useMemo(\n () => normalizeTreeData(treeData),\n [treeData],\n );\n\n // ====== 编辑态状态 ======\n const [editNode, setEditNode] = useState<EditNodeInfo | null>(null);\n const [createContext, setCreateContext] = useState<CreateNodeContext | null>(\n null,\n );\n\n // ====== 工具函数 ======\n const findNodeAndValidate = useCallback(\n (\n path: string | string[],\n validateAsFile = false,\n ): { node: FolderTreeData | undefined; isValid: boolean } => {\n if (!path) return { node: undefined, isValid: false };\n const segments = Array.isArray(path)\n ? path.filter(Boolean)\n : path.split(\"/\").filter(Boolean);\n if (segments.length === 0) return { node: undefined, isValid: false };\n\n const findNode = (\n nodes: FolderTreeData[],\n index = 0,\n ): FolderTreeData | undefined => {\n if (index >= segments.length) return undefined;\n const currentSegment = segments[index];\n for (const node of nodes) {\n if (node.path === currentSegment) {\n return index === segments.length - 1\n ? node\n : node.children\n ? findNode(node.children, index + 1)\n : undefined;\n }\n }\n return undefined;\n };\n\n const node = findNode(normalizedTreeData);\n const isValid = validateAsFile\n ? !!node && (!node?.children || node.children.length === 0)\n : !!node;\n return { node, isValid };\n },\n [normalizedTreeData],\n );\n\n const isValidSelectedFile = (filePath?: string[]): boolean =>\n !!(\n filePath &&\n filePath.length > 0 &&\n findNodeAndValidate(filePath, true).isValid\n );\n\n // ====== 编辑态逻辑 ======\n\n // 当 normalizedTreeData 变化时,检查编辑节点是否还存在\n useEffect(() => {\n if (!editNode) return;\n const { node } = findNodeAndValidate(editNode.key);\n if (!node) {\n setEditNode(null);\n setCreateContext(null);\n }\n }, [normalizedTreeData]);\n\n // 编辑值变化\n const handleEditValueChange = useCallback((value: string) => {\n setEditNode((prev) => (prev ? { ...prev, currentValue: value } : null));\n }, []);\n\n // 确认编辑\n const handleEditConfirm = useCallback(() => {\n if (!editNode) return;\n const newValue = editNode.currentValue.trim();\n\n if (editNode.mode === \"rename\") {\n const { node } = findNodeAndValidate(editNode.key);\n onRename?.({\n key: editNode.key,\n oldTitle: editNode.originalTitle,\n newTitle: newValue,\n node: node!,\n });\n } else if (editNode.mode === \"create\" && createContext) {\n onCreate?.({\n parentKey: createContext.parentKey,\n name: newValue,\n type: createContext.type,\n extra: createContext.extra,\n });\n }\n\n setEditNode(null);\n setCreateContext(null);\n }, [editNode, createContext, findNodeAndValidate, onRename, onCreate]);\n\n // 取消编辑\n const handleEditCancel = useCallback(() => {\n setEditNode(null);\n setCreateContext(null);\n }, []);\n\n // 开始重命名\n const handleStartRename = useCallback(\n (fullPath: string, node: FolderTreeData) => {\n const titleStr =\n typeof node.title === \"string\" ? node.title : String(node.path);\n setCreateContext(null);\n setEditNode({\n key: fullPath,\n type: node.type || \"file\",\n originalTitle: titleStr,\n currentValue: titleStr,\n mode: \"rename\",\n });\n },\n [],\n );\n\n // ====== State ======\n const [selectedFileState, setSelectedFileState] = useState<string[]>(() =>\n isValidSelectedFile(selectedFile || defaultSelectedFile)\n ? selectedFile || defaultSelectedFile || []\n : [],\n );\n const controlled = expandedPaths !== undefined;\n\n const [expandedPathsState, setExpandedPathsState] = useState<string[]>(\n defaultExpandedPaths || [],\n );\n const [validSelectedFile, setValidSelectedFile] = useState<boolean>(\n isValidSelectedFile(selectedFile || defaultSelectedFile),\n );\n const [fileContent, setFileContent] = useState<string>(\"\");\n const [loadingContent, setLoadingContent] = useState<boolean>(false);\n const initializedExpandRef = useRef(false);\n\n // 受控模式同步\n useEffect(() => {\n if (selectedFile !== undefined) {\n setSelectedFileState(selectedFile);\n setValidSelectedFile(isValidSelectedFile(selectedFile));\n }\n }, [selectedFile, isValidSelectedFile]);\n\n useEffect(() => {\n if (\n !controlled &&\n defaultExpandAll &&\n !initializedExpandRef.current &&\n normalizedTreeData.length > 0\n ) {\n initializedExpandRef.current = true;\n\n setExpandedPathsState(getAllExpandedKeys(normalizedTreeData));\n }\n }, [controlled, defaultExpandAll, normalizedTreeData]);\n\n useEffect(() => {\n if (controlled) {\n setExpandedPathsState(expandedPaths);\n }\n }, [controlled, expandedPaths]);\n\n // ====== 加载文件内容 ======\n useEffect(() => {\n const loadContent = async () => {\n if (!validSelectedFile || selectedFileState.length === 0) {\n setFileContent(\"\");\n setLoadingContent(false);\n return;\n }\n\n const filePath = selectedFileState.join(\"/\");\n const segments = filePath.split(\"/\").filter((s) => s !== \"\");\n const { node } = findNodeAndValidate(segments);\n\n if (fileContentService) {\n setLoadingContent(true);\n try {\n const content = await fileContentService.loadFileContent(filePath);\n setFileContent(content);\n } catch (error) {\n setFileContent(\n `// 加载错误: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n );\n } finally {\n setLoadingContent(false);\n }\n } else if (node?.content) {\n setFileContent(node.content);\n setLoadingContent(false);\n } else {\n setFileContent(\"\");\n setLoadingContent(false);\n }\n };\n\n loadContent();\n }, [\n validSelectedFile,\n selectedFileState,\n normalizedTreeData,\n fileContentService,\n findNodeAndValidate,\n ]);\n\n // ====== 事件处理 ======\n const handleSelect: TreeProps[\"onSelect\"] = (_keys, info) => {\n const keys = _keys as string[];\n const nodes = Array.isArray(info.selectedNodes)\n ? info.selectedNodes\n : [info.selectedNodes];\n\n const isFolder = nodes.some((node) => !node.isLeaf);\n if (isFolder) {\n if (nodes.length === 1) {\n const node = nodes[0] as unknown as FolderTreeData;\n onFolderClick?.(node.path, node.extra);\n }\n return;\n }\n\n const pathArray = keys[0]?.split(\"/\").filter(Boolean) || [];\n if (pathArray.length === 0) return;\n\n // 从原始 normalizedTreeData 中查找节点,避免拿到 antd 包装后的 JSX title\n const { node: originalNode } = findNodeAndValidate(pathArray);\n const fileName = originalNode?.title;\n const nodeContent = originalNode?.content;\n\n onSelectedFileChange?.({\n path: pathArray,\n title: fileName,\n content: nodeContent,\n extra: originalNode?.extra,\n });\n\n const isControlled = selectedFile !== undefined;\n if (!isControlled) {\n setValidSelectedFile(true);\n setSelectedFileState(pathArray);\n }\n\n if (originalNode) {\n onFileClick?.(keys[0], originalNode.content, originalNode.extra);\n }\n };\n\n const handleExpand: TreeProps[\"onExpand\"] = (keys) => {\n const newPaths = keys as string[];\n\n if (!controlled) {\n setExpandedPathsState(newPaths);\n }\n\n onExpandedPathsChange?.(newPaths);\n };\n\n // ====== 命令式 API ======\n useImperativeHandle(\n ref,\n () => ({\n createNode: (parentPath, options) => {\n const defaultName =\n options.defaultName ||\n (options.type === \"folder\" ? \"新建文件夹\" : \"新建文件\");\n const tempKey = `__create__${parentPath || \"root\"}__${Date.now()}`;\n\n setCreateContext({\n parentKey: parentPath,\n type: options.type,\n extra: options.extra,\n });\n setEditNode({\n key: tempKey,\n type: options.type || \"folder\",\n originalTitle: \"\",\n currentValue: defaultName,\n mode: \"create\",\n });\n\n // 自动展开父文件夹(仅在受控模式下需要,非受控模式由 defaultExpandAll 处理)\n if (!controlled && parentPath && parentPath !== \"/\") {\n setExpandedPathsState((prev) => {\n const current = prev || [];\n\n if (current.includes(parentPath)) {\n return current;\n }\n\n return [...current, parentPath];\n });\n }\n },\n }),\n [controlled],\n );\n\n return (\n <div\n className={clsx(\n styles.container,\n !showPreview && styles.containerNoPreview,\n className,\n )}\n style={{\n ...style,\n ...(style?.background\n ? ({\n \"--folder-tree-directory-bg\": style.background,\n } as React.CSSProperties)\n : {}),\n ...(style?.backgroundColor\n ? ({\n \"--folder-tree-directory-bg\": style.backgroundColor,\n } as React.CSSProperties)\n : {}),\n }}\n >\n <DirectoryTreeComponent\n treeData={normalizedTreeData}\n directoryIcons={directoryIcons}\n selectedKeys={\n selectable && selectedFileState && validSelectedFile\n ? [selectedFileState.join(\"/\")]\n : []\n }\n expandedKeys={controlled ? expandedPaths : expandedPathsState}\n onSelect={handleSelect}\n onExpand={handleExpand}\n defaultExpandAll={defaultExpandAll}\n directoryTitle={directoryTitle}\n moreActions={moreActions}\n showLine={showLine}\n switcherIcon={switcherIcon}\n width={directoryTreeWidth}\n draggable={draggable}\n editNode={editNode}\n onEditValueChange={handleEditValueChange}\n onEditConfirm={handleEditConfirm}\n onEditCancel={handleEditCancel}\n createInfo={createContext}\n onStartRename={handleStartRename}\n onDrop={onDrop}\n />\n {showPreview && (\n <FilePreview\n selectedFile={validSelectedFile ? selectedFileState : []}\n fileContent={fileContent}\n loading={loadingContent}\n previewTitle={previewTitle}\n previewRender={previewRender}\n emptyRender={emptyRender}\n getFileNode={(path) => {\n if (!path || path.length === 0) return undefined;\n const { node } = findNodeAndValidate(path);\n return node\n ? { title: node.title, path: node.path, content: node.content }\n : undefined;\n }}\n />\n )}\n </div>\n );\n});\n\nFolderTree.displayName = \"FolderTree\";\n\nexport default FolderTree;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useRef","useMemo","useCallback","useEffect","useState","forwardRef","useImperativeHandle","clsx","DirectoryTreeComponent","FilePreview","useStyles","jsx","_jsx","jsxs","_jsxs","getAllExpandedKeys","nodes","parentPath","arguments","length","undefined","keys","forEach","node","_node$children","currentPath","concat","path","children","push","apply","_toConsumableArray","normalizeTreeData","map","_objectSpread","type","FolderTree","props","ref","className","style","treeData","directoryIcons","previewRender","directoryTitle","previewTitle","_props$selectable","selectable","defaultSelectedFile","_props$defaultExpandA","defaultExpandAll","selectedFile","onSelectedFileChange","_props$directoryTreeW","directoryTreeWidth","emptyRender","defaultExpandedPaths","expandedPaths","onExpandedPathsChange","onFileClick","onFolderClick","fileContentService","moreActions","showLine","switcherIcon","_props$showPreview","showPreview","draggable","onDrop","onRename","onCreate","styles","normalizedTreeData","_useState","_useState2","_slicedToArray","editNode","setEditNode","_useState3","_useState4","createContext","setCreateContext","findNodeAndValidate","validateAsFile","isValid","segments","Array","isArray","filter","Boolean","split","findNode","index","currentSegment","_iterator","_createForOfIteratorHelper","_step","s","n","done","value","err","e","f","isValidSelectedFile","filePath","_findNodeAndValidate","key","handleEditValueChange","prev","currentValue","handleEditConfirm","newValue","trim","mode","_findNodeAndValidate2","oldTitle","originalTitle","newTitle","parentKey","name","extra","handleEditCancel","handleStartRename","fullPath","titleStr","title","String","_useState5","_useState6","selectedFileState","setSelectedFileState","controlled","_useState7","_useState8","expandedPathsState","setExpandedPathsState","_useState9","_useState10","validSelectedFile","setValidSelectedFile","_useState11","_useState12","fileContent","setFileContent","_useState13","_useState14","loadingContent","setLoadingContent","initializedExpandRef","current","loadContent","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_findNodeAndValidate3","content","wrap","_callee$","_context","next","abrupt","join","loadFileContent","sent","t0","Error","message","finish","stop","handleSelect","_keys","info","_keys$","selectedNodes","isFolder","some","isLeaf","pathArray","_findNodeAndValidate4","originalNode","fileName","nodeContent","isControlled","handleExpand","newPaths","createNode","options","defaultName","tempKey","Date","now","includes","container","containerNoPreview","background","backgroundColor","selectedKeys","expandedKeys","onSelect","onExpand","width","onEditValueChange","onEditConfirm","onEditCancel","createInfo","onStartRename","loading","getFileNode","_findNodeAndValidate5","displayName"],"sources":["../../../../src/components/FolderTree/index.tsx"],"sourcesContent":["import React, {\n useRef,\n useMemo,\n useCallback,\n useEffect,\n useState,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport type { TreeProps } from \"antd\";\nimport clsx from \"clsx\";\nimport type {\n FolderTreeData,\n FolderTreeProps,\n FolderTreeRef,\n EditNodeInfo,\n CreateNodeContext,\n} from \"./types\";\nimport DirectoryTreeComponent from \"./DirectoryTree\";\nimport FilePreview from \"./FilePreview\";\nimport { useStyles } from \"./styles\";\n\nexport type {\n FolderTreeData,\n FolderTreeProps,\n FileContentService,\n FolderTreeRef,\n} from \"./types\";\n\n// 展开所有节点\nfunction getAllExpandedKeys(\n nodes: FolderTreeData[],\n parentPath = \"\",\n): string[] {\n const keys: string[] = [];\n\n nodes.forEach((node) => {\n const currentPath = parentPath ? `${parentPath}/${node.path}` : node.path;\n\n if (node.children?.length) {\n keys.push(currentPath);\n keys.push(...getAllExpandedKeys(node.children, currentPath));\n }\n });\n\n return keys;\n}\n\n// 格式化数据\nfunction normalizeTreeData(nodes: FolderTreeData[]): FolderTreeData[] {\n return nodes.map((node) => ({\n ...node,\n type: node.type\n ? node.type\n : !!node.children && node.children.length > 0\n ? \"folder\"\n : \"file\",\n children: node.children ? normalizeTreeData(node.children) : undefined,\n }));\n}\n\nconst FolderTree = forwardRef<FolderTreeRef, FolderTreeProps>((props, ref) => {\n const {\n className,\n style,\n treeData,\n directoryIcons,\n previewRender,\n directoryTitle,\n previewTitle,\n selectable = true,\n defaultSelectedFile,\n defaultExpandAll = true,\n selectedFile,\n onSelectedFileChange,\n directoryTreeWidth = 280,\n emptyRender,\n defaultExpandedPaths,\n expandedPaths,\n onExpandedPathsChange,\n onFileClick,\n onFolderClick,\n fileContentService,\n moreActions,\n showLine,\n switcherIcon,\n showPreview = true,\n draggable,\n onDrop,\n onRename,\n onCreate,\n } = props;\n\n const styles = useStyles();\n\n const normalizedTreeData = useMemo(\n () => normalizeTreeData(treeData),\n [treeData],\n );\n\n // ====== 编辑态状态 ======\n const [editNode, setEditNode] = useState<EditNodeInfo | null>(null);\n const [createContext, setCreateContext] = useState<CreateNodeContext | null>(\n null,\n );\n\n // ====== 工具函数 ======\n const findNodeAndValidate = useCallback(\n (\n path: string | string[],\n validateAsFile = false,\n ): { node: FolderTreeData | undefined; isValid: boolean } => {\n if (!path) return { node: undefined, isValid: false };\n const segments = Array.isArray(path)\n ? path.filter(Boolean)\n : path.split(\"/\").filter(Boolean);\n if (segments.length === 0) return { node: undefined, isValid: false };\n\n const findNode = (\n nodes: FolderTreeData[],\n index = 0,\n ): FolderTreeData | undefined => {\n if (index >= segments.length) return undefined;\n const currentSegment = segments[index];\n for (const node of nodes) {\n if (node.path === currentSegment) {\n return index === segments.length - 1\n ? node\n : node.children\n ? findNode(node.children, index + 1)\n : undefined;\n }\n }\n return undefined;\n };\n\n const node = findNode(normalizedTreeData);\n const isValid = validateAsFile\n ? !!node && (!node?.children || node.children.length === 0)\n : !!node;\n return { node, isValid };\n },\n [normalizedTreeData],\n );\n\n const isValidSelectedFile = (filePath?: string[]): boolean =>\n !!(\n filePath &&\n filePath.length > 0 &&\n findNodeAndValidate(filePath, true).isValid\n );\n\n // ====== 编辑态逻辑 ======\n\n // 当 normalizedTreeData 变化时,检查编辑节点是否还存在\n useEffect(() => {\n if (!editNode) return;\n const { node } = findNodeAndValidate(editNode.key);\n if (!node) {\n setEditNode(null);\n setCreateContext(null);\n }\n }, [normalizedTreeData]);\n\n // 编辑值变化\n const handleEditValueChange = useCallback((value: string) => {\n setEditNode((prev) => (prev ? { ...prev, currentValue: value } : null));\n }, []);\n\n // 确认编辑\n const handleEditConfirm = useCallback((value?: string) => {\n if (!editNode) return;\n const newValue = (value ?? editNode.currentValue).trim();\n\n if (editNode.mode === \"rename\") {\n const { node } = findNodeAndValidate(editNode.key);\n onRename?.({\n key: editNode.key,\n oldTitle: editNode.originalTitle,\n newTitle: newValue,\n node: node!,\n });\n } else if (editNode.mode === \"create\" && createContext) {\n onCreate?.({\n parentKey: createContext.parentKey,\n name: newValue,\n type: createContext.type,\n extra: createContext.extra,\n });\n }\n\n setEditNode(null);\n setCreateContext(null);\n }, [editNode, createContext, findNodeAndValidate, onRename, onCreate]);\n\n // 取消编辑\n const handleEditCancel = useCallback(() => {\n setEditNode(null);\n setCreateContext(null);\n }, []);\n\n // 开始重命名\n const handleStartRename = useCallback(\n (fullPath: string, node: FolderTreeData) => {\n const titleStr =\n typeof node.title === \"string\" ? node.title : String(node.path);\n setCreateContext(null);\n setEditNode({\n key: fullPath,\n type: node.type || \"file\",\n originalTitle: titleStr,\n currentValue: titleStr,\n mode: \"rename\",\n });\n },\n [],\n );\n\n // ====== State ======\n const [selectedFileState, setSelectedFileState] = useState<string[]>(() =>\n isValidSelectedFile(selectedFile || defaultSelectedFile)\n ? selectedFile || defaultSelectedFile || []\n : [],\n );\n const controlled = expandedPaths !== undefined;\n\n const [expandedPathsState, setExpandedPathsState] = useState<string[]>(\n defaultExpandedPaths || [],\n );\n const [validSelectedFile, setValidSelectedFile] = useState<boolean>(\n isValidSelectedFile(selectedFile || defaultSelectedFile),\n );\n const [fileContent, setFileContent] = useState<string>(\"\");\n const [loadingContent, setLoadingContent] = useState<boolean>(false);\n const initializedExpandRef = useRef(false);\n\n // 受控模式同步\n useEffect(() => {\n if (selectedFile !== undefined) {\n setSelectedFileState(selectedFile);\n setValidSelectedFile(isValidSelectedFile(selectedFile));\n }\n }, [selectedFile, isValidSelectedFile]);\n\n useEffect(() => {\n if (\n !controlled &&\n defaultExpandAll &&\n !initializedExpandRef.current &&\n normalizedTreeData.length > 0\n ) {\n initializedExpandRef.current = true;\n\n setExpandedPathsState(getAllExpandedKeys(normalizedTreeData));\n }\n }, [controlled, defaultExpandAll, normalizedTreeData]);\n\n useEffect(() => {\n if (controlled) {\n setExpandedPathsState(expandedPaths);\n }\n }, [controlled, expandedPaths]);\n\n // ====== 加载文件内容 ======\n useEffect(() => {\n const loadContent = async () => {\n if (!validSelectedFile || selectedFileState.length === 0) {\n setFileContent(\"\");\n setLoadingContent(false);\n return;\n }\n\n const filePath = selectedFileState.join(\"/\");\n const segments = filePath.split(\"/\").filter((s) => s !== \"\");\n const { node } = findNodeAndValidate(segments);\n\n if (fileContentService) {\n setLoadingContent(true);\n try {\n const content = await fileContentService.loadFileContent(filePath);\n setFileContent(content);\n } catch (error) {\n setFileContent(\n `// 加载错误: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n );\n } finally {\n setLoadingContent(false);\n }\n } else if (node?.content) {\n setFileContent(node.content);\n setLoadingContent(false);\n } else {\n setFileContent(\"\");\n setLoadingContent(false);\n }\n };\n\n loadContent();\n }, [\n validSelectedFile,\n selectedFileState,\n normalizedTreeData,\n fileContentService,\n findNodeAndValidate,\n ]);\n\n // ====== 事件处理 ======\n const handleSelect: TreeProps[\"onSelect\"] = (_keys, info) => {\n const keys = _keys as string[];\n const nodes = Array.isArray(info.selectedNodes)\n ? info.selectedNodes\n : [info.selectedNodes];\n\n const isFolder = nodes.some((node) => !node.isLeaf);\n if (isFolder) {\n if (nodes.length === 1) {\n const node = nodes[0] as unknown as FolderTreeData;\n onFolderClick?.(node.path, node.extra);\n }\n return;\n }\n\n const pathArray = keys[0]?.split(\"/\").filter(Boolean) || [];\n if (pathArray.length === 0) return;\n\n // 从原始 normalizedTreeData 中查找节点,避免拿到 antd 包装后的 JSX title\n const { node: originalNode } = findNodeAndValidate(pathArray);\n const fileName = originalNode?.title;\n const nodeContent = originalNode?.content;\n\n onSelectedFileChange?.({\n path: pathArray,\n title: fileName,\n content: nodeContent,\n extra: originalNode?.extra,\n });\n\n const isControlled = selectedFile !== undefined;\n if (!isControlled) {\n setValidSelectedFile(true);\n setSelectedFileState(pathArray);\n }\n\n if (originalNode) {\n onFileClick?.(keys[0], originalNode.content, originalNode.extra);\n }\n };\n\n const handleExpand: TreeProps[\"onExpand\"] = (keys) => {\n const newPaths = keys as string[];\n\n if (!controlled) {\n setExpandedPathsState(newPaths);\n }\n\n onExpandedPathsChange?.(newPaths);\n };\n\n // ====== 命令式 API ======\n useImperativeHandle(\n ref,\n () => ({\n createNode: (parentPath, options) => {\n const defaultName =\n options.defaultName ||\n (options.type === \"folder\" ? \"新建文件夹\" : \"新建文件\");\n const tempKey = `__create__${parentPath || \"root\"}__${Date.now()}`;\n\n setCreateContext({\n parentKey: parentPath,\n type: options.type,\n extra: options.extra,\n });\n setEditNode({\n key: tempKey,\n type: options.type || \"folder\",\n originalTitle: \"\",\n currentValue: defaultName,\n mode: \"create\",\n });\n\n // 自动展开父文件夹(仅在受控模式下需要,非受控模式由 defaultExpandAll 处理)\n if (!controlled && parentPath && parentPath !== \"/\") {\n setExpandedPathsState((prev) => {\n const current = prev || [];\n\n if (current.includes(parentPath)) {\n return current;\n }\n\n return [...current, parentPath];\n });\n }\n },\n }),\n [controlled],\n );\n\n return (\n <div\n className={clsx(\n styles.container,\n !showPreview && styles.containerNoPreview,\n className,\n )}\n style={{\n ...style,\n ...(style?.background\n ? ({\n \"--folder-tree-directory-bg\": style.background,\n } as React.CSSProperties)\n : {}),\n ...(style?.backgroundColor\n ? ({\n \"--folder-tree-directory-bg\": style.backgroundColor,\n } as React.CSSProperties)\n : {}),\n }}\n >\n <DirectoryTreeComponent\n treeData={normalizedTreeData}\n directoryIcons={directoryIcons}\n selectedKeys={\n selectable && selectedFileState && validSelectedFile\n ? [selectedFileState.join(\"/\")]\n : []\n }\n expandedKeys={controlled ? expandedPaths : expandedPathsState}\n onSelect={handleSelect}\n onExpand={handleExpand}\n defaultExpandAll={defaultExpandAll}\n directoryTitle={directoryTitle}\n moreActions={moreActions}\n showLine={showLine}\n switcherIcon={switcherIcon}\n width={directoryTreeWidth}\n draggable={draggable}\n editNode={editNode}\n onEditValueChange={handleEditValueChange}\n onEditConfirm={handleEditConfirm}\n onEditCancel={handleEditCancel}\n createInfo={createContext}\n onStartRename={handleStartRename}\n onDrop={onDrop}\n />\n {showPreview && (\n <FilePreview\n selectedFile={validSelectedFile ? selectedFileState : []}\n fileContent={fileContent}\n loading={loadingContent}\n previewTitle={previewTitle}\n previewRender={previewRender}\n emptyRender={emptyRender}\n getFileNode={(path) => {\n if (!path || path.length === 0) return undefined;\n const { node } = findNodeAndValidate(path);\n return node\n ? { title: node.title, path: node.path, content: node.content }\n : undefined;\n }}\n />\n )}\n </div>\n );\n});\n\nFolderTree.displayName = \"FolderTree\";\n\nexport default FolderTree;\n"],"mappings":"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"}