From 59c69e065ce97357710c904d928473dabf5ce5aa Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Mon, 3 Mar 2025 17:40:17 +0800 Subject: [PATCH] refactor: Enhance message context menu with improved text selection and copying --- .../src/pages/home/Messages/Message.tsx | 72 +++++++++---------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/Message.tsx b/src/renderer/src/pages/home/Messages/Message.tsx index b3e747b1..30363452 100644 --- a/src/renderer/src/pages/home/Messages/Message.tsx +++ b/src/renderer/src/pages/home/Messages/Message.tsx @@ -35,14 +35,6 @@ interface Props { onDeleteMessage?: (message: Message) => Promise } -const getMessageBackground = (isBubbleStyle: boolean, isAssistantMessage: boolean) => { - return isBubbleStyle - ? isAssistantMessage - ? 'var(--chat-background-assistant)' - : 'var(--chat-background-user)' - : undefined -} - const MessageItem: FC = ({ message: _message, topic: _topic, @@ -64,6 +56,7 @@ const MessageItem: FC = ({ const topic = useTopic(assistant, _topic?.id) const [contextMenuPosition, setContextMenuPosition] = useState<{ x: number; y: number } | null>(null) const [selectedQuoteText, setSelectedQuoteText] = useState('') + const [selectedText, setSelectedText] = useState('') const isLastMessage = index === 0 const isAssistantMessage = message.role === 'assistant' @@ -79,15 +72,16 @@ const MessageItem: FC = ({ const handleContextMenu = useCallback((e: React.MouseEvent) => { e.preventDefault() - const selectedText = window.getSelection()?.toString() - if (selectedText) { + const _selectedText = window.getSelection()?.toString() + if (_selectedText) { const quotedText = - selectedText + _selectedText .split('\n') .map((line) => `> ${line}`) .join('\n') + '\n-------------' setSelectedQuoteText(quotedText) setContextMenuPosition({ x: e.clientX, y: e.clientY }) + setSelectedText(_selectedText) } }, []) @@ -214,35 +208,9 @@ const MessageItem: FC = ({ onContextMenu={handleContextMenu} style={{ ...style, alignItems: isBubbleStyle ? (isAssistantMessage ? 'start' : 'end') : undefined }}> {contextMenuPosition && ( - + { - navigator.clipboard.writeText( - selectedQuoteText.replace(/^> /gm, '').replace(/\n-------------$/, '') - ) - window.message.success({ content: t('message.copied'), key: 'copy-message' }) - } - }, - { - key: 'quote', - label: t('chat.message.quote'), - onClick: () => { - EventEmitter.emit(EVENT_NAMES.QUOTE_TEXT, selectedQuoteText) - } - } - ] - }} + menu={{ items: getContextMenuItems(t, selectedQuoteText, selectedText) }} open={true} trigger={['contextMenu']}>
@@ -284,6 +252,32 @@ const MessageItem: FC = ({ ) } +const getMessageBackground = (isBubbleStyle: boolean, isAssistantMessage: boolean) => { + return isBubbleStyle + ? isAssistantMessage + ? 'var(--chat-background-assistant)' + : 'var(--chat-background-user)' + : undefined +} + +const getContextMenuItems = (t: (key: string) => string, selectedQuoteText: string, selectedText: string) => [ + { + key: 'copy', + label: t('common.copy'), + onClick: () => { + navigator.clipboard.writeText(selectedText) + window.message.success({ content: t('message.copied'), key: 'copy-message' }) + } + }, + { + key: 'quote', + label: t('chat.message.quote'), + onClick: () => { + EventEmitter.emit(EVENT_NAMES.QUOTE_TEXT, selectedQuoteText) + } + } +] + const MessageContainer = styled.div` display: flex; flex-direction: column;