whisper-design
Version:
A React component library for building AI chat room UIs.
1 lines • 63.7 kB
Source Map (JSON)
{"version":3,"file":"ai-chat-room-components.mjs","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/components/base/Avatar/Avatar.tsx","../src/components/base/Button/Button.tsx","../src/utils/file.ts","../src/components/base/MessageBubble/MessageBubble.tsx","../src/components/composite/ChatInputArea/ChatInputArea.tsx","../src/components/base/FileUpload/FileUpload.tsx","../src/components/composite/ChatMessage/ChatMessage.tsx","../src/components/composite/ChatMessagesList/ChatMessagesList.tsx","../src/utils/format.ts","../src/utils/constants.ts","../src/components/composite/ConversationItem/ConversationItem.tsx","../src/components/features/AIChatRoom/AIChatRoom.tsx","../src/components/features/ConversationList/ConversationList.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return (type.displayName || \"Context\") + \".Provider\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(\n type,\n key,\n self,\n source,\n owner,\n props,\n debugStack,\n debugTask\n ) {\n self = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== self ? self : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n source,\n self,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n self,\n source,\n getOwner(),\n maybeKey,\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_ELEMENT_TYPE &&\n node._store &&\n (node._store.validated = 1);\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\");\n Symbol.for(\"react.provider\");\n var REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n \"react-stack-bottom-frame\": function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React[\"react-stack-bottom-frame\"].bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey, source, self) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n source,\n self,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey, source, self) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n source,\n self,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react';\nimport './Avatar.scss';\n\ninterface AvatarProps {\n src?: string; // Made optional for icon-only avatars\n alt: string;\n size?: 'small' | 'medium' | 'large';\n shape?: 'circle' | 'square';\n gradient?: 'primary' | 'secondary'; // New prop for gradient background\n children?: React.ReactNode; // Allow children for icon avatars\n}\n\nconst Avatar: React.FC<AvatarProps> = React.memo(\n ({ src, alt, size = 'medium', shape = 'circle', gradient, children }) => {\n const gradientClass = gradient ? `avatar--${gradient}-gradient` : '';\n\n return (\n <div\n className={`avatar avatar--${size} avatar--${shape} ${gradientClass}`}\n role=\"img\"\n aria-label={alt}\n >\n {src ? (\n <img src={src} alt={alt} />\n ) : (\n children // Render children (e.g., an icon) if no src is provided\n )}\n </div>\n );\n }\n);\n\nexport default Avatar;\n","import React from 'react';\nimport './Button.scss';\n\ninterface ButtonProps {\n onClick: () => void;\n children: React.ReactNode;\n variant?: 'primary' | 'secondary';\n disabled?: boolean;\n type?: 'button' | 'submit' | 'reset';\n isCircle?: boolean; // New prop for circular buttons\n className?: string; // Additional CSS classes\n}\n\nconst Button: React.FC<ButtonProps> = ({\n onClick,\n children,\n variant = 'primary',\n disabled = false,\n type = 'button',\n isCircle = false,\n className = '',\n}) => {\n const buttonClass = isCircle ? 'button--circle' : `button--${variant}`;\n const fullClassName = `button ${buttonClass} ${className}`.trim();\n\n return (\n <button type={type} className={fullClassName} onClick={onClick} disabled={disabled}>\n {children}\n </button>\n );\n};\n\nexport default Button;\n","// [!] 文件处理工具函数\n\n/**\n * 获取文件图标类名\n * @param fileName 文件名\n * @returns FontAwesome图标类名\n */\nexport const getFileIcon = (fileName: string): string => {\n const extension = fileName.split('.').pop()?.toLowerCase();\n\n switch (extension) {\n case 'pdf':\n return 'fas fa-file-pdf';\n case 'xlsx':\n case 'xls':\n return 'fas fa-file-excel';\n case 'docx':\n case 'doc':\n return 'fas fa-file-word';\n case 'pptx':\n case 'ppt':\n return 'fas fa-file-powerpoint';\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n case 'bmp':\n case 'svg':\n case 'webp':\n return 'fas fa-file-image';\n case 'mp4':\n case 'avi':\n case 'mov':\n case 'wmv':\n case 'flv':\n return 'fas fa-file-video';\n case 'mp3':\n case 'wav':\n case 'flac':\n case 'aac':\n return 'fas fa-file-audio';\n case 'zip':\n case 'rar':\n case '7z':\n case 'tar':\n case 'gz':\n return 'fas fa-file-archive';\n case 'txt':\n case 'md':\n return 'fas fa-file-alt';\n case 'js':\n case 'ts':\n case 'jsx':\n case 'tsx':\n case 'html':\n case 'css':\n case 'scss':\n case 'json':\n case 'xml':\n case 'py':\n case 'java':\n case 'cpp':\n case 'c':\n return 'fas fa-file-code';\n default:\n return 'fas fa-file';\n }\n};\n\n/**\n * 格式化文件大小\n * @param bytes 字节数\n * @returns 格式化后的文件大小字符串\n */\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n};\n\n/**\n * 验证文件类型\n * @param file 文件对象\n * @param acceptedTypes 接受的文件类型\n * @returns 是否为有效文件类型\n */\nexport const validateFileType = (file: File, acceptedTypes: string): boolean => {\n if (!acceptedTypes) return true;\n\n const types = acceptedTypes.split(',').map(type => type.trim());\n return types.some(type => {\n if (type.startsWith('.')) {\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n }\n return file.type.match(type);\n });\n};\n","import React from 'react';\nimport type { MessageBubbleProps } from './interfaces';\nimport { getFileIcon, formatFileSize } from '../../../utils/file';\nimport './MessageBubble.scss';\n\nconst MessageBubble: React.FC<MessageBubbleProps> = React.memo(\n ({ id, content, sender, type = 'text', isLoading, files }) => {\n const renderContent = () => {\n switch (type) {\n case 'image':\n return <img src={content as string} alt=\"\" />;\n case 'code':\n return (\n <pre>\n <code>{content as string}</code>\n </pre>\n );\n case 'text':\n default:\n return <p>{content}</p>;\n }\n };\n\n return (\n <div className={`message-bubble ${sender} message-bubble--${type}`} key={id}>\n {renderContent()}\n {files && files.length > 0 && (\n <div className=\"file-attachments\">\n {files.map(file => (\n <div key={file.id} className=\"file-attachment\">\n <div className=\"file-icon\">\n <i className={getFileIcon(file.name)}></i>\n </div>\n <div className=\"file-info\">\n <div className=\"file-name\">{file.name}</div>\n <div className=\"file-size\">{formatFileSize(file.size)}</div>\n </div>\n </div>\n ))}\n </div>\n )}\n {isLoading && <span className=\"loading-indicator\">...</span>}{' '}\n {/* Simple loading indicator */}\n </div>\n );\n }\n);\n\nexport default MessageBubble;\n","import React, { useState, useRef } from 'react';\nimport { v4 as uuid } from 'uuid';\nimport Button from '../../base/Button/Button';\nimport type { UploadedFile } from '../../base/FileUpload/interfaces';\nimport { getFileIcon, formatFileSize } from '../../../utils/file';\nimport './ChatInputArea.scss';\n\ninterface ChatInputAreaProps {\n onSendMessage: (message: string, files: UploadedFile[]) => void;\n isSending?: boolean;\n placeholder?: string;\n onFilesChange?: (files: UploadedFile[]) => void;\n}\n\nconst ChatInputArea: React.FC<ChatInputAreaProps> = ({\n onSendMessage,\n isSending = false,\n placeholder = '输入消息...',\n onFilesChange,\n}) => {\n const [inputValue, setInputValue] = useState('');\n const [files, setFiles] = useState<UploadedFile[]>([]);\n const fileInputRef = useRef<HTMLInputElement>(null); // Ref for the hidden file input\n\n const handleFilesChange = (newFiles: UploadedFile[]) => {\n setFiles(newFiles);\n if (onFilesChange) {\n onFilesChange(newFiles);\n }\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (inputValue.trim() || files.length > 0) {\n onSendMessage(inputValue.trim(), files);\n setInputValue('');\n setFiles([]);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit(e as unknown as React.FormEvent); // Cast to FormEvent\n }\n };\n\n return (\n <form className=\"chat-input-area\" onSubmit={handleSubmit}>\n <div className=\"input-container\">\n <div className=\"input-toolbar\">\n <Button isCircle onClick={() => fileInputRef.current?.click()} disabled={isSending}>\n <i className=\"fas fa-paperclip\"></i>\n </Button>\n </div>\n\n {/* Hidden file input for FileUpload component */}\n <input\n type=\"file\"\n ref={fileInputRef}\n multiple\n accept=\"image/*,.pdf,.xlsx,.docx\"\n onChange={e => {\n const selectedFiles = Array.from(e.target.files || []);\n const uploadedFiles: UploadedFile[] = selectedFiles.map(file =>\n Object.assign(file, { id: uuid() })\n );\n // Append new files to existing files instead of replacing\n handleFilesChange([...files, ...uploadedFiles]);\n e.target.value = ''; // Clear input\n }}\n style={{ display: 'none' }}\n />\n\n {files.length > 0 && (\n <div className=\"file-list\">\n {' '}\n {/* Display selected files here */}\n {files.map(file => (\n <div key={file.id} className=\"file-card\">\n <span className=\"file-icon\">\n <i className={getFileIcon(file.name)}></i>\n </span>\n <div className=\"file-info\">\n <span className=\"file-name\">{file.name}</span>\n <span className=\"file-size\">{formatFileSize(file.size)}</span>\n </div>\n <button\n type=\"button\"\n className=\"file-remove-button\"\n onClick={() => handleFilesChange(files.filter(f => f.id !== file.id))}\n disabled={isSending}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n\n <textarea\n className=\"message-input\"\n placeholder={placeholder}\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n aria-label=\"消息输入框\"\n disabled={isSending}\n />\n\n <div className=\"input-actions\">\n <div className=\"input-hints\">\n <i className=\"fas fa-lightbulb\"></i> 按 Enter 发送,Shift + Enter 换行\n </div>\n <Button type=\"submit\" variant=\"primary\" disabled={isSending} onClick={() => {}}>\n <i className=\"fas fa-paper-plane\"></i>\n 发送\n </Button>\n </div>\n </div>\n </form>\n );\n};\n\nexport default ChatInputArea;\n","import React, { useRef, useState, useEffect } from 'react'; // Removed useMemo\nimport { v4 as uuid } from 'uuid';\nimport type { FileUploadProps, UploadedFile } from './interfaces'; // Changed to import type\nimport './FileUpload.scss';\n\nconst FileUpload: React.FC<FileUploadProps> = ({\n onFilesChange,\n acceptedFileTypes = 'image/*,.pdf,.xlsx,.docx',\n maxFiles = 5,\n value, // Controlled component value\n disabled = false,\n}) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [internalFiles, setInternalFiles] = useState<UploadedFile[]>(value || []);\n\n // Effect to keep internal state in sync with controlled 'value' prop\n useEffect(() => {\n if (value !== undefined) {\n setInternalFiles(value);\n }\n }, [value]);\n\n const handleFileSelect = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n const selectedFiles = Array.from(event.target.files || []);\n const newFiles: UploadedFile[] = [];\n\n selectedFiles.forEach(file => {\n if (internalFiles.length + newFiles.length < maxFiles) {\n // Basic type validation\n const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();\n const isAccepted = acceptedFileTypes.split(',').some(type => {\n type = type.trim().toLowerCase();\n if (type.startsWith('.')) {\n // Extension check\n return fileExtension === type;\n } else if (type.endsWith('/*')) {\n // Wildcard MIME type\n return file.type.startsWith(type.slice(0, -1));\n }\n return file.type === type; // Exact MIME type\n });\n\n if (isAccepted) {\n const uploadedFile: UploadedFile = {\n ...file,\n id: uuid(),\n ...(file.type.startsWith('image/') && { preview: URL.createObjectURL(file) }),\n } as UploadedFile;\n newFiles.push(uploadedFile);\n } else {\n console.warn(`File type not accepted: ${file.name} (${file.type})`);\n }\n } else {\n console.warn(`Max files reached (${maxFiles}). Skipping ${file.name}.`);\n }\n });\n\n const updatedFiles = [...internalFiles, ...newFiles];\n setInternalFiles(updatedFiles);\n onFilesChange?.(updatedFiles);\n\n // Clear the input value to allow selecting the same file again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const handleFileRemove = (id: string) => {\n if (disabled) return;\n const updatedFiles = internalFiles.filter(file => file.id !== id);\n setInternalFiles(updatedFiles);\n onFilesChange?.(updatedFiles);\n };\n\n const getFileIcon = (file: UploadedFile) => {\n if (file.type.startsWith('image/')) return '🖼️';\n if (file.type === 'application/pdf') return '📄';\n if (\n file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||\n file.name.endsWith('.xlsx')\n )\n return '📊';\n return '📎'; // Generic attachment icon\n };\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n };\n\n const isMaxFilesReached = internalFiles.length >= maxFiles;\n\n return (\n <div className=\"file-upload-container\">\n <input\n type=\"file\"\n ref={fileInputRef}\n multiple\n accept={acceptedFileTypes}\n onChange={handleFileSelect}\n disabled={disabled || isMaxFilesReached}\n style={{ display: 'none' }} // Hide the default input\n />\n <button\n type=\"button\"\n className=\"file-upload-button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || isMaxFilesReached}\n >\n {isMaxFilesReached ? 'Max files reached' : 'Select Files'}\n </button>\n\n {internalFiles.length > 0 && (\n <div className=\"file-list\">\n {internalFiles.map(file => (\n <div key={file.id} className=\"file-card\">\n <span className=\"file-icon\">{getFileIcon(file)}</span>\n {file.preview && <img src={file.preview} alt=\"preview\" className=\"file-preview\" />}\n <div className=\"file-info\">\n <span className=\"file-name\">{file.name}</span>\n <span className=\"file-size\">{formatFileSize(file.size)}</span>\n </div>\n <button\n type=\"button\"\n className=\"file-remove-button\"\n onClick={() => handleFileRemove(file.id)}\n disabled={disabled}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default FileUpload;\n","import React from 'react';\nimport type { IMessage, IChatConfig } from '../../../types/chat';\nimport Avatar from '../../base/Avatar/Avatar';\nimport MessageBubble from '../../base/MessageBubble/MessageBubble';\nimport './ChatMessage.scss';\n\ninterface ChatMessageProps {\n message: IMessage;\n config?: IChatConfig;\n}\n\nconst ChatMessage: React.FC<ChatMessageProps> = React.memo(({ message, config }) => {\n const isUser = message.sender === 'user';\n const avatarSrc = isUser ? config?.userAvatar : config?.aiAvatar;\n const avatarAlt = isUser ? 'User Avatar' : 'AI Avatar';\n const avatarGradient = isUser ? 'primary' : 'secondary';\n\n const formatTime = (timestamp: number) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n };\n\n return (\n <div className={`message-row ${isUser ? 'user' : ''}`}>\n <Avatar\n {...(avatarSrc && { src: avatarSrc })}\n alt={avatarAlt}\n size=\"medium\"\n gradient={avatarGradient}\n >\n {/* Render icon if no src provided */}\n {!avatarSrc && <i className={`fas fa-${isUser ? 'user' : 'robot'}`}></i>}\n </Avatar>\n <div className=\"message-content\">\n <MessageBubble\n id={message.id}\n content={message.content}\n sender={message.sender}\n type={message.type || 'text'}\n {...(message.isLoading !== undefined && { isLoading: message.isLoading })}\n {...(message.files && { files: message.files })}\n />\n <div className=\"message-time\">{formatTime(message.timestamp)}</div>\n </div>\n </div>\n );\n});\n\nexport default ChatMessage;\n","import React, { useRef, useEffect } from 'react';\nimport type { IMessage, IChatConfig } from '../../../types/chat';\nimport ChatMessage from '../ChatMessage/ChatMessage';\nimport './ChatMessagesList.scss';\n\ninterface ChatMessagesListProps {\n messages: IMessage[];\n config?: IChatConfig;\n isLoadingMore?: boolean; // For future infinite scrolling\n}\n\nconst ChatMessagesList: React.FC<ChatMessagesListProps> = ({ messages, config, isLoadingMore }) => {\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const scrollToBottom = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n };\n\n useEffect(() => {\n scrollToBottom();\n }, [messages]); // Scroll to bottom when messages change\n\n return (\n <div className=\"chat-messages\">\n {' '}\n {/* Changed class name */}\n {messages.map(message => (\n <ChatMessage key={message.id} message={message} {...(config && { config })} />\n ))}\n {isLoadingMore && <div className=\"loading-more\">Loading more messages...</div>}\n <div ref={messagesEndRef} /> {/* Scroll target */}\n </div>\n );\n};\n\nexport default ChatMessagesList;\n","// [!] 格式化工具函数\nimport dayjs from 'dayjs';\n\n/**\n * 格式化时间戳为可读时间\n * @param timestamp 时间戳\n * @param format 格式化模板,默认为 'HH:mm'\n * @returns 格式化后的时间字符串\n */\nexport const formatTime = (timestamp: number, format = 'HH:mm'): string => {\n return dayjs(timestamp).format(format);\n};\n\n/**\n * 格式化相对时间\n * @param timestamp 时间戳\n * @returns 相对时间字符串(如:2分钟前)\n */\nexport const formatRelativeTime = (timestamp: number): string => {\n const now = dayjs();\n const target = dayjs(timestamp);\n const diffInMinutes = now.diff(target, 'minute');\n\n if (diffInMinutes < 1) return '刚刚';\n if (diffInMinutes < 60) return `${diffInMinutes}分钟前`;\n\n const diffInHours = now.diff(target, 'hour');\n if (diffInHours < 24) return `${diffInHours}小时前`;\n\n const diffInDays = now.diff(target, 'day');\n if (diffInDays < 7) return `${diffInDays}天前`;\n\n return target.format('YYYY-MM-DD');\n};\n\n/**\n * 截断文本并添加省略号\n * @param text 原始文本\n * @param maxLength 最大长度\n * @returns 截断后的文本\n */\nexport const truncateText = (text: string, maxLength: number): string => {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + '...';\n};\n","// [!] 常量定义\n\n/**\n * 文件上传限制\n */\nexport const FILE_UPLOAD = {\n MAX_SIZE: 10 * 1024 * 1024, // 10MB\n MAX_FILES: 5,\n ACCEPTED_TYPES: 'image/*,.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.md',\n} as const;\n\n/**\n * 消息相关常量\n */\nexport const MESSAGE = {\n MAX_LENGTH: 2000,\n TYPING_DELAY: 1000, // 模拟AI输入延迟\n} as const;\n\n/**\n * UI相关常量\n */\nexport const UI = {\n CONVERSATION_TITLE_MAX_LENGTH: 30,\n MESSAGE_PREVIEW_MAX_LENGTH: 50,\n ANIMATION_DURATION: 300,\n} as const;\n\n/**\n * 主题相关常量\n */\nexport const THEME = {\n COLORS: {\n PRIMARY: '#4D8EFF',\n SECONDARY: '#00F0FF',\n SUCCESS: '#28D193',\n ERROR: '#FF4D7A',\n WARNING: '#FFC84D',\n },\n BREAKPOINTS: {\n MOBILE: '768px',\n TABLET: '1024px',\n DESKTOP: '1200px',\n },\n} as const;\n","import React from 'react';\nimport type { IConversation } from '../../../types/conversation';\nimport { formatTime, truncateText } from '../../../utils/format';\nimport { UI } from '../../../utils/constants';\nimport './ConversationItem.scss';\n\ninterface ConversationItemProps {\n conversation: IConversation;\n isActive: boolean;\n onClick: (id: string) => void;\n // onDelete: (id: string) => void; // Removed\n}\n\nconst ConversationItem: React.FC<ConversationItemProps> = ({\n conversation,\n isActive,\n onClick,\n // onDelete, // Removed\n}) => {\n // Use first message as title, fallback to original title\n const conversationTitle =\n conversation.messages.length > 0 && conversation.messages[0]\n ? truncateText(conversation.messages[0].content, UI.CONVERSATION_TITLE_MAX_LENGTH)\n : conversation.title;\n\n const lastMessage = conversation.messages[conversation.messages.length - 1];\n const lastMessageSnippet =\n conversation.messages.length > 0 && lastMessage\n ? truncateText(lastMessage.content, UI.MESSAGE_PREVIEW_MAX_LENGTH)\n : 'No messages yet.';\n\n const formattedLastUpdated = formatTime(conversation.lastUpdated);\n\n return (\n <div\n className={`conversation-item ${isActive ? 'active' : ''}`}\n onClick={() => onClick(conversation.id)}\n >\n <div className=\"conversation-info\">\n <div className=\"conversation-title\">\n <span>{conversationTitle}</span>\n <span className=\"conversation-time\">{formattedLastUpdated}</span>\n </div>\n <div className=\"conversation-preview\">{lastMessageSnippet}</div>\n </div>\n {/* Conditionally render badge if needed, e.g., for unread messages */}\n {/* <div className=\"conversation-badge\"></div> */}\n </div>\n );\n};\n\nexport default ConversationItem;\n","import React, { useState } from 'react';\nimport type { IMessage, IChatConfig } from '../../../types/chat';\nimport type { UploadedFile } from '../../base/FileUpload/interfaces';\nimport ChatMessagesList from '../../composite/ChatMessagesList/ChatMessagesList';\nimport ChatInputArea from '../../composite/ChatInputArea/ChatInputArea';\nimport './AIChatRoom.scss';\n\ninterface AIChatRoomProps {\n messages: IMessage[];\n onSendMessage: (message: string, files: UploadedFile[]) => void;\n isAITyping?: boolean;\n config?: IChatConfig;\n conversationTitle?: string;\n}\n\nconst AIChatRoom: React.FC<AIChatRoomProps> = ({\n messages,\n onSendMessage,\n isAITyping = false,\n config,\n conversationTitle,\n}) => {\n const [isSending, setIsSending] = useState(false);\n\n const handleSendMessage = async (message: string, files: UploadedFile[]) => {\n setIsSending(true);\n await onSendMessage(message, files);\n setIsSending(false);\n };\n\n return (\n <div className=\"chat-container\">\n {' '}\n {/* Changed class name */}\n <div className=\"chat-header\">\n <div className=\"chat-title\">{conversationTitle || '新对话'}</div>\n </div>\n <ChatMessagesList messages={messages} {...(config && { config })} />\n <ChatInputArea\n onSendMessage={handleSendMessage}\n isSending={isSending || isAITyping}\n placeholder=\"输入消息...\"\n />\n </div>\n );\n};\n\nexport default AIChatRoom;\n","import React, { useState, useMemo } from 'react';\nimport type { IConversation } from '../../../types/conversation';\nimport ConversationItem from '../../composite/ConversationItem/ConversationItem';\nimport Button from '../../base/Button/Button';\nimport './ConversationList.scss';\n\ninterface ConversationListProps {\n conversations: IConversation[];\n activeConversationId: string | null;\n onSelectConversation: (id: string) => void;\n onNewConversation: () => void;\n}\n\nconst ConversationList: React.FC<ConversationListProps> = ({\n conversations,\n activeConversationId,\n onSelectConversation,\n onNewConversation,\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n\n const filteredConversations = useMemo(() => {\n if (!searchQuery) {\n return conversations;\n }\n const lowerCaseQuery = searchQuery.toLowerCase();\n return conversations.filter(\n conv =>\n conv.title.toLowerCase().includes(lowerCaseQuery) ||\n conv.messages.some(msg => msg.content.toLowerCase().includes(lowerCaseQuery))\n );\n }, [conversations, searchQuery]);\n\n return (\n <div className=\"conversations-panel\">\n {' '}\n {/* Changed class name */}\n <div className=\"panel-header\">\n {' '}\n {/* New header structure */}\n <div className=\"panel-title\">\n <i className=\"fas fa-comments\"></i>\n 对话列表\n <Button isCircle onClick={onNewConversation} className=\"new-conversation-btn\">\n <i className=\"fas fa-plus\"></i>\n </Button>\n </div>\n <div className=\"search-container\">\n <i className=\"fas fa-search search-icon\"></i>\n <input\n type=\"text\"\n className=\"search-input\"\n placeholder=\"搜索对话...\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n />\n </div>\n </div>\n <div className=\"conversation-list\">\n {' '}\n {/* Changed class name */}\n {filteredConversations.length > 0 ? (\n filteredConversations.map(conv => (\n <ConversationItem\n key={conv.id}\n conversation={conv}\n isActive={conv.id === activeConversationId}\n onClick={onSelectConversation}\n />\n ))\n ) : (\n <div className=\"conversation-list__empty\">No conversations found.</div>\n )}\n </div>\n </div>\n );\n};\n\nexport default ConversationList;\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","self","source","owner","debugStack","debugTask","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","Avatar","src","alt","size","shape","gradient","gradientClass","jsx","Button","onClick","variant","disabled","isCircle","className","fullClassName","getFileIcon","fileName","formatFileSize","bytes","sizes","MessageBubble","id","content","sender","isLoading","files","renderContent","file","jsxs","ChatInputArea","onSendMessage","isSending","placeholder","onFilesChange","inputValue","setInputValue","useState","setFiles","fileInputRef","useRef","handleFilesChange","newFiles","handleSubmit","e","handleKeyDown","uploadedFiles","uuid","FileUpload","acceptedFileTypes","maxFiles","internalFiles","setInternalFiles","useEffect","handleFileSelect","event","selectedFiles","fileExtension","uploadedFile","updatedFiles","handleFileRemove","i","isMaxFilesReached","ChatMessage","message","isUser","avatarSrc","avatarAlt","avatarGradient","formatTime","timestamp","ChatMessagesList","messages","isLoadingMore","messagesEndRef","scrollToBottom","format","dayjs","truncateText","text","maxLength","UI","ConversationItem","conversation","isActive","conversationTitle","lastMessage","lastMessageSnippet","formattedLastUpdated","AIChatRoom","isAITyping","setIsSending","handleSendMessage","ConversationList","conversations","activeConversationId","onSelectConversation","onNewConversation","searchQuery","setSearchQuery","filteredConversations","useMemo","lowerCaseQuery","conv","msg"],"mappings":"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","x_google_ignoreList":[0,1,2]}