Skip to content

Commit c950646

Browse files
committed
Add copy-to-clipboard button for user messages
Introduces a copy button to user chat messages, allowing users to easily copy their message content. The button provides visual feedback when the content is successfully copied.
1 parent e212aa3 commit c950646

1 file changed

Lines changed: 26 additions & 3 deletions

File tree

src/components/ChatMessage.tsx

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import { memo } from 'react';
1+
'use client';
2+
3+
import { memo, useState } from 'react';
24
import { ModelResponse, Model, Message } from '@/types';
35
import { SynthesizedResponse } from './SynthesizedResponse';
46
import { ResponsePanel } from './ResponsePanel';
5-
import { User, Sparkles, Info } from 'lucide-react';
7+
import { User, Sparkles, Info, Copy, Check } from 'lucide-react';
68
import { MarkdownRenderer } from './MarkdownRenderer';
79

810
interface ChatMessageProps {
@@ -30,9 +32,30 @@ export const ChatMessage = memo(function ChatMessage({
3032
synthesisPromptData
3133
}: ChatMessageProps) {
3234

35+
const [copiedUser, setCopiedUser] = useState(false);
36+
37+
const handleCopyUser = async () => {
38+
if (!content) return;
39+
try {
40+
await navigator.clipboard.writeText(content);
41+
setCopiedUser(true);
42+
setTimeout(() => setCopiedUser(false), 2000);
43+
} catch (error) {
44+
console.error('Failed to copy:', error);
45+
}
46+
};
47+
3348
if (role === 'user') {
3449
return (
35-
<div className="chat-message user-message">
50+
<div className="chat-message user-message group">
51+
<button
52+
onClick={handleCopyUser}
53+
className="opacity-0 group-hover:opacity-100 transition-opacity p-2 text-text-tertiary hover:text-text-primary self-start mt-1 mr-1"
54+
aria-label="Copy message"
55+
title="Copy message"
56+
>
57+
{copiedUser ? <Check size={16} /> : <Copy size={16} />}
58+
</button>
3659
<div className="message-content user-content">
3760
<MarkdownRenderer content={content} forceNewlines={true} />
3861
</div>

0 commit comments

Comments
 (0)