Skip to content

Commit 2d75fb0

Browse files
committed
copy code button
1 parent 4612721 commit 2d75fb0

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

src/components/ui/TitleHeader.jsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Fragment } from 'react';
1+
import { Fragment, useState, useEffect } from 'react';
22

33
import Chip from '@material-ui/core/Chip';
44
import FormControlLabel from '@material-ui/core/FormControlLabel';
@@ -9,6 +9,7 @@ import Tooltip from '@material-ui/core/Tooltip';
99
import Typography from '@material-ui/core/Typography';
1010
import AccessibilityIcon from '@material-ui/icons/Accessibility';
1111
import ArrowForwardIos from '@material-ui/icons/ArrowForwardIos';
12+
import CheckIcon from '@material-ui/icons/Check';
1213
import CloudDownloadIcon from '@material-ui/icons/CloudDownload';
1314
import CodeIcon from '@material-ui/icons/Code';
1415
import DeleteForever from '@material-ui/icons/DeleteForever';
@@ -21,8 +22,29 @@ import withUI from '../../hoc/withUI';
2122
import ExternalIdLink from '../externalid/ExternalIdLink';
2223

2324
import CodeModal from './CodeModal';
25+
import CopyIcon from './CopyIcon';
2426
import Menu, { MenuItem } from './Menu';
2527

28+
function CopyCodeIcon({ code }) {
29+
const [isCopied, setIsCopied] = useState(false);
30+
const onClick = () => {
31+
navigator.clipboard.writeText(typeof code === 'object' ? JSON.stringify(code, null, 2) : code);
32+
setIsCopied(true);
33+
};
34+
useEffect(() => {
35+
if (isCopied === false) return undefined;
36+
const timerId = setTimeout(() => setIsCopied(false), 3000); // 2-second delay
37+
return () => {
38+
clearTimeout(timerId);
39+
};
40+
}, [isCopied]);
41+
return (
42+
<Tooltip title={isCopied === true ? 'Copied' : 'Copy to clipboard'}>
43+
<IconButton onClick={onClick}>{isCopied ? <CheckIcon /> : <CopyIcon />}</IconButton>
44+
</Tooltip>
45+
);
46+
}
47+
2648
function TitleMenu({ menuList = [], onOpen }) {
2749
if (!Array.isArray(menuList) || menuList.length < 1) return null;
2850
return (
@@ -208,6 +230,10 @@ function TitleHeader({
208230
</Tooltip>
209231
);
210232
}
233+
let copyCodeComponent;
234+
if (code) {
235+
copyCodeComponent = <CopyCodeIcon code={code} />;
236+
}
211237
const autoRefreshSwitch = onChangeAutoRefresh && (
212238
<FormControlLabel
213239
control={<Switch checked={autoRefresh} onChange={onChangeAutoRefresh} />}
@@ -297,6 +323,7 @@ function TitleHeader({
297323
{openAddAccess}
298324
{openExternalId}
299325
{openCodeComponent}
326+
{copyCodeComponent}
300327
{refeshAction}
301328
{iconList}
302329
{action}

0 commit comments

Comments
 (0)