diff --git a/src/components/Clippy.tsx b/src/components/Clippy.tsx index 86ba87f..eacc560 100644 --- a/src/components/Clippy.tsx +++ b/src/components/Clippy.tsx @@ -18,17 +18,24 @@ export function Clippy({ codeSnippetElement }: Props) { return () => window.clearTimeout(timer) }, [status]) - const onClippyClick = React.useCallback(function onClippyClick() { - if (copyElementContent(codeSnippetElement)) { - setStatus('success') - } else { - setStatus('fail') + // Temporary fix: + // React moved root node of event delegation since v17 + // onClick on won't work when rendered with `renderReact` + const elementRef = React.useRef(null) + React.useEffect(() => { + const element = elementRef.current + if (element) { + function onClippyClick() { + setStatus(copyElementContent(codeSnippetElement) ? 'success' : 'fail') + } + element.addEventListener('click', onClippyClick) + return () => element.removeEventListener('click', onClippyClick) } }, []) return (
-
diff --git a/src/platforms/GitHub/CopyFileButton.tsx b/src/platforms/GitHub/CopyFileButton.tsx index ce124dd..d7ec994 100644 --- a/src/platforms/GitHub/CopyFileButton.tsx +++ b/src/platforms/GitHub/CopyFileButton.tsx @@ -8,12 +8,12 @@ type Props = {} const className = 'gitako-copy-file-button' export const copyFileButtonClassName = className +const contents = { + success: 'Success!', + error: 'Copy failed!', + normal: 'Copy file', +} export function CopyFileButton(props: React.PropsWithChildren) { - const contents = { - success: 'Success!', - error: 'Copy failed!', - normal: 'Copy file', - } const [content, setContent] = React.useState(contents.normal) React.useEffect(() => { if (content !== contents.normal) { @@ -23,20 +23,27 @@ export function CopyFileButton(props: React.PropsWithChildren) { return () => clearTimeout(timer) } }, [content]) - return ( -
{ + + const elementRef = React.useRef(null) + React.useEffect(() => { + // Temporary fix: + // React moved root node of event delegation since v17 + // onClick on won't work when rendered with `renderReact` + const element = elementRef.current + if (element) { + function copyCode() { const codeElement = getCodeElement() if (codeElement) { - if (copyElementContent(codeElement)) { - setContent(contents.success) - } else { - setContent(contents.error) - } + setContent(copyElementContent(codeElement) ? contents.success : contents.error) } - }} - > + } + element.addEventListener('click', copyCode) + return () => element.removeEventListener('click', copyCode) + } + }, []) + + return ( + {content} )