forked from patternfly/patternfly-quickstarts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMarkdownCopyClipboard.tsx
More file actions
88 lines (80 loc) · 2.52 KB
/
MarkdownCopyClipboard.tsx
File metadata and controls
88 lines (80 loc) · 2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { FC, useCallback, useContext, useMemo, useState } from 'react';
import { Tooltip } from '@patternfly/react-core';
import { QuickStartContext, QuickStartContextValues } from '@quickstarts/utils/quick-start-context';
import { useEventListener } from '../../hooks';
import { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';
interface CopyClipboardProps {
element: HTMLElement;
rootSelector: string;
docContext: Document;
}
export const CopyClipboard: FC<CopyClipboardProps> = ({ element, rootSelector, docContext }) => {
const { getResource } = useContext<QuickStartContextValues>(QuickStartContext);
const [showSuccessContent, setShowSuccessContent] = useState<boolean>(false);
const textToCopy = useMemo(() => {
const copyTextId = element.getAttribute(MARKDOWN_COPY_BUTTON_ID);
return (
docContext.querySelector(
`${rootSelector} [${MARKDOWN_SNIPPET_ID}="${copyTextId}"]`,
) as HTMLElement
)?.innerText;
}, [element, docContext, rootSelector]);
useEventListener(
element,
'click',
useCallback(() => {
navigator.clipboard
.writeText(textToCopy.trim())
.then(() => {
setShowSuccessContent(true);
})
.catch(() => {});
}, [textToCopy]),
);
useEventListener(
element,
'mouseleave',
useCallback(() => {
setShowSuccessContent(false);
}, []),
);
return showSuccessContent ? (
<Tooltip
key="after-copy"
isVisible
triggerRef={() => element as HTMLElement}
content={getResource('Successfully copied to clipboard!')}
className="pfext-quick-start__base"
/>
) : (
<Tooltip
key="before-copy"
triggerRef={() => element as HTMLElement}
content={getResource('Copy to clipboard')}
className="pfext-quick-start__base"
/>
);
};
interface MarkdownCopyClipboardProps {
docContext: Document;
rootSelector: string;
}
const MarkdownCopyClipboard: FC<MarkdownCopyClipboardProps> = ({ docContext, rootSelector }) => {
const elements = docContext.querySelectorAll(`${rootSelector} [${MARKDOWN_COPY_BUTTON_ID}]`);
return elements.length > 0 ? (
<>
{Array.from(elements).map((elm) => {
const attributeValue = elm.getAttribute(MARKDOWN_COPY_BUTTON_ID);
return (
<CopyClipboard
key={attributeValue}
element={elm as HTMLElement}
rootSelector={rootSelector}
docContext={docContext}
/>
);
})}
</>
) : null;
};
export default MarkdownCopyClipboard;