From 8fd3830b9dc5ea55c8dd2f367b0d866712f4d027 Mon Sep 17 00:00:00 2001 From: try2love <161727775+try2love@users.noreply.github.com> Date: Thu, 11 Dec 2025 20:09:42 +0800 Subject: [PATCH] Fix/clipboard (#189) * bugfix: clipboard error bug * fix: use try-catch fallback for clipboard API instead of feature detection --------- Co-authored-by: dayuan.jiang --- components/chat-message-display.tsx | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/components/chat-message-display.tsx b/components/chat-message-display.tsx index 2ce33be..0f0f11f 100644 --- a/components/chat-message-display.tsx +++ b/components/chat-message-display.tsx @@ -216,9 +216,29 @@ export function ChatMessageDisplay({ setCopiedMessageId(messageId) setTimeout(() => setCopiedMessageId(null), 2000) } catch (err) { - console.error("Failed to copy message:", err) - setCopyFailedMessageId(messageId) - setTimeout(() => setCopyFailedMessageId(null), 2000) + // Fallback for non-secure contexts (HTTP) or permission denied + const textarea = document.createElement("textarea") + textarea.value = text + textarea.style.position = "fixed" + textarea.style.left = "-9999px" + textarea.style.opacity = "0" + document.body.appendChild(textarea) + + try { + textarea.select() + const success = document.execCommand("copy") + if (!success) { + throw new Error("Copy command failed") + } + setCopiedMessageId(messageId) + setTimeout(() => setCopiedMessageId(null), 2000) + } catch (fallbackErr) { + console.error("Failed to copy message:", fallbackErr) + setCopyFailedMessageId(messageId) + setTimeout(() => setCopyFailedMessageId(null), 2000) + } finally { + document.body.removeChild(textarea) + } } }