diff --git a/packages/core/src/modules/clipboard.ts b/packages/core/src/modules/clipboard.ts index a7129fc5..22a0e739 100644 --- a/packages/core/src/modules/clipboard.ts +++ b/packages/core/src/modules/clipboard.ts @@ -18,6 +18,11 @@ export default class clipboard { ele.focus({ preventScroll: true }); document.execCommand("selectAll"); document.execCommand("copy"); + + // Fallback setup + const plainText = ele.innerText || ele.textContent || ""; // In order to match the clipboard which only stores the visible text without formatting + sessionStorage.setItem("localClipboard", plainText); // Also store in sessionStorage for fallback access + setTimeout(() => { ele?.blur(); previouslyFocusedElement?.focus?.(); diff --git a/packages/react/src/components/ContextMenu/index.tsx b/packages/react/src/components/ContextMenu/index.tsx index 640a6cd1..1ce1cfef 100644 --- a/packages/react/src/components/ContextMenu/index.tsx +++ b/packages/react/src/components/ContextMenu/index.tsx @@ -66,9 +66,22 @@ const ContextMenu: React.FC = () => { { - const clipboardText = await navigator.clipboard.readText(); + let clipboardText = ""; + const sessionClipboardText = + sessionStorage.getItem("localClipboard") || ""; + + try { + clipboardText = await navigator.clipboard.readText(); + } catch (err) { + console.warn( + "Clipboard access blocked. Attempting to use sessionStorage fallback." + ); + } + + const finalText = clipboardText || sessionClipboardText; + setContext((draftCtx) => { - handlePasteByClick(draftCtx, clipboardText); + handlePasteByClick(draftCtx, finalText); draftCtx.contextMenu = {}; }); }}