import { css, cx } from "@emotion/css"; import { Copy as CopyIcon, ClipboardPaste as CopiedIcon } from "lucide-react"; import copy from "copy-to-clipboard"; import React from "react"; export enum CopyStatus { PENDING = 0, COPYING = 1, COPIED = 2, FAILED = 3, } export interface ICopyButtonProperties { delay?: number; className?: string; calcContentForCopy: () => string; } export const CopyButton: React.FC = properties => { const { className, delay = 1500, calcContentForCopy } = properties; const [status, setStatus] = React.useState(CopyStatus.PENDING); const disabled: boolean = status !== CopyStatus.PENDING; const onCopy = () => { if (status === CopyStatus.PENDING) { setStatus(CopyStatus.COPYING); try { const contentForCopy: string = calcContentForCopy(); copy(contentForCopy); setStatus(CopyStatus.COPIED); } catch { setStatus(CopyStatus.FAILED); } } }; React.useEffect((): (() => void) | undefined => { if (status === CopyStatus.COPIED || status === CopyStatus.FAILED) { const timer = setTimeout(() => setStatus(CopyStatus.PENDING), delay); return () => { if (timer) { clearTimeout(timer); } }; } return undefined; }, [status, delay]); return ( ); }; const classes = { copyButton: css({ cursor: "pointer", }), };