Fix: Pass Copied Content as prop

Add prop to fence component called content which will
hold the content contained within the fence component.

Update code snippet component so that it filters the fence components
passed to it as children to only display the fence component that
is same language as the selected language and pass the content prop
of the fence component to the copy code button component on each
render of the snippet component.
This commit is contained in:
Stevan Freeborn committed 2023-04-26 19:31:15 -05:00
1 parent 538d5f675b
commit 1c5d57e4ed
2 files changed
+23 -21

No files matched your search

+22 -21
View File
@@ -3,12 +3,17 @@
import React, { import React, {
Children, Children,
MouseEvent, MouseEvent,
ReactElement,
ReactNode, ReactNode,
useState, useState,
} from 'react'; } from 'react';
import styles from './CodeSnippet.module.css'; import styles from './CodeSnippet.module.css';
function CodeSnippetCopyButton() { function CodeSnippetCopyButton({
copyText,
}: {
copyText: string;
}) {
const [copyButtonTooltip, setCopyButtonTooltip] = const [copyButtonTooltip, setCopyButtonTooltip] =
useState<boolean>(false); useState<boolean>(false);
@@ -21,13 +26,7 @@ function CodeSnippetCopyButton() {
setCopyButtonTooltip(false); setCopyButtonTooltip(false);
}, 1000); }, 1000);
const target = e.currentTarget; navigator.clipboard.writeText(copyText ?? '');
const code =
target.parentElement?.parentElement?.parentElement?.parentElement?.querySelector(
'pre'
)?.innerText ?? '';
navigator.clipboard.writeText(code);
}; };
return ( return (
@@ -130,6 +129,17 @@ export default function CodeSnippet({
setSelectedLanguage(e.target.value); setSelectedLanguage(e.target.value);
}; };
const code = Children.toArray(children)
.filter(
child =>
React.isValidElement(child) &&
child.props.className ===
`language-${selectedLanguage}`
)
.map(child => {
return child as ReactElement;
})[0];
const snippetLanguages = Children.toArray(children).map( const snippetLanguages = Children.toArray(children).map(
child => { child => {
if (React.isValidElement(child)) { if (React.isValidElement(child)) {
@@ -165,22 +175,13 @@ export default function CodeSnippet({
<div className={styles.spacer} /> <div className={styles.spacer} />
</> </>
) : null} ) : null}
<CodeSnippetCopyButton /> <CodeSnippetCopyButton
copyText={code.props.content}
/>
</div> </div>
</div> </div>
<div className={styles.snippetContent}> <div className={styles.snippetContent}>
<pre> <pre>{code}</pre>
{Children.toArray(children)
.filter(
child =>
React.isValidElement(child) &&
child.props.className ===
`language-${selectedLanguage}`
)
.map(child => {
return child;
})}
</pre>
</div> </div>
</div> </div>
); );
+1
View File
@@ -21,6 +21,7 @@ export default function Fence({
<code <code
className={`language-${language}`} className={`language-${language}`}
dangerouslySetInnerHTML={{ __html: html }} dangerouslySetInnerHTML={{ __html: html }}
content={content}
></code> ></code>
); );
} }