@ai-group/chat-sdk 3.3.11 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/cjs/components/FolderTree/DirectoryTree.d.ts +20 -0
  2. package/dist/cjs/components/FolderTree/DirectoryTree.js +161 -0
  3. package/dist/cjs/components/FolderTree/DirectoryTree.js.map +7 -0
  4. package/dist/cjs/components/FolderTree/FilePreview.d.ts +17 -0
  5. package/dist/cjs/components/FolderTree/FilePreview.js +163 -0
  6. package/dist/cjs/components/FolderTree/FilePreview.js.map +7 -0
  7. package/dist/cjs/components/FolderTree/index.d.ts +5 -0
  8. package/dist/cjs/components/FolderTree/index.js +235 -0
  9. package/dist/cjs/components/FolderTree/index.js.map +7 -0
  10. package/dist/cjs/components/FolderTree/styles.d.ts +49 -0
  11. package/dist/cjs/components/FolderTree/styles.js +157 -0
  12. package/dist/cjs/components/FolderTree/styles.js.map +7 -0
  13. package/dist/cjs/components/FolderTree/types.d.ts +81 -0
  14. package/dist/cjs/components/FolderTree/types.js +18 -0
  15. package/dist/cjs/components/FolderTree/types.js.map +7 -0
  16. package/dist/cjs/components/XAdkSender/index.js +21 -10
  17. package/dist/cjs/components/XAdkSender/index.js.map +2 -2
  18. package/dist/cjs/index.d.ts +3 -0
  19. package/dist/cjs/index.js +3 -0
  20. package/dist/cjs/index.js.map +3 -3
  21. package/dist/cjs/types/XAdkSender.d.ts +7 -0
  22. package/dist/cjs/types/XAdkSender.js.map +1 -1
  23. package/dist/esm/components/FolderTree/DirectoryTree.d.ts +20 -0
  24. package/dist/esm/components/FolderTree/DirectoryTree.js +118 -0
  25. package/dist/esm/components/FolderTree/DirectoryTree.js.map +1 -0
  26. package/dist/esm/components/FolderTree/FilePreview.d.ts +17 -0
  27. package/dist/esm/components/FolderTree/FilePreview.js +160 -0
  28. package/dist/esm/components/FolderTree/FilePreview.js.map +1 -0
  29. package/dist/esm/components/FolderTree/index.d.ts +5 -0
  30. package/dist/esm/components/FolderTree/index.js +271 -0
  31. package/dist/esm/components/FolderTree/index.js.map +1 -0
  32. package/dist/esm/components/FolderTree/styles.d.ts +49 -0
  33. package/dist/esm/components/FolderTree/styles.js +23 -0
  34. package/dist/esm/components/FolderTree/styles.js.map +1 -0
  35. package/dist/esm/components/FolderTree/types.d.ts +81 -0
  36. package/dist/esm/components/FolderTree/types.js +2 -0
  37. package/dist/esm/components/FolderTree/types.js.map +1 -0
  38. package/dist/esm/components/XAdkSender/index.js +12 -0
  39. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  40. package/dist/esm/index.d.ts +3 -0
  41. package/dist/esm/index.js +3 -0
  42. package/dist/esm/index.js.map +1 -1
  43. package/dist/esm/types/XAdkSender.d.ts +7 -0
  44. package/dist/esm/types/XAdkSender.js.map +1 -1
  45. package/dist/umd/chat-sdk.min.js +1 -1
  46. package/package.json +1 -1
@@ -83,6 +83,13 @@ export interface SenderUIProps {
83
83
  files: ServerFile[];
84
84
  }) => void;
85
85
  onStop?: () => void;
86
+ /** 自定义发送按钮渲染 */
87
+ sendButtonRender?: (info: {
88
+ loading: boolean;
89
+ disabled: boolean;
90
+ onSend: () => void;
91
+ onStop?: () => void;
92
+ }) => React.ReactNode;
86
93
  /** 后缀内容,默认展示操作按钮,设为 false 时不显示 */
87
94
  suffix?: React.ReactNode | false | SlotRenderFunction;
88
95
  /** 头部面板 */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/XAdkSender.ts"],
4
- "sourcesContent": ["// types/XAdkSender.ts\nimport React from \"react\";\n\nexport interface UploadFileResult {\n fileName?: string;\n fileId?: string | number;\n tempUrl?: string;\n url?: string;\n fileUrl?: string;\n fileType?: string;\n fileSize?: number;\n mimeType?: string;\n [key: string]: any;\n}\n\nexport interface UploadSuccessResponse {\n data?: UploadFileResult | UploadFileResult[];\n [key: string]: any;\n}\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (\n response: UploadFileResult | UploadFileResult[] | UploadSuccessResponse,\n ) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport type UploadRequestFn = uploadRequestProps;\n\nexport interface ServerFile {\n fileName: string;\n fileId: string | number;\n tempUrl: string;\n type: string;\n size?: number;\n mimeType: string;\n raw?: UploadFileResult;\n}\n\nexport interface LocalFile {\n id: string;\n uid: string;\n name: string;\n file: File;\n size: number;\n type: string;\n progress: number;\n status: \"pending\" | \"uploading\" | \"success\" | \"error\";\n // 服务器返回字段\n fileId?: string | number;\n tempUrl?: string;\n response?: any;\n errorMessage?: string; // 上传错误信息\n}\n\nexport type FileValidator = (\n file: File,\n context: { files: LocalFile[] },\n) => string | null;\n\nexport interface ActionsComponents {\n SendButton: React.ComponentType<any>;\n UploadButton: React.ComponentType<any>;\n ClearButton: React.ComponentType<any>;\n}\n\nexport type SlotRenderFunction = (\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n) => React.ReactNode | false;\n\n// 上传相关\nexport interface UploaderCoreProps {\n uploadRequest?: uploadRequestProps;\n\n maxFileSize?: number;\n allowedFileTypes?: string[];\n maxFiles?: number;\n\n validators?: FileValidator[];\n\n // 数据层回调\n onFilesChange?: (files: LocalFile[]) => void;\n onUploadSuccess?: (file: LocalFile) => void;\n onUploadError?: (file: LocalFile, error: Error) => void;\n}\n\n// UI 相关\nexport interface SenderUIProps {\n clearBtnShow?: boolean;\n allowUpload?: boolean;\n /** 是否启用 Sender 自身的拖拽上传,设为 false 时由外层(如 DefaultLayout)管理拖拽 */\n draggable?: boolean;\n loading?: boolean;\n disabled?: boolean; // 只读状态\n onClear?: () => void;\n onChange?: (value: string) => void;\n onSubmit?: (data: { text: string; files: ServerFile[] }) => void;\n onStop?: () => void;\n\n // UI插槽功能\n /** 后缀内容,默认展示操作按钮,设为 false 时不显示 */\n suffix?: React.ReactNode | false | SlotRenderFunction;\n /** 头部面板 */\n header?: React.ReactNode | false | SlotRenderFunction;\n /** 前缀内容 */\n prefix?: React.ReactNode | false | SlotRenderFunction;\n /** 底部内容 */\n footer?: React.ReactNode | false | SlotRenderFunction;\n}\n\nexport type XAdkSenderProps = SenderUIProps & UploaderCoreProps;\n\nexport interface XAdkSenderHandle {\n addFiles: (files: File[]) => void;\n}\n"],
4
+ "sourcesContent": ["// types/XAdkSender.ts\nimport React from \"react\";\n\nexport interface UploadFileResult {\n fileName?: string;\n fileId?: string | number;\n tempUrl?: string;\n url?: string;\n fileUrl?: string;\n fileType?: string;\n fileSize?: number;\n mimeType?: string;\n [key: string]: any;\n}\n\nexport interface UploadSuccessResponse {\n data?: UploadFileResult | UploadFileResult[];\n [key: string]: any;\n}\n\ninterface uploadRequestProps {\n (options: {\n file: File;\n onProgress?: (e: { percent: number }) => void;\n onSuccess?: (\n response: UploadFileResult | UploadFileResult[] | UploadSuccessResponse,\n ) => void;\n onError?: (error: Error) => void;\n }): Promise<void> | void;\n}\n\nexport type UploadRequestFn = uploadRequestProps;\n\nexport interface ServerFile {\n fileName: string;\n fileId: string | number;\n tempUrl: string;\n type: string;\n size?: number;\n mimeType: string;\n raw?: UploadFileResult;\n}\n\nexport interface LocalFile {\n id: string;\n uid: string;\n name: string;\n file: File;\n size: number;\n type: string;\n progress: number;\n status: \"pending\" | \"uploading\" | \"success\" | \"error\";\n // 服务器返回字段\n fileId?: string | number;\n tempUrl?: string;\n response?: any;\n errorMessage?: string; // 上传错误信息\n}\n\nexport type FileValidator = (\n file: File,\n context: { files: LocalFile[] },\n) => string | null;\n\nexport interface ActionsComponents {\n SendButton: React.ComponentType<any>;\n UploadButton: React.ComponentType<any>;\n ClearButton: React.ComponentType<any>;\n}\n\nexport type SlotRenderFunction = (\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n) => React.ReactNode | false;\n\n// 上传相关\nexport interface UploaderCoreProps {\n uploadRequest?: uploadRequestProps;\n\n maxFileSize?: number;\n allowedFileTypes?: string[];\n maxFiles?: number;\n\n validators?: FileValidator[];\n\n // 数据层回调\n onFilesChange?: (files: LocalFile[]) => void;\n onUploadSuccess?: (file: LocalFile) => void;\n onUploadError?: (file: LocalFile, error: Error) => void;\n}\n\n// UI 相关\nexport interface SenderUIProps {\n clearBtnShow?: boolean;\n allowUpload?: boolean;\n /** 是否启用 Sender 自身的拖拽上传,设为 false 时由外层(如 DefaultLayout)管理拖拽 */\n draggable?: boolean;\n loading?: boolean;\n disabled?: boolean; // 只读状态\n onClear?: () => void;\n onChange?: (value: string) => void;\n onSubmit?: (data: { text: string; files: ServerFile[] }) => void;\n onStop?: () => void;\n\n /** 自定义发送按钮渲染 */\n sendButtonRender?: (info: {\n loading: boolean;\n disabled: boolean;\n onSend: () => void;\n onStop?: () => void;\n }) => React.ReactNode;\n\n // UI插槽功能\n /** 后缀内容,默认展示操作按钮,设为 false 时不显示 */\n suffix?: React.ReactNode | false | SlotRenderFunction;\n /** 头部面板 */\n header?: React.ReactNode | false | SlotRenderFunction;\n /** 前缀内容 */\n prefix?: React.ReactNode | false | SlotRenderFunction;\n /** 底部内容 */\n footer?: React.ReactNode | false | SlotRenderFunction;\n}\n\nexport type XAdkSenderProps = SenderUIProps & UploaderCoreProps;\n\nexport interface XAdkSenderHandle {\n addFiles: (files: File[]) => void;\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import type { TreeProps } from "antd";
3
+ import type { FolderTreeData, FolderTreeProps } from "./types";
4
+ export interface DirectoryTreeComponentProps {
5
+ treeData: FolderTreeData[];
6
+ directoryIcons?: FolderTreeProps["directoryIcons"];
7
+ selectedKeys?: string[];
8
+ expandedKeys?: string[];
9
+ onSelect?: TreeProps["onSelect"];
10
+ onExpand?: TreeProps["onExpand"];
11
+ showLine?: FolderTreeProps["showLine"];
12
+ switcherIcon?: FolderTreeProps["switcherIcon"];
13
+ defaultExpandAll?: boolean;
14
+ className?: string;
15
+ directoryTitle?: FolderTreeProps["directoryTitle"];
16
+ moreActions?: FolderTreeProps["moreActions"];
17
+ width?: number | string;
18
+ }
19
+ declare const DirectoryTreeComponent: React.FC<DirectoryTreeComponentProps>;
20
+ export default DirectoryTreeComponent;
@@ -0,0 +1,118 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
+ import React, { useCallback } from "react";
4
+ import { Tree, Dropdown } from "antd";
5
+ import { FileOutlined, FolderOutlined, MoreOutlined } from "@ant-design/icons";
6
+ import clsx from "clsx";
7
+ import { useStyles } from "./styles";
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ import { jsxs as _jsxs } from "react/jsx-runtime";
10
+ 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,
22
+ className = _ref.className,
23
+ directoryIcons = _ref.directoryIcons,
24
+ directoryTitle = _ref.directoryTitle,
25
+ moreActions = _ref.moreActions,
26
+ width = _ref.width;
27
+ var styles = useStyles();
28
+ var isFolder = function isFolder(node) {
29
+ return !!node.children && node.children.length > 0;
30
+ };
31
+ var getIcon = useCallback(function (node) {
32
+ if (directoryIcons === false || directoryIcons === null) {
33
+ return null;
34
+ }
35
+ if (isFolder(node)) {
36
+ var icon = directoryIcons === null || directoryIcons === void 0 ? void 0 : directoryIcons.directory;
37
+ if (typeof icon === "function") return icon();
38
+ return icon || /*#__PURE__*/_jsx(FolderOutlined, {});
39
+ }
40
+ var filePath = node.path.toLowerCase();
41
+ var extension = filePath.split(".").pop();
42
+ if (extension) {
43
+ var _icon = directoryIcons === null || directoryIcons === void 0 ? void 0 : directoryIcons[extension];
44
+ if (_icon) return typeof _icon === "function" ? _icon() : _icon;
45
+ }
46
+ return /*#__PURE__*/_jsx(FileOutlined, {});
47
+ }, [directoryIcons]);
48
+ var buildPathSegments = useCallback(function (node) {
49
+ var parentSegments = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
50
+ if (node.path === "/" && parentSegments.length === 0) {
51
+ return ["/"];
52
+ }
53
+ return [].concat(_toConsumableArray(parentSegments), [node.path]).filter(function (s) {
54
+ return s !== "";
55
+ });
56
+ }, []);
57
+ var convertToTreeData = useCallback(function (nodes) {
58
+ var parentSegments = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
59
+ return nodes.map(function (node) {
60
+ var pathSegments = buildPathSegments(node, parentSegments);
61
+ var fullPath = pathSegments.join("/").replace(/^\/+/, "");
62
+ var titleContent = /*#__PURE__*/_jsxs("span", {
63
+ className: clsx(styles.treeNodeTitle, moreActions && styles.treeNodeTitleHover),
64
+ children: [/*#__PURE__*/_jsx("span", {
65
+ children: node.title
66
+ }), moreActions && /*#__PURE__*/_jsx(Dropdown, {
67
+ menu: moreActions(node),
68
+ trigger: ["click"],
69
+ placement: "bottomRight",
70
+ children: /*#__PURE__*/_jsx("span", {
71
+ className: clsx(styles.moreIcon, "folder-tree-more-icon"),
72
+ onClick: function onClick(e) {
73
+ return e.stopPropagation();
74
+ },
75
+ children: /*#__PURE__*/_jsx(MoreOutlined, {})
76
+ })
77
+ })]
78
+ });
79
+ return _objectSpread(_objectSpread({}, node), {}, {
80
+ key: fullPath,
81
+ path: fullPath,
82
+ pathSegments: pathSegments,
83
+ title: titleContent,
84
+ icon: getIcon(node),
85
+ isLeaf: !isFolder(node),
86
+ children: node.children ? convertToTreeData(node.children, pathSegments) : undefined
87
+ });
88
+ });
89
+ }, [buildPathSegments, getIcon, moreActions, styles]);
90
+ var treeDataConverted = convertToTreeData(treeData);
91
+ var titleNode = directoryTitle === false || directoryTitle === null ? null : typeof directoryTitle === "function" ? directoryTitle() : directoryTitle;
92
+ return /*#__PURE__*/_jsxs("div", {
93
+ className: clsx(styles.directoryPanel, className),
94
+ style: {
95
+ width: width
96
+ },
97
+ children: [titleNode && /*#__PURE__*/_jsx("div", {
98
+ className: styles.directoryTitle,
99
+ children: titleNode
100
+ }), /*#__PURE__*/_jsx("div", {
101
+ className: styles.directoryTreeContent,
102
+ children: /*#__PURE__*/_jsx(AntDirectoryTree, {
103
+ treeData: treeDataConverted,
104
+ selectedKeys: selectedKeys,
105
+ expandedKeys: expandedKeys,
106
+ onSelect: onSelect,
107
+ onExpand: onExpand,
108
+ multiple: false,
109
+ blockNode: true,
110
+ showLine: showLine,
111
+ switcherIcon: switcherIcon,
112
+ defaultExpandAll: defaultExpandAll
113
+ })
114
+ })]
115
+ });
116
+ };
117
+ export default DirectoryTreeComponent;
118
+ //# sourceMappingURL=DirectoryTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","Tree","Dropdown","FileOutlined","FolderOutlined","MoreOutlined","clsx","useStyles","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","styles","isFolder","node","children","length","getIcon","icon","directory","filePath","path","toLowerCase","extension","split","pop","buildPathSegments","parentSegments","arguments","undefined","concat","_toConsumableArray","filter","s","convertToTreeData","nodes","map","pathSegments","fullPath","join","replace","titleContent","treeNodeTitle","treeNodeTitleHover","title","menu","trigger","placement","moreIcon","onClick","e","stopPropagation","_objectSpread","key","isLeaf","treeDataConverted","titleNode","directoryPanel","style","directoryTreeContent","multiple","blockNode"],"sources":["../../../../src/components/FolderTree/DirectoryTree.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Tree, Dropdown } from \"antd\";\nimport {\n FileOutlined,\n FolderOutlined,\n MoreOutlined,\n} from \"@ant-design/icons\";\nimport type { TreeProps } from \"antd\";\nimport type { DataNode } from \"antd/es/tree\";\nimport clsx from \"clsx\";\nimport type { FolderTreeData, FolderTreeProps } from \"./types\";\nimport { useStyles } from \"./styles\";\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}\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}) => {\n const styles = useStyles();\n\n const isFolder = (node: FolderTreeData): boolean => {\n return !!node.children && node.children.length > 0;\n };\n\n const getIcon = useCallback(\n (node: FolderTreeData) => {\n if (directoryIcons === false || directoryIcons === null) {\n return null;\n }\n if (isFolder(node)) {\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 convertToTreeData = useCallback(\n (nodes: FolderTreeData[], parentSegments: string[] = []): DataNode[] => {\n return nodes.map((node) => {\n const pathSegments = buildPathSegments(node, parentSegments);\n const fullPath = pathSegments.join(\"/\").replace(/^\\/+/, \"\");\n\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 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 return {\n ...node,\n key: fullPath,\n path: fullPath,\n pathSegments,\n title: titleContent,\n icon: getIcon(node),\n isLeaf: !isFolder(node),\n children: node.children\n ? convertToTreeData(node.children, pathSegments)\n : undefined,\n };\n });\n },\n [buildPathSegments, getIcon, moreActions, styles]\n );\n\n const treeDataConverted = convertToTreeData(treeData);\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 className={styles.directoryTreeContent}>\n <AntDirectoryTree\n treeData={treeDataConverted}\n selectedKeys={selectedKeys}\n expandedKeys={expandedKeys}\n onSelect={onSelect}\n onExpand={onExpand}\n multiple={false}\n blockNode\n showLine={showLine as any}\n switcherIcon={switcherIcon}\n defaultExpandAll={defaultExpandAll}\n />\n </div>\n </div>\n );\n};\n\nexport default DirectoryTreeComponent;\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import type { FolderTreeData, FolderTreeProps } from "./types";
3
+ export interface FilePreviewProps {
4
+ selectedFile?: string[] | null;
5
+ fileContent?: string;
6
+ loading?: boolean;
7
+ previewTitle?: FolderTreeProps["previewTitle"];
8
+ previewRender?: FolderTreeProps["previewRender"];
9
+ emptyRender?: FolderTreeProps["emptyRender"];
10
+ getFileNode?: (path: string[]) => {
11
+ title: FolderTreeData["title"];
12
+ path: string;
13
+ content?: string;
14
+ } | undefined;
15
+ }
16
+ declare const FilePreview: React.FC<FilePreviewProps>;
17
+ export default FilePreview;
@@ -0,0 +1,160 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import React from "react";
3
+ import { Empty, Spin } from "antd";
4
+ import { CopyOutlined } from "@ant-design/icons";
5
+ import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
6
+ import { oneLight } from "react-syntax-highlighter/dist/esm/styles/prism";
7
+ import clsx from "clsx";
8
+ import copyToClipboard from "copy-to-clipboard";
9
+ import { useStyles } from "./styles";
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { jsxs as _jsxs } from "react/jsx-runtime";
12
+ var customOneLight = _objectSpread(_objectSpread({}, oneLight), {}, {
13
+ 'pre[class*="language-"]': _objectSpread(_objectSpread({}, oneLight['pre[class*="language-"]']), {}, {
14
+ margin: 0,
15
+ background: "transparent",
16
+ padding: 0,
17
+ borderRadius: 0
18
+ })
19
+ });
20
+ var getFileExtension = function getFileExtension() {
21
+ var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
22
+ var parts = path.split(".");
23
+ return parts[parts.length - 1] || "";
24
+ };
25
+ var EXTENSION_LANGUAGE_MAP = {
26
+ ts: "typescript",
27
+ tsx: "tsx",
28
+ js: "javascript",
29
+ jsx: "jsx",
30
+ md: "markdown",
31
+ json: "json",
32
+ css: "css",
33
+ scss: "scss",
34
+ less: "less",
35
+ html: "html",
36
+ xml: "xml",
37
+ yaml: "yaml",
38
+ yml: "yaml",
39
+ py: "python",
40
+ java: "java",
41
+ go: "go",
42
+ rs: "rust",
43
+ sh: "bash",
44
+ bash: "bash",
45
+ sql: "sql",
46
+ graphql: "graphql",
47
+ vue: "html",
48
+ svelte: "html"
49
+ };
50
+ var getLanguageFromExtension = function getLanguageFromExtension(ext) {
51
+ var lower = ext.toLowerCase();
52
+ return EXTENSION_LANGUAGE_MAP[lower] || lower || "text";
53
+ };
54
+ var FilePreview = function FilePreview(_ref) {
55
+ var selectedFile = _ref.selectedFile,
56
+ _ref$fileContent = _ref.fileContent,
57
+ fileContent = _ref$fileContent === void 0 ? "" : _ref$fileContent,
58
+ _ref$loading = _ref.loading,
59
+ loading = _ref$loading === void 0 ? false : _ref$loading,
60
+ previewTitle = _ref.previewTitle,
61
+ previewRender = _ref.previewRender,
62
+ emptyRender = _ref.emptyRender,
63
+ getFileNode = _ref.getFileNode;
64
+ var styles = useStyles();
65
+ if (loading) {
66
+ return /*#__PURE__*/_jsx("div", {
67
+ className: clsx(styles.previewPanel),
68
+ children: /*#__PURE__*/_jsx("div", {
69
+ className: styles.loadingContainer,
70
+ children: /*#__PURE__*/_jsx(Spin, {})
71
+ })
72
+ });
73
+ }
74
+ if (!selectedFile || selectedFile.length === 0) {
75
+ if (emptyRender === false || emptyRender === null) {
76
+ return /*#__PURE__*/_jsx("div", {
77
+ className: styles.previewPanel
78
+ });
79
+ }
80
+ var emptyNode = typeof emptyRender === "function" ? emptyRender() : emptyRender || /*#__PURE__*/_jsx(Empty, {
81
+ image: Empty.PRESENTED_IMAGE_SIMPLE,
82
+ description: "\u8BF7\u9009\u62E9\u6587\u4EF6\u67E5\u770B\u5185\u5BB9"
83
+ });
84
+ return /*#__PURE__*/_jsx("div", {
85
+ className: styles.previewPanel,
86
+ children: /*#__PURE__*/_jsx("div", {
87
+ className: styles.emptyContainer,
88
+ children: emptyNode
89
+ })
90
+ });
91
+ }
92
+ var fileNode = getFileNode === null || getFileNode === void 0 ? void 0 : getFileNode(selectedFile);
93
+ var title = (fileNode === null || fileNode === void 0 ? void 0 : fileNode.title) || selectedFile[selectedFile.length - 1];
94
+ var fileName = selectedFile[selectedFile.length - 1];
95
+ var extension = getFileExtension(fileName);
96
+ var language = getLanguageFromExtension(extension);
97
+
98
+ // 标题区域
99
+ var headerNode;
100
+ if (previewTitle === false || previewTitle === null) {
101
+ headerNode = null;
102
+ } else if (previewTitle) {
103
+ headerNode = typeof previewTitle === "function" ? previewTitle({
104
+ title: title,
105
+ path: selectedFile,
106
+ content: fileContent
107
+ }) : previewTitle;
108
+ } else {
109
+ headerNode = /*#__PURE__*/_jsxs("div", {
110
+ className: styles.previewTitle,
111
+ children: [/*#__PURE__*/_jsx("span", {
112
+ children: title
113
+ }), /*#__PURE__*/_jsx(CopyOutlined, {
114
+ className: styles.copyBtn,
115
+ onClick: function onClick() {
116
+ return copyToClipboard(fileContent);
117
+ }
118
+ })]
119
+ });
120
+ }
121
+
122
+ // 内容区域
123
+ var originContentNode = /*#__PURE__*/_jsx(SyntaxHighlighter, {
124
+ language: language,
125
+ wrapLines: true,
126
+ style: customOneLight,
127
+ codeTagProps: {
128
+ style: {
129
+ background: "transparent"
130
+ }
131
+ },
132
+ children: fileContent.replace(/\n$/, "")
133
+ });
134
+ var contentNode;
135
+ if (previewRender) {
136
+ if (typeof previewRender === "function") {
137
+ contentNode = previewRender({
138
+ content: fileContent,
139
+ path: selectedFile,
140
+ title: fileNode === null || fileNode === void 0 ? void 0 : fileNode.title,
141
+ language: language
142
+ }, {
143
+ originNode: originContentNode
144
+ });
145
+ } else {
146
+ contentNode = previewRender;
147
+ }
148
+ } else {
149
+ contentNode = originContentNode;
150
+ }
151
+ return /*#__PURE__*/_jsxs("div", {
152
+ className: styles.previewPanel,
153
+ children: [headerNode, /*#__PURE__*/_jsx("div", {
154
+ className: styles.previewContent,
155
+ children: contentNode
156
+ })]
157
+ });
158
+ };
159
+ export default FilePreview;
160
+ //# sourceMappingURL=FilePreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","Empty","Spin","CopyOutlined","Prism","SyntaxHighlighter","oneLight","clsx","copyToClipboard","useStyles","jsx","_jsx","jsxs","_jsxs","customOneLight","_objectSpread","margin","background","padding","borderRadius","getFileExtension","path","arguments","length","undefined","parts","split","EXTENSION_LANGUAGE_MAP","ts","tsx","js","md","json","css","scss","less","html","xml","yaml","yml","py","java","go","rs","sh","bash","sql","graphql","vue","svelte","getLanguageFromExtension","ext","lower","toLowerCase","FilePreview","_ref","selectedFile","_ref$fileContent","fileContent","_ref$loading","loading","previewTitle","previewRender","emptyRender","getFileNode","styles","className","previewPanel","children","loadingContainer","emptyNode","image","PRESENTED_IMAGE_SIMPLE","description","emptyContainer","fileNode","title","fileName","extension","language","headerNode","content","copyBtn","onClick","originContentNode","wrapLines","style","codeTagProps","replace","contentNode","originNode","previewContent"],"sources":["../../../../src/components/FolderTree/FilePreview.tsx"],"sourcesContent":["import React from \"react\";\nimport { Empty, Spin } from \"antd\";\nimport { CopyOutlined } from \"@ant-design/icons\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { oneLight } from \"react-syntax-highlighter/dist/esm/styles/prism\";\nimport clsx from \"clsx\";\nimport copyToClipboard from \"copy-to-clipboard\";\nimport type { FolderTreeData, FolderTreeProps } from \"./types\";\nimport { useStyles } from \"./styles\";\n\nexport interface FilePreviewProps {\n selectedFile?: string[] | null;\n fileContent?: string;\n loading?: boolean;\n previewTitle?: FolderTreeProps[\"previewTitle\"];\n previewRender?: FolderTreeProps[\"previewRender\"];\n emptyRender?: FolderTreeProps[\"emptyRender\"];\n getFileNode?: (\n path: string[]\n ) =>\n | { title: FolderTreeData[\"title\"]; path: string; content?: string }\n | undefined;\n}\n\nconst customOneLight = {\n ...oneLight,\n 'pre[class*=\"language-\"]': {\n ...oneLight['pre[class*=\"language-\"]'],\n margin: 0,\n background: \"transparent\",\n padding: 0,\n borderRadius: 0,\n },\n};\n\nconst getFileExtension = (path = \"\") => {\n const parts = path.split(\".\");\n return parts[parts.length - 1] || \"\";\n};\n\nconst EXTENSION_LANGUAGE_MAP: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"tsx\",\n js: \"javascript\",\n jsx: \"jsx\",\n md: \"markdown\",\n json: \"json\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n html: \"html\",\n xml: \"xml\",\n yaml: \"yaml\",\n yml: \"yaml\",\n py: \"python\",\n java: \"java\",\n go: \"go\",\n rs: \"rust\",\n sh: \"bash\",\n bash: \"bash\",\n sql: \"sql\",\n graphql: \"graphql\",\n vue: \"html\",\n svelte: \"html\",\n};\n\nconst getLanguageFromExtension = (ext: string) => {\n const lower = ext.toLowerCase();\n return EXTENSION_LANGUAGE_MAP[lower] || lower || \"text\";\n};\n\nconst FilePreview: React.FC<FilePreviewProps> = ({\n selectedFile,\n fileContent = \"\",\n loading = false,\n previewTitle,\n previewRender,\n emptyRender,\n getFileNode,\n}) => {\n const styles = useStyles();\n\n if (loading) {\n return (\n <div className={clsx(styles.previewPanel)}>\n <div className={styles.loadingContainer}>\n <Spin />\n </div>\n </div>\n );\n }\n\n if (!selectedFile || selectedFile.length === 0) {\n if (emptyRender === false || emptyRender === null) {\n return <div className={styles.previewPanel} />;\n }\n const emptyNode =\n typeof emptyRender === \"function\"\n ? emptyRender()\n : emptyRender || (\n <Empty\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n description=\"请选择文件查看内容\"\n />\n );\n return (\n <div className={styles.previewPanel}>\n <div className={styles.emptyContainer}>{emptyNode}</div>\n </div>\n );\n }\n\n const fileNode = getFileNode?.(selectedFile);\n const title = fileNode?.title || selectedFile[selectedFile.length - 1];\n const fileName = selectedFile[selectedFile.length - 1];\n const extension = getFileExtension(fileName);\n const language = getLanguageFromExtension(extension);\n\n // 标题区域\n let headerNode: React.ReactNode;\n if (previewTitle === false || previewTitle === null) {\n headerNode = null;\n } else if (previewTitle) {\n headerNode =\n typeof previewTitle === \"function\"\n ? previewTitle({ title, path: selectedFile, content: fileContent })\n : previewTitle;\n } else {\n headerNode = (\n <div className={styles.previewTitle}>\n <span>{title}</span>\n <CopyOutlined\n className={styles.copyBtn}\n onClick={() => copyToClipboard(fileContent)}\n />\n </div>\n );\n }\n\n // 内容区域\n const originContentNode = (\n <SyntaxHighlighter\n language={language}\n wrapLines\n style={customOneLight}\n codeTagProps={{ style: { background: \"transparent\" } }}\n >\n {fileContent.replace(/\\n$/, \"\")}\n </SyntaxHighlighter>\n );\n\n let contentNode: React.ReactNode;\n if (previewRender) {\n if (typeof previewRender === \"function\") {\n contentNode = previewRender(\n { content: fileContent, path: selectedFile, title: fileNode?.title, language },\n { originNode: originContentNode }\n );\n } else {\n contentNode = previewRender;\n }\n } else {\n contentNode = originContentNode;\n }\n\n return (\n <div className={styles.previewPanel}>\n {headerNode}\n <div className={styles.previewContent}>{contentNode}</div>\n </div>\n );\n};\n\nexport default FilePreview;\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ import type { FolderTreeProps } from "./types";
3
+ export type { FolderTreeData, FolderTreeProps, FileContentService } from "./types";
4
+ declare const FolderTree: React.FC<FolderTreeProps>;
5
+ export default FolderTree;