import { SerializedEditorState } from 'lexical' import { Pencil } from 'lucide-react' import React, { useState } from 'react' import { Mentionable } from '../../types/mentionable' import { editorStateToPlainText } from './chat-input/utils/editor-state-to-plain-text' import { getMentionableIcon } from './chat-input/utils/get-metionable-icon' interface UserMessageViewProps { content: SerializedEditorState | null mentionables: Mentionable[] onEdit: () => void } const UserMessageView: React.FC = ({ content, mentionables, onEdit, }) => { const [isExpanded, setIsExpanded] = useState(false) // 将编辑器状态转换为纯文本 const plainText = content ? editorStateToPlainText(content) : '' // 判断是否需要截断(超过2行或超过80个字符) const lines = plainText.split('\n') const needsTruncation = lines.length > 3 || plainText.length > 80 // 显示的文本内容 let displayText = plainText if (needsTruncation && !isExpanded) { // 取前2行或前80个字符,取较小值 const truncatedByLines = lines.slice(0, 2).join('\n') displayText = truncatedByLines.length > 80 ? plainText.substring(0, 80) + '...' : truncatedByLines + (lines.length > 2 ? '...' : '') } return (
{/* 显示 mentionables */} {mentionables.length > 0 && (
{mentionables.map((mentionable, index) => { const Icon = getMentionableIcon(mentionable) return ( {Icon && } {mentionable.type === 'current-file' && ( {mentionable.file.name} )} {mentionable.type === 'vault' && ( Vault )} {mentionable.type === 'block' && ( {mentionable.file.name} )} {mentionable.type === 'file' && ( {mentionable.file.name} )} {mentionable.type === 'folder' && ( {mentionable.folder.name} )} {mentionable.type === 'url' && ( {mentionable.url} )} {mentionable.type === 'image' && ( {mentionable.name} )} ) })}
)} {/* 显示文本内容 */}
{displayText}
{/* {needsTruncation && ( )} */}
{/* 编辑按钮 */}
) } export default UserMessageView