import { createSignal, onCleanup, splitProps } from 'solid-js'; import type { JSX } from 'solid-js'; interface CopyButtonProps extends JSX.ButtonHTMLAttributes { text: string; children: JSX.Element; } export function CopyButton(props: CopyButtonProps) { const [local, others] = splitProps(props, ['text', 'children', 'class', 'onClick']); const [copied, setCopied] = createSignal(false); let resetTimeout: number | undefined; const handleClick = async (event: MouseEvent) => { const handler = local.onClick as | ((event: MouseEvent) => void) | { handleEvent?: (event: MouseEvent) => void } | undefined; if (typeof handler === 'function') { handler(event); } else if (handler && typeof handler.handleEvent === 'function') { handler.handleEvent(event); } if (event.defaultPrevented) { return; } try { await navigator.clipboard.writeText(local.text); setCopied(true); window.clearTimeout(resetTimeout); resetTimeout = window.setTimeout(() => setCopied(false), 2000); } catch (error) { console.error('Failed to copy to clipboard', error); } }; onCleanup(() => { if (resetTimeout) { window.clearTimeout(resetTimeout); } }); return ( ); } export default CopyButton;