import { createSignal, onCleanup, splitProps } from 'solid-js'; import type { JSX } from 'solid-js'; import { copyToClipboard } from '@/utils/clipboard'; import { logger } from '@/utils/logger'; interface CopyButtonProps extends JSX.ButtonHTMLAttributes { text: string; children: JSX.Element; onCopied?: () => void; } export function CopyButton(props: CopyButtonProps) { const [local, others] = splitProps(props, ['text', 'children', 'class', 'onClick', 'onCopied']); 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; } const success = await copyToClipboard(local.text); if (success) { setCopied(true); window.clearTimeout(resetTimeout); resetTimeout = window.setTimeout(() => setCopied(false), 2000); if (typeof local.onCopied === 'function') { try { local.onCopied(); } catch (error) { logger.error('onCopied handler failed', error); } } } }; onCleanup(() => { if (resetTimeout) { window.clearTimeout(resetTimeout); } }); return ( ); } export default CopyButton;