import { memo } from 'preact/compat'; import { useCallback, useEffect, useState } from 'preact/hooks'; import { cn } from '~web/utils/helpers'; import { Icon } from '../icon'; interface CopyToClipboardProps { text: string; children?: (props: { ClipboardIcon: JSX.Element; onClick: (e: MouseEvent) => void; }) => JSX.Element; onCopy?: (success: boolean, text: string) => void; className?: string; iconSize?: number; } export const CopyToClipboard = /* @__PURE__ */ memo( ({ text, children, onCopy, className, iconSize = 14, }: CopyToClipboardProps): JSX.Element => { const [isCopied, setIsCopied] = useState(false); useEffect(() => { if (isCopied) { const timeout = setTimeout(() => setIsCopied(false), 600); return () => { clearTimeout(timeout); }; } }, [isCopied]); const copyToClipboard = useCallback( (e: MouseEvent) => { e.preventDefault(); e.stopPropagation(); navigator.clipboard.writeText(text).then( () => { setIsCopied(true); onCopy?.(true, text); }, () => { onCopy?.(false, text); }, ); }, [text, onCopy], ); const ClipboardIcon = ( ); if (!children) { return ClipboardIcon; } return children({ ClipboardIcon, onClick: copyToClipboard, }); }, );