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}
)