Rename signature to be more generic (and less wrong); Make copyable accept children

This commit is contained in:
Nick Brown 2020-04-17 22:58:56 -07:00 committed by Michael Vines
parent 0cef795107
commit 459b4d06fe
5 changed files with 46 additions and 37 deletions

View File

@ -11,7 +11,7 @@ import { assertUnreachable } from "../utils";
import { displayAddress } from "../utils/tx"; import { displayAddress } from "../utils/tx";
import { useCluster } from "../providers/cluster"; import { useCluster } from "../providers/cluster";
import { PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js"; import { PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";
import Signature from "./Signature"; import Copyable from "./Copyable";
function AccountsCard() { function AccountsCard() {
const { accounts, idCounter } = useAccounts(); const { accounts, idCounter } = useAccounts();
@ -148,6 +148,7 @@ const renderAccountRow = (account: Account) => {
balance = `${(1.0 * account.lamports) / LAMPORTS_PER_SOL}`; balance = `${(1.0 * account.lamports) / LAMPORTS_PER_SOL}`;
} }
const base58AccountPubkey = account.pubkey.toBase58()
return ( return (
<tr key={account.id}> <tr key={account.id}>
<td> <td>
@ -157,7 +158,9 @@ const renderAccountRow = (account: Account) => {
<span className={`badge badge-soft-${statusClass}`}>{statusText}</span> <span className={`badge badge-soft-${statusClass}`}>{statusText}</span>
</td> </td>
<td> <td>
<Signature text={account.pubkey.toBase58()} /> <Copyable text={base58AccountPubkey}>
<code>{base58AccountPubkey}</code>
</Copyable>
</td> </td>
<td>{balance}</td> <td>{balance}</td>
<td>{data}</td> <td>{data}</td>

View File

@ -0,0 +1,36 @@
import React, { useState, ReactNode } from "react";
type CopyableProps = {
text: string
children: ReactNode
}
const popover = (
<div className="popover fade bs-popover-right show">
<div className="arrow" />
<div className="popover-body">Copied!</div>
</div>
);
function Copyable({ text, children }: CopyableProps) {
const [showPopover, setShowPopover] = useState(false);
const copyToClipboard = () => navigator.clipboard.writeText(text);
const handleClick = () =>
copyToClipboard()
.then(() => {
setShowPopover(true);
setTimeout(setShowPopover.bind(null, false), 2500);
});
return (
<div className="copyable">
<div onClick={handleClick}>
{children}
</div>
{showPopover && popover}
</div>
);
}
export default Copyable;

View File

@ -1,32 +0,0 @@
import React, { useState } from "react";
type SignatureProps = {
text: string;
};
const popover = (
<div className="popover fade bs-popover-right show">
<div className="arrow" />
<div className="popover-body">Copied!</div>
</div>
);
function Signature({ text }: SignatureProps) {
const [showPopover, setShowPopover] = useState(false);
const copyToClipboard = () => navigator.clipboard.writeText(text);
const handleClick = () =>
copyToClipboard().then(() => {
setShowPopover(true);
setTimeout(setShowPopover.bind(null, false), 2500);
});
return (
<div className="signature">
<code onClick={handleClick}>{text}</code>
{showPopover && popover}
</div>
);
}
export default Signature;

View File

@ -10,7 +10,7 @@ import {
import bs58 from "bs58"; import bs58 from "bs58";
import { assertUnreachable } from "../utils"; import { assertUnreachable } from "../utils";
import { useCluster } from "../providers/cluster"; import { useCluster } from "../providers/cluster";
import Signature from "./Signature"; import Copyable from "./Copyable";
function TransactionsCard() { function TransactionsCard() {
const { transactions, idCounter } = useTransactions(); const { transactions, idCounter } = useTransactions();
@ -193,7 +193,9 @@ const renderTransactionRow = (
<span className={`badge badge-soft-${statusClass}`}>{statusText}</span> <span className={`badge badge-soft-${statusClass}`}>{statusText}</span>
</td> </td>
<td> <td>
<Signature text={transaction.signature} /> <Copyable text={transaction.signature}>
<code>{transaction.signature}</code>
</Copyable>
</td> </td>
<td className="text-uppercase">{confirmationsText}</td> <td className="text-uppercase">{confirmationsText}</td>
<td>{slotText}</td> <td>{slotText}</td>

View File

@ -10,7 +10,7 @@ code {
color: $black; color: $black;
} }
.signature { .copyable {
position: relative; position: relative;
&:hover { &:hover {