forked from wso2/integration-control-plane
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodeBoxWithCopy.tsx
More file actions
76 lines (70 loc) · 2.26 KB
/
CodeBoxWithCopy.tsx
File metadata and controls
76 lines (70 loc) · 2.26 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
/*
* Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com).
*
* WSO2 LLC. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import React, { useState, useRef, useEffect } from 'react';
import { Box, IconButton } from '@wso2/oxygen-ui';
import { Check, Copy } from '@wso2/oxygen-ui-icons-react';
interface CodeBoxWithCopyProps {
code: string;
}
const CodeBoxWithCopy: React.FC<CodeBoxWithCopyProps> = ({ code }) => {
const [copied, setCopied] = useState(false);
const copyTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const handleCopy = async () => {
if (copyTimeoutRef.current) {
clearTimeout(copyTimeoutRef.current);
}
try {
await navigator.clipboard.writeText(code);
setCopied(true);
copyTimeoutRef.current = setTimeout(() => setCopied(false), 2000);
} catch (err) {
// Optionally, show a fallback UI or error message
// For now, just log the error
console.error('Failed to copy to clipboard:', err);
}
};
useEffect(() => {
return () => {
if (copyTimeoutRef.current) {
clearTimeout(copyTimeoutRef.current);
}
};
}, []);
return (
<Box sx={{ position: 'relative', my: 1 }}>
<Box
component="pre"
sx={{
p: 2,
bgcolor: 'action.hover',
borderRadius: 1,
overflow: 'auto',
fontSize: 13,
fontFamily: 'monospace',
whiteSpace: 'pre-wrap',
wordBreak: 'break-all',
}}>
{code}
</Box>
<IconButton size="small" onClick={handleCopy} sx={{ position: 'absolute', top: 8, right: 8 }} aria-label="Copy">
{copied ? <Check size={16} /> : <Copy size={16} />}
</IconButton>
</Box>
);
};
export default CodeBoxWithCopy;