Skip to content

Commit 60cb0d5

Browse files
committed
create CopyButton component
1 parent 7d2848c commit 60cb0d5

File tree

4 files changed

+38
-43
lines changed

4 files changed

+38
-43
lines changed

components/AddressSvmTable.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import copy from "copy-to-clipboard";
2-
import CopyIcon from "./icons/CopyIcon";
1+
import CopyButton from "./CopyButton";
32
import { StyledTd } from "./Table";
43

54
const AddressSvmTable = ({
@@ -34,13 +33,7 @@ const AddressSvmTable = ({
3433
{value}
3534
</code>
3635
)}
37-
38-
<button
39-
onClick={() => copy(value)}
40-
className="p-1 hover:bg-light dark:hover:bg-dark rounded"
41-
>
42-
<CopyIcon className="shrink-0" />
43-
</button>
36+
<CopyButton value={value} className="ml-2" />
4437
</StyledTd>
4538
</tr>
4639
);

components/CopyAddress.tsx

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
1-
import CopyIcon from "./icons/CopyIcon";
2-
import { useCopyToClipboard } from "../utils/useCopyToClipboard";
1+
import CopyButton from "./CopyButton";
32

43
const CopyAddress = ({ address, url }: { address: string; url?: string }) => {
5-
const { copiedText, copyToClipboard } = useCopyToClipboard();
6-
const isCopied = copiedText === address;
7-
84
return (
9-
<div
10-
className="-ml-1 inline-flex cursor-pointer items-center px-1 font-mono hover:bg-light hover:text-dark dark:hover:bg-dark dark:hover:text-light"
11-
onClick={() => {
12-
copyToClipboard(address);
13-
}}
14-
>
5+
<CopyButton value={address} className="-ml-1">
156
<span className="mr-2 hidden lg:block">
167
{url ? (
178
<a href={url} target="_blank" rel="noopener noreferrer">
@@ -30,12 +21,7 @@ const CopyAddress = ({ address, url }: { address: string; url?: string }) => {
3021
address.slice(0, 6) + "..." + address.slice(-6)
3122
)}
3223
</span>
33-
{isCopied ? (
34-
<span className="text-green-500 text-xs font-bold"></span>
35-
) : (
36-
<CopyIcon className="shrink-0" />
37-
)}
38-
</div>
24+
</CopyButton>
3925
);
4026
};
4127

components/CopyButton.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import React from "react";
2+
import CopyIcon from "./icons/CopyIcon";
3+
import { useCopyToClipboard } from "../utils/useCopyToClipboard";
4+
5+
interface CopyButtonProps {
6+
value: string;
7+
className?: string;
8+
children?: React.ReactNode;
9+
}
10+
11+
const CopyButton = ({ value, className = "", children }: CopyButtonProps) => {
12+
const { copiedText, copyToClipboard } = useCopyToClipboard();
13+
const isCopied = copiedText === value;
14+
15+
return (
16+
<button
17+
type="button"
18+
className={`inline-flex items-center cursor-pointer px-1 font-mono hover:bg-light hover:text-dark dark:hover:bg-dark dark:hover:text-light ${className}`}
19+
onClick={() => copyToClipboard(value)}
20+
>
21+
{children && <span className="mr-2">{children}</span>}
22+
{isCopied ? (
23+
<span className="text-green-500 text-xs font-bold"></span>
24+
) : (
25+
<CopyIcon className="shrink-0" />
26+
)}
27+
</button>
28+
);
29+
};
30+
31+
export default CopyButton;

components/SponsoredFeedsTableWithData.tsx

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from "react";
2-
import CopyIcon from "./icons/CopyIcon";
2+
import CopyButton from "./CopyButton";
33
import { mapValues } from "../utils/ObjectHelpers";
4-
import { useCopyToClipboard } from "../utils/useCopyToClipboard";
54

65
// SponsoredFeed interface has the same structure as defined in deployment yaml/json files
76
interface SponsoredFeed {
@@ -92,8 +91,6 @@ export const SponsoredFeedsTable = ({
9291
feeds,
9392
networkName,
9493
}: SponsoredFeedsTableProps) => {
95-
const { copiedText, copyToClipboard } = useCopyToClipboard();
96-
9794
// Handle empty feeds
9895
if (feeds.length === 0) {
9996
return (
@@ -186,19 +183,7 @@ export const SponsoredFeedsTable = ({
186183
<code className="text-xs font-mono text-gray-600 dark:text-gray-400 flex-1 break-all leading-relaxed">
187184
{feed.id}
188185
</code>
189-
<button
190-
onClick={() => copyToClipboard(feed.id)}
191-
className="p-1 hover:bg-gray-200 dark:hover:bg-gray-600 rounded flex-shrink-0 mt-0.5"
192-
title="Copy Price Feed ID"
193-
>
194-
{copiedText === feed.id ? (
195-
<span className="text-green-500 text-xs font-bold">
196-
197-
</span>
198-
) : (
199-
<CopyIcon className="w-3 h-3 text-gray-400" />
200-
)}
201-
</button>
186+
<CopyButton value={feed.id} className="ml-2" />
202187
</div>
203188
</td>
204189
<td className="px-3 py-2 align-top">

0 commit comments

Comments
 (0)