@ai-group/chat-sdk 3.5.9 → 3.5.10

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.
@@ -38,6 +38,18 @@ var import_DirectoryTree = __toESM(require("./DirectoryTree"));
38
38
  var import_FilePreview = __toESM(require("./FilePreview"));
39
39
  var import_styles = require("./styles");
40
40
  var import_jsx_runtime = require("react/jsx-runtime");
41
+ function getAllExpandedKeys(nodes, parentPath = "") {
42
+ const keys = [];
43
+ nodes.forEach((node) => {
44
+ var _a;
45
+ const currentPath = parentPath ? `${parentPath}/${node.path}` : node.path;
46
+ if ((_a = node.children) == null ? void 0 : _a.length) {
47
+ keys.push(currentPath);
48
+ keys.push(...getAllExpandedKeys(node.children, currentPath));
49
+ }
50
+ });
51
+ return keys;
52
+ }
41
53
  var FolderTree = (0, import_react.forwardRef)((props, ref) => {
42
54
  const {
43
55
  className,
@@ -154,25 +166,33 @@ var FolderTree = (0, import_react.forwardRef)((props, ref) => {
154
166
  const [selectedFileState, setSelectedFileState] = (0, import_react.useState)(
155
167
  () => isValidSelectedFile(selectedFile || defaultSelectedFile) ? selectedFile || defaultSelectedFile || [] : []
156
168
  );
157
- const [expandedPathsState, setExpandedPaths] = (0, import_react.useState)(
158
- expandedPaths || defaultExpandedPaths
169
+ const controlled = expandedPaths !== void 0;
170
+ const [expandedPathsState, setExpandedPathsState] = (0, import_react.useState)(
171
+ defaultExpandedPaths || []
159
172
  );
160
173
  const [validSelectedFile, setValidSelectedFile] = (0, import_react.useState)(
161
174
  isValidSelectedFile(selectedFile || defaultSelectedFile)
162
175
  );
163
176
  const [fileContent, setFileContent] = (0, import_react.useState)("");
164
177
  const [loadingContent, setLoadingContent] = (0, import_react.useState)(false);
178
+ const initializedExpandRef = (0, import_react.useRef)(false);
165
179
  (0, import_react.useEffect)(() => {
166
180
  if (selectedFile !== void 0) {
167
181
  setSelectedFileState(selectedFile);
168
182
  setValidSelectedFile(isValidSelectedFile(selectedFile));
169
183
  }
170
- }, [selectedFile, treeData]);
184
+ }, [selectedFile, isValidSelectedFile]);
185
+ (0, import_react.useEffect)(() => {
186
+ if (!controlled && defaultExpandAll && !initializedExpandRef.current && treeData.length > 0) {
187
+ initializedExpandRef.current = true;
188
+ setExpandedPathsState(getAllExpandedKeys(treeData));
189
+ }
190
+ }, [controlled, defaultExpandAll, treeData]);
171
191
  (0, import_react.useEffect)(() => {
172
- if (expandedPaths !== void 0) {
173
- setExpandedPaths(expandedPaths);
192
+ if (controlled) {
193
+ setExpandedPathsState(expandedPaths);
174
194
  }
175
- }, [expandedPaths]);
195
+ }, [controlled, expandedPaths]);
176
196
  (0, import_react.useEffect)(() => {
177
197
  const loadContent = async () => {
178
198
  if (!validSelectedFile || selectedFileState.length === 0) {
@@ -241,18 +261,13 @@ var FolderTree = (0, import_react.forwardRef)((props, ref) => {
241
261
  setSelectedFileState(pathArray);
242
262
  }
243
263
  if (originalNode) {
244
- onFileClick == null ? void 0 : onFileClick(
245
- keys[0],
246
- originalNode.content,
247
- originalNode.extra
248
- );
264
+ onFileClick == null ? void 0 : onFileClick(keys[0], originalNode.content, originalNode.extra);
249
265
  }
250
266
  };
251
- const isExpandedControlled = expandedPaths !== void 0;
252
267
  const handleExpand = (keys) => {
253
268
  const newPaths = keys;
254
- if (isExpandedControlled) {
255
- setExpandedPaths(newPaths);
269
+ if (!controlled) {
270
+ setExpandedPathsState(newPaths);
256
271
  }
257
272
  onExpandedPathsChange == null ? void 0 : onExpandedPathsChange(newPaths);
258
273
  };
@@ -273,17 +288,18 @@ var FolderTree = (0, import_react.forwardRef)((props, ref) => {
273
288
  currentValue: defaultName,
274
289
  mode: "create"
275
290
  });
276
- if (isExpandedControlled && parentPath && parentPath !== "/") {
277
- setExpandedPaths((prev) => {
291
+ if (!controlled && parentPath && parentPath !== "/") {
292
+ setExpandedPathsState((prev) => {
278
293
  const current = prev || [];
279
- if (current.includes(parentPath))
294
+ if (current.includes(parentPath)) {
280
295
  return current;
296
+ }
281
297
  return [...current, parentPath];
282
298
  });
283
299
  }
284
300
  }
285
301
  }),
286
- []
302
+ [controlled]
287
303
  );
288
304
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
289
305
  "div",
@@ -309,7 +325,7 @@ var FolderTree = (0, import_react.forwardRef)((props, ref) => {
309
325
  treeData,
310
326
  directoryIcons,
311
327
  selectedKeys: selectable && selectedFileState && validSelectedFile ? [selectedFileState.join("/")] : [],
312
- expandedKeys: isExpandedControlled ? expandedPathsState : void 0,
328
+ expandedKeys: controlled ? expandedPaths : expandedPathsState,
313
329
  onSelect: handleSelect,
314
330
  onExpand: handleExpand,
315
331
  defaultExpandAll,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/FolderTree/index.tsx"],
4
- "sourcesContent": ["import React, {\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\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 // ====== 编辑态状态 ======\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(treeData);\n const isValid = validateAsFile\n ? !!node && (!node?.children || node.children.length === 0)\n : !!node;\n return { node, isValid };\n },\n [treeData],\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 // 当 treeData 变化时,检查编辑节点是否还存在\n useEffect(() => {\n if (!editNode) return;\n const { node } = findNodeAndValidate(editNode.key);\n if (!node) {\n setEditNode(null);\n setCreateContext(null);\n }\n }, [treeData]);\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 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 [expandedPathsState, setExpandedPaths] = useState<string[] | undefined>(\n expandedPaths || 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\n // 受控模式同步\n useEffect(() => {\n if (selectedFile !== undefined) {\n setSelectedFileState(selectedFile);\n setValidSelectedFile(isValidSelectedFile(selectedFile));\n }\n }, [selectedFile, treeData]);\n\n useEffect(() => {\n if (expandedPaths !== undefined) {\n setExpandedPaths(expandedPaths);\n }\n }, [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 treeData,\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 // 从原始 treeData 中查找节点,避免拿到 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?.(\n keys[0],\n originalNode.content,\n originalNode.extra,\n );\n }\n };\n\n const isExpandedControlled = expandedPaths !== undefined;\n\n const handleExpand: TreeProps[\"onExpand\"] = (keys) => {\n const newPaths = keys as string[];\n if (isExpandedControlled) {\n setExpandedPaths(newPaths);\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 originalTitle: \"\",\n currentValue: defaultName,\n mode: \"create\",\n });\n\n // 自动展开父文件夹(仅在受控模式下需要,非受控模式由 defaultExpandAll 处理)\n if (isExpandedControlled && parentPath && parentPath !== \"/\") {\n setExpandedPaths((prev) => {\n const current = prev || [];\n if (current.includes(parentPath)) return current;\n return [...current, parentPath];\n });\n }\n },\n }),\n []\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={treeData}\n directoryIcons={directoryIcons}\n selectedKeys={\n selectable && selectedFileState && validSelectedFile\n ? [selectedFileState.join(\"/\")]\n : []\n }\n expandedKeys={isExpandedControlled ? expandedPathsState : undefined}\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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React, {\n useRef,\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\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\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 // ====== 编辑态状态 ======\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(treeData);\n const isValid = validateAsFile\n ? !!node && (!node?.children || node.children.length === 0)\n : !!node;\n return { node, isValid };\n },\n [treeData],\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 // 当 treeData 变化时,检查编辑节点是否还存在\n useEffect(() => {\n if (!editNode) return;\n const { node } = findNodeAndValidate(editNode.key);\n if (!node) {\n setEditNode(null);\n setCreateContext(null);\n }\n }, [treeData]);\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 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 treeData.length > 0\n ) {\n initializedExpandRef.current = true;\n\n setExpandedPathsState(getAllExpandedKeys(treeData));\n }\n }, [controlled, defaultExpandAll, treeData]);\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 treeData,\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 // 从原始 treeData 中查找节点,避免拿到 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 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={treeData}\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"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAOO;AAEP,kBAAiB;AAQjB,2BAAmC;AACnC,yBAAwB;AACxB,oBAA0B;AAwWtB;AA/VJ,SAAS,mBACP,OACA,aAAa,IACH;AACV,QAAM,OAAiB,CAAC;AAExB,QAAM,QAAQ,CAAC,SAAS;AAlC1B;AAmCI,UAAM,cAAc,aAAa,GAAG,cAAc,KAAK,SAAS,KAAK;AAErE,SAAI,UAAK,aAAL,mBAAe,QAAQ;AACzB,WAAK,KAAK,WAAW;AACrB,WAAK,KAAK,GAAG,mBAAmB,KAAK,UAAU,WAAW,CAAC;AAAA,IAC7D;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,IAAM,iBAAa,yBAA2C,CAAC,OAAO,QAAQ;AAC5E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,aAAS,yBAAU;AAGzB,QAAM,CAAC,UAAU,WAAW,QAAI,uBAA8B,IAAI;AAClE,QAAM,CAAC,eAAe,gBAAgB,QAAI;AAAA,IACxC;AAAA,EACF;AAGA,QAAM,0BAAsB;AAAA,IAC1B,CACE,MACA,iBAAiB,UAC0C;AAC3D,UAAI,CAAC;AAAM,eAAO,EAAE,MAAM,QAAW,SAAS,MAAM;AACpD,YAAM,WAAW,MAAM,QAAQ,IAAI,IAC/B,KAAK,OAAO,OAAO,IACnB,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAClC,UAAI,SAAS,WAAW;AAAG,eAAO,EAAE,MAAM,QAAW,SAAS,MAAM;AAEpE,YAAM,WAAW,CACf,OACA,QAAQ,MACuB;AAC/B,YAAI,SAAS,SAAS;AAAQ,iBAAO;AACrC,cAAM,iBAAiB,SAAS,KAAK;AACrC,mBAAWA,SAAQ,OAAO;AACxB,cAAIA,MAAK,SAAS,gBAAgB;AAChC,mBAAO,UAAU,SAAS,SAAS,IAC/BA,QACAA,MAAK,WACH,SAASA,MAAK,UAAU,QAAQ,CAAC,IACjC;AAAA,UACR;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAEA,YAAM,OAAO,SAAS,QAAQ;AAC9B,YAAM,UAAU,iBACZ,CAAC,CAAC,SAAS,EAAC,6BAAM,aAAY,KAAK,SAAS,WAAW,KACvD,CAAC,CAAC;AACN,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,sBAAsB,CAAC,aAC3B,CAAC,EACC,YACA,SAAS,SAAS,KAClB,oBAAoB,UAAU,IAAI,EAAE;AAMxC,8BAAU,MAAM;AACd,QAAI,CAAC;AAAU;AACf,UAAM,EAAE,KAAK,IAAI,oBAAoB,SAAS,GAAG;AACjD,QAAI,CAAC,MAAM;AACT,kBAAY,IAAI;AAChB,uBAAiB,IAAI;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,4BAAwB,0BAAY,CAAC,UAAkB;AAC3D,gBAAY,CAAC,SAAU,OAAO,EAAE,GAAG,MAAM,cAAc,MAAM,IAAI,IAAK;AAAA,EACxE,GAAG,CAAC,CAAC;AAGL,QAAM,wBAAoB,0BAAY,MAAM;AAC1C,QAAI,CAAC;AAAU;AACf,UAAM,WAAW,SAAS,aAAa,KAAK;AAE5C,QAAI,SAAS,SAAS,UAAU;AAC9B,YAAM,EAAE,KAAK,IAAI,oBAAoB,SAAS,GAAG;AACjD,2CAAW;AAAA,QACT,KAAK,SAAS;AAAA,QACd,UAAU,SAAS;AAAA,QACnB,UAAU;AAAA,QACV;AAAA,MACF;AAAA,IACF,WAAW,SAAS,SAAS,YAAY,eAAe;AACtD,2CAAW;AAAA,QACT,WAAW,cAAc;AAAA,QACzB,MAAM;AAAA,QACN,MAAM,cAAc;AAAA,QACpB,OAAO,cAAc;AAAA,MACvB;AAAA,IACF;AAEA,gBAAY,IAAI;AAChB,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,UAAU,eAAe,qBAAqB,UAAU,QAAQ,CAAC;AAGrE,QAAM,uBAAmB,0BAAY,MAAM;AACzC,gBAAY,IAAI;AAChB,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,CAAC;AAGL,QAAM,wBAAoB;AAAA,IACxB,CAAC,UAAkB,SAAyB;AAC1C,YAAM,WACJ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,OAAO,KAAK,IAAI;AAChE,uBAAiB,IAAI;AACrB,kBAAY;AAAA,QACV,KAAK;AAAA,QACL,eAAe;AAAA,QACf,cAAc;AAAA,QACd,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAGA,QAAM,CAAC,mBAAmB,oBAAoB,QAAI;AAAA,IAAmB,MACnE,oBAAoB,gBAAgB,mBAAmB,IACnD,gBAAgB,uBAAuB,CAAC,IACxC,CAAC;AAAA,EACP;AACA,QAAM,aAAa,kBAAkB;AAErC,QAAM,CAAC,oBAAoB,qBAAqB,QAAI;AAAA,IAClD,wBAAwB,CAAC;AAAA,EAC3B;AACA,QAAM,CAAC,mBAAmB,oBAAoB,QAAI;AAAA,IAChD,oBAAoB,gBAAgB,mBAAmB;AAAA,EACzD;AACA,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAiB,EAAE;AACzD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,uBAAkB,KAAK;AACnE,QAAM,2BAAuB,qBAAO,KAAK;AAGzC,8BAAU,MAAM;AACd,QAAI,iBAAiB,QAAW;AAC9B,2BAAqB,YAAY;AACjC,2BAAqB,oBAAoB,YAAY,CAAC;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,cAAc,mBAAmB,CAAC;AAEtC,8BAAU,MAAM;AACd,QACE,CAAC,cACD,oBACA,CAAC,qBAAqB,WACtB,SAAS,SAAS,GAClB;AACA,2BAAqB,UAAU;AAE/B,4BAAsB,mBAAmB,QAAQ,CAAC;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,YAAY,kBAAkB,QAAQ,CAAC;AAE3C,8BAAU,MAAM;AACd,QAAI,YAAY;AACd,4BAAsB,aAAa;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,YAAY,aAAa,CAAC;AAG9B,8BAAU,MAAM;AACd,UAAM,cAAc,YAAY;AAC9B,UAAI,CAAC,qBAAqB,kBAAkB,WAAW,GAAG;AACxD,uBAAe,EAAE;AACjB,0BAAkB,KAAK;AACvB;AAAA,MACF;AAEA,YAAM,WAAW,kBAAkB,KAAK,GAAG;AAC3C,YAAM,WAAW,SAAS,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE;AAC3D,YAAM,EAAE,KAAK,IAAI,oBAAoB,QAAQ;AAE7C,UAAI,oBAAoB;AACtB,0BAAkB,IAAI;AACtB,YAAI;AACF,gBAAM,UAAU,MAAM,mBAAmB,gBAAgB,QAAQ;AACjE,yBAAe,OAAO;AAAA,QACxB,SAAS,OAAP;AACA;AAAA,YACE,YACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UAE7C;AAAA,QACF,UAAE;AACA,4BAAkB,KAAK;AAAA,QACzB;AAAA,MACF,WAAW,6BAAM,SAAS;AACxB,uBAAe,KAAK,OAAO;AAC3B,0BAAkB,KAAK;AAAA,MACzB,OAAO;AACL,uBAAe,EAAE;AACjB,0BAAkB,KAAK;AAAA,MACzB;AAAA,IACF;AAEA,gBAAY;AAAA,EACd,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,eAAsC,CAAC,OAAO,SAAS;AAhS/D;AAiSI,UAAM,OAAO;AACb,UAAM,QAAQ,MAAM,QAAQ,KAAK,aAAa,IAC1C,KAAK,gBACL,CAAC,KAAK,aAAa;AAEvB,UAAM,WAAW,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,MAAM;AAClD,QAAI,UAAU;AACZ,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,OAAO,MAAM,CAAC;AACpB,uDAAgB,KAAK,MAAM,KAAK;AAAA,MAClC;AACA;AAAA,IACF;AAEA,UAAM,cAAY,UAAK,CAAC,MAAN,mBAAS,MAAM,KAAK,OAAO,aAAY,CAAC;AAC1D,QAAI,UAAU,WAAW;AAAG;AAG5B,UAAM,EAAE,MAAM,aAAa,IAAI,oBAAoB,SAAS;AAC5D,UAAM,WAAW,6CAAc;AAC/B,UAAM,cAAc,6CAAc;AAElC,iEAAuB;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,OAAO,6CAAc;AAAA,IACvB;AAEA,UAAM,eAAe,iBAAiB;AACtC,QAAI,CAAC,cAAc;AACjB,2BAAqB,IAAI;AACzB,2BAAqB,SAAS;AAAA,IAChC;AAEA,QAAI,cAAc;AAChB,iDAAc,KAAK,CAAC,GAAG,aAAa,SAAS,aAAa;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,eAAsC,CAAC,SAAS;AACpD,UAAM,WAAW;AAEjB,QAAI,CAAC,YAAY;AACf,4BAAsB,QAAQ;AAAA,IAChC;AAEA,mEAAwB;AAAA,EAC1B;AAGA;AAAA,IACE;AAAA,IACA,OAAO;AAAA,MACL,YAAY,CAAC,YAAY,YAAY;AACnC,cAAM,cACJ,QAAQ,gBACP,QAAQ,SAAS,WAAW,UAAU;AACzC,cAAM,UAAU,aAAa,cAAc,WAAW,KAAK,IAAI;AAE/D,yBAAiB;AAAA,UACf,WAAW;AAAA,UACX,MAAM,QAAQ;AAAA,UACd,OAAO,QAAQ;AAAA,QACjB,CAAC;AACD,oBAAY;AAAA,UACV,KAAK;AAAA,UACL,eAAe;AAAA,UACf,cAAc;AAAA,UACd,MAAM;AAAA,QACR,CAAC;AAGD,YAAI,CAAC,cAAc,cAAc,eAAe,KAAK;AACnD,gCAAsB,CAAC,SAAS;AAC9B,kBAAM,UAAU,QAAQ,CAAC;AAEzB,gBAAI,QAAQ,SAAS,UAAU,GAAG;AAChC,qBAAO;AAAA,YACT;AAEA,mBAAO,CAAC,GAAG,SAAS,UAAU;AAAA,UAChC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,YAAAC;AAAA,QACT,OAAO;AAAA,QACP,CAAC,eAAe,OAAO;AAAA,QACvB;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH,IAAI,+BAAO,cACN;AAAA,UACC,8BAA8B,MAAM;AAAA,QACtC,IACA,CAAC;AAAA,QACL,IAAI,+BAAO,mBACN;AAAA,UACC,8BAA8B,MAAM;AAAA,QACtC,IACA,CAAC;AAAA,MACP;AAAA,MAEA;AAAA;AAAA,UAAC,qBAAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,cACE,cAAc,qBAAqB,oBAC/B,CAAC,kBAAkB,KAAK,GAAG,CAAC,IAC5B,CAAC;AAAA,YAEP,cAAc,aAAa,gBAAgB;AAAA,YAC3C,UAAU;AAAA,YACV,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA,mBAAmB;AAAA,YACnB,eAAe;AAAA,YACf,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,eAAe;AAAA,YACf;AAAA;AAAA,QACF;AAAA,QACC,eACC;AAAA,UAAC,mBAAAC;AAAA,UAAA;AAAA,YACC,cAAc,oBAAoB,oBAAoB,CAAC;AAAA,YACvD;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAa,CAAC,SAAS;AACrB,kBAAI,CAAC,QAAQ,KAAK,WAAW;AAAG,uBAAO;AACvC,oBAAM,EAAE,KAAK,IAAI,oBAAoB,IAAI;AACzC,qBAAO,OACH,EAAE,OAAO,KAAK,OAAO,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ,IAC5D;AAAA,YACN;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,WAAW,cAAc;AAEzB,IAAO,qBAAQ;",
6
6
  "names": ["node", "clsx", "DirectoryTreeComponent", "FilePreview"]
7
7
  }
@@ -1,16 +1,29 @@
1
- import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
1
  import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
3
2
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
3
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
5
4
  import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
6
5
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
7
- import React, { useCallback, useEffect, useState, forwardRef, useImperativeHandle } from "react";
6
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
7
+ import React, { useRef, useCallback, useEffect, useState, forwardRef, useImperativeHandle } from "react";
8
8
  import clsx from "clsx";
9
9
  import DirectoryTreeComponent from "./DirectoryTree";
10
10
  import FilePreview from "./FilePreview";
11
11
  import { useStyles } from "./styles";
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
13
  import { jsxs as _jsxs } from "react/jsx-runtime";
14
+ function getAllExpandedKeys(nodes) {
15
+ var parentPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
16
+ var keys = [];
17
+ nodes.forEach(function (node) {
18
+ var _node$children;
19
+ var currentPath = parentPath ? "".concat(parentPath, "/").concat(node.path) : node.path;
20
+ if ((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length) {
21
+ keys.push(currentPath);
22
+ keys.push.apply(keys, _toConsumableArray(getAllExpandedKeys(node.children, currentPath)));
23
+ }
24
+ });
25
+ return keys;
26
+ }
14
27
  var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
15
28
  var className = props.className,
16
29
  style = props.style,
@@ -171,10 +184,11 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
171
184
  _useState6 = _slicedToArray(_useState5, 2),
172
185
  selectedFileState = _useState6[0],
173
186
  setSelectedFileState = _useState6[1];
174
- var _useState7 = useState(expandedPaths || defaultExpandedPaths),
187
+ var controlled = expandedPaths !== undefined;
188
+ var _useState7 = useState(defaultExpandedPaths || []),
175
189
  _useState8 = _slicedToArray(_useState7, 2),
176
190
  expandedPathsState = _useState8[0],
177
- setExpandedPaths = _useState8[1];
191
+ setExpandedPathsState = _useState8[1];
178
192
  var _useState9 = useState(isValidSelectedFile(selectedFile || defaultSelectedFile)),
179
193
  _useState10 = _slicedToArray(_useState9, 2),
180
194
  validSelectedFile = _useState10[0],
@@ -187,6 +201,7 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
187
201
  _useState14 = _slicedToArray(_useState13, 2),
188
202
  loadingContent = _useState14[0],
189
203
  setLoadingContent = _useState14[1];
204
+ var initializedExpandRef = useRef(false);
190
205
 
191
206
  // 受控模式同步
192
207
  useEffect(function () {
@@ -194,12 +209,18 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
194
209
  setSelectedFileState(selectedFile);
195
210
  setValidSelectedFile(isValidSelectedFile(selectedFile));
196
211
  }
197
- }, [selectedFile, treeData]);
212
+ }, [selectedFile, isValidSelectedFile]);
198
213
  useEffect(function () {
199
- if (expandedPaths !== undefined) {
200
- setExpandedPaths(expandedPaths);
214
+ if (!controlled && defaultExpandAll && !initializedExpandRef.current && treeData.length > 0) {
215
+ initializedExpandRef.current = true;
216
+ setExpandedPathsState(getAllExpandedKeys(treeData));
201
217
  }
202
- }, [expandedPaths]);
218
+ }, [controlled, defaultExpandAll, treeData]);
219
+ useEffect(function () {
220
+ if (controlled) {
221
+ setExpandedPathsState(expandedPaths);
222
+ }
223
+ }, [controlled, expandedPaths]);
203
224
 
204
225
  // ====== 加载文件内容 ======
205
226
  useEffect(function () {
@@ -305,11 +326,10 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
305
326
  onFileClick === null || onFileClick === void 0 || onFileClick(keys[0], originalNode.content, originalNode.extra);
306
327
  }
307
328
  };
308
- var isExpandedControlled = expandedPaths !== undefined;
309
329
  var handleExpand = function handleExpand(keys) {
310
330
  var newPaths = keys;
311
- if (isExpandedControlled) {
312
- setExpandedPaths(newPaths);
331
+ if (!controlled) {
332
+ setExpandedPathsState(newPaths);
313
333
  }
314
334
  onExpandedPathsChange === null || onExpandedPathsChange === void 0 || onExpandedPathsChange(newPaths);
315
335
  };
@@ -333,16 +353,18 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
333
353
  });
334
354
 
335
355
  // 自动展开父文件夹(仅在受控模式下需要,非受控模式由 defaultExpandAll 处理)
336
- if (isExpandedControlled && parentPath && parentPath !== "/") {
337
- setExpandedPaths(function (prev) {
356
+ if (!controlled && parentPath && parentPath !== "/") {
357
+ setExpandedPathsState(function (prev) {
338
358
  var current = prev || [];
339
- if (current.includes(parentPath)) return current;
359
+ if (current.includes(parentPath)) {
360
+ return current;
361
+ }
340
362
  return [].concat(_toConsumableArray(current), [parentPath]);
341
363
  });
342
364
  }
343
365
  }
344
366
  };
345
- }, []);
367
+ }, [controlled]);
346
368
  return /*#__PURE__*/_jsxs("div", {
347
369
  className: clsx(styles.container, !showPreview && styles.containerNoPreview, className),
348
370
  style: _objectSpread(_objectSpread(_objectSpread({}, style), style !== null && style !== void 0 && style.background ? {
@@ -354,7 +376,7 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
354
376
  treeData: treeData,
355
377
  directoryIcons: directoryIcons,
356
378
  selectedKeys: selectable && selectedFileState && validSelectedFile ? [selectedFileState.join("/")] : [],
357
- expandedKeys: isExpandedControlled ? expandedPathsState : undefined,
379
+ expandedKeys: controlled ? expandedPaths : expandedPathsState,
358
380
  onSelect: handleSelect,
359
381
  onExpand: handleExpand,
360
382
  defaultExpandAll: defaultExpandAll,
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useEffect","useState","forwardRef","useImperativeHandle","clsx","DirectoryTreeComponent","FilePreview","useStyles","jsx","_jsx","jsxs","_jsxs","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","_useState","_useState2","_slicedToArray","editNode","setEditNode","_useState3","_useState4","createContext","setCreateContext","findNodeAndValidate","path","validateAsFile","arguments","length","undefined","node","isValid","segments","Array","isArray","filter","Boolean","split","findNode","nodes","index","currentSegment","_iterator","_createForOfIteratorHelper","_step","s","n","done","value","children","err","e","f","isValidSelectedFile","filePath","_findNodeAndValidate","key","handleEditValueChange","prev","_objectSpread","currentValue","handleEditConfirm","newValue","trim","mode","_findNodeAndValidate2","oldTitle","originalTitle","newTitle","parentKey","name","type","extra","handleEditCancel","handleStartRename","fullPath","titleStr","title","String","_useState5","_useState6","selectedFileState","setSelectedFileState","_useState7","_useState8","expandedPathsState","setExpandedPaths","_useState9","_useState10","validSelectedFile","setValidSelectedFile","_useState11","_useState12","fileContent","setFileContent","_useState13","_useState14","loadingContent","setLoadingContent","loadContent","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_findNodeAndValidate3","content","wrap","_callee$","_context","next","abrupt","join","loadFileContent","sent","t0","concat","Error","message","finish","stop","apply","handleSelect","_keys","info","_keys$","keys","selectedNodes","isFolder","some","isLeaf","pathArray","_findNodeAndValidate4","originalNode","fileName","nodeContent","isControlled","isExpandedControlled","handleExpand","newPaths","createNode","parentPath","options","defaultName","tempKey","Date","now","current","includes","_toConsumableArray","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 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\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 // ====== 编辑态状态 ======\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(treeData);\n const isValid = validateAsFile\n ? !!node && (!node?.children || node.children.length === 0)\n : !!node;\n return { node, isValid };\n },\n [treeData],\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 // 当 treeData 变化时,检查编辑节点是否还存在\n useEffect(() => {\n if (!editNode) return;\n const { node } = findNodeAndValidate(editNode.key);\n if (!node) {\n setEditNode(null);\n setCreateContext(null);\n }\n }, [treeData]);\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 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 [expandedPathsState, setExpandedPaths] = useState<string[] | undefined>(\n expandedPaths || 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\n // 受控模式同步\n useEffect(() => {\n if (selectedFile !== undefined) {\n setSelectedFileState(selectedFile);\n setValidSelectedFile(isValidSelectedFile(selectedFile));\n }\n }, [selectedFile, treeData]);\n\n useEffect(() => {\n if (expandedPaths !== undefined) {\n setExpandedPaths(expandedPaths);\n }\n }, [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 treeData,\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 // 从原始 treeData 中查找节点,避免拿到 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?.(\n keys[0],\n originalNode.content,\n originalNode.extra,\n );\n }\n };\n\n const isExpandedControlled = expandedPaths !== undefined;\n\n const handleExpand: TreeProps[\"onExpand\"] = (keys) => {\n const newPaths = keys as string[];\n if (isExpandedControlled) {\n setExpandedPaths(newPaths);\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 originalTitle: \"\",\n currentValue: defaultName,\n mode: \"create\",\n });\n\n // 自动展开父文件夹(仅在受控模式下需要,非受控模式由 defaultExpandAll 处理)\n if (isExpandedControlled && parentPath && parentPath !== \"/\") {\n setExpandedPaths((prev) => {\n const current = prev || [];\n if (current.includes(parentPath)) return current;\n return [...current, parentPath];\n });\n }\n },\n }),\n []\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={treeData}\n directoryIcons={directoryIcons}\n selectedKeys={\n selectable && selectedFileState && validSelectedFile\n ? [selectedFileState.join(\"/\")]\n : []\n }\n expandedKeys={isExpandedControlled ? expandedPathsState : undefined}\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","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","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","_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","_objectSpread","currentValue","handleEditConfirm","newValue","trim","mode","_findNodeAndValidate2","oldTitle","originalTitle","newTitle","parentKey","name","type","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 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\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\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 // ====== 编辑态状态 ======\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(treeData);\n const isValid = validateAsFile\n ? !!node && (!node?.children || node.children.length === 0)\n : !!node;\n return { node, isValid };\n },\n [treeData],\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 // 当 treeData 变化时,检查编辑节点是否还存在\n useEffect(() => {\n if (!editNode) return;\n const { node } = findNodeAndValidate(editNode.key);\n if (!node) {\n setEditNode(null);\n setCreateContext(null);\n }\n }, [treeData]);\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 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 treeData.length > 0\n ) {\n initializedExpandRef.current = true;\n\n setExpandedPathsState(getAllExpandedKeys(treeData));\n }\n }, [controlled, defaultExpandAll, treeData]);\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 treeData,\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 // 从原始 treeData 中查找节点,避免拿到 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 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={treeData}\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-group/chat-sdk",
3
- "version": "3.5.9",
3
+ "version": "3.5.10",
4
4
  "private": false,
5
5
  "description": "面向 AI 中台平台的前端集成 SDK,支持 OAuth2 安全认证、聊天机器人、智能编辑器、多模态对话,适配 SaaS / 私有化双场景。",
6
6
  "main": "dist/cjs/index.js",