Files
solana/explorer/src/components/Copyable.tsx

59 lines
1.3 KiB
TypeScript
Raw Normal View History

import React, { useState, ReactNode } from "react";
type CopyableProps = {
text: string;
children: ReactNode;
2020-05-02 12:55:12 +08:00
bottom?: boolean;
right?: boolean;
};
2020-04-22 22:01:56 +08:00
type State = "hide" | "copy" | "copied";
2020-05-23 16:47:35 +08:00
function Popover({
state,
bottom,
2020-06-24 16:07:47 +08:00
right,
2020-05-23 16:47:35 +08:00
}: {
state: State;
bottom?: boolean;
right?: boolean;
}) {
2020-04-22 22:01:56 +08:00
if (state === "hide") return null;
const text = state === "copy" ? "Copy" : "Copied!";
return (
2020-05-23 16:47:35 +08:00
<div
className={`popover bs-popover-${bottom ? "bottom" : "top"}${
right ? " right" : ""
} show`}
>
<div className={`arrow${right ? " right" : ""}`} />
2020-04-22 22:01:56 +08:00
<div className="popover-body">{text}</div>
</div>
);
}
function Copyable({ bottom, right, text, children }: CopyableProps) {
2020-04-22 22:01:56 +08:00
const [state, setState] = useState<State>("hide");
const copyToClipboard = () => navigator.clipboard.writeText(text);
const handleClick = () =>
copyToClipboard().then(() => {
2020-04-22 22:01:56 +08:00
setState("copied");
setTimeout(() => setState("hide"), 1000);
});
return (
2020-05-02 12:55:12 +08:00
<div
className="popover-container c-pointer"
2020-05-02 12:55:12 +08:00
onClick={handleClick}
onMouseOver={() => setState("copy")}
onMouseOut={() => state === "copy" && setState("hide")}
>
{children}
<Popover bottom={bottom} right={right} state={state} />
</div>
);
}
export default Copyable;