From e05a3991772f2099e298761dbb57f71a543bad43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aneta=20Jastrz=C4=99bska?= <1544710+anetaj@users.noreply.github.com> Date: Sat, 21 Sep 2024 13:03:31 +0200 Subject: [PATCH] add copy button --- .../src/sidebar/MarkdownRender/BlockCode.tsx | 74 +++++++++++++++++++ .../void/src/sidebar/MarkdownRender/index.ts | 2 + 2 files changed, 76 insertions(+) create mode 100644 extensions/void/src/sidebar/MarkdownRender/BlockCode.tsx create mode 100644 extensions/void/src/sidebar/MarkdownRender/index.ts diff --git a/extensions/void/src/sidebar/MarkdownRender/BlockCode.tsx b/extensions/void/src/sidebar/MarkdownRender/BlockCode.tsx new file mode 100644 index 00000000..812c7e2a --- /dev/null +++ b/extensions/void/src/sidebar/MarkdownRender/BlockCode.tsx @@ -0,0 +1,74 @@ +import React, { useCallback, useEffect, useState } from "react" +import { getVSCodeAPI } from "../getVscodeApi" + +enum CopyButtonState { + Copy = "Copy", + Copied = "Copied!", + Error = "Could not copy", +} + +const COPY_FEEDBACK_TIMEOUT = 2000 + +// code block with Apply button at top +const BlockCode = ({ + text, + disableApplyButton = false, +}: { + text: string + disableApplyButton?: boolean +}) => { + const [copyButtonState, setCopyButtonState] = useState(CopyButtonState.Copy) + + useEffect(() => { + if (copyButtonState !== CopyButtonState.Copy) { + setTimeout(() => { + setCopyButtonState(CopyButtonState.Copy) + }, COPY_FEEDBACK_TIMEOUT) + } + }, [copyButtonState]) + + const onCopy = useCallback(() => { + navigator.clipboard.writeText(text).then( + () => { + setCopyButtonState(CopyButtonState.Copied) + }, + () => { + setCopyButtonState(CopyButtonState.Error) + } + ) + }, [text]) + + return ( +
{text}
+