import { useState, useCallback, useRef, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { toast } from 'sonner' import { copyToClipboard as copyToClipboardUtil } from '@/lib/copy-to-clipboard' type UseCopyToClipboardOptions = { /** Whether to show a global toast notification (default: true) */ notify?: boolean /** Success message (default: localized 'Copied to clipboard') */ successMessage?: string /** Error message (default: localized 'Failed to copy to clipboard') */ errorMessage?: string /** Time to automatically reset copiedText (milliseconds, default: 2000) */ resetAfterMs?: number } export function useCopyToClipboard(options?: UseCopyToClipboardOptions) { const { notify = true, successMessage, errorMessage, resetAfterMs = 2000, } = options || {} const { t } = useTranslation() const [copiedText, setCopiedText] = useState(null) const timeoutRef = useRef | undefined>( undefined ) useEffect(() => { return () => { if (timeoutRef.current) { clearTimeout(timeoutRef.current) } } }, []) const copyToClipboard = useCallback( async (text: string): Promise => { const resolvedSuccessMessage = successMessage ?? t('Copied to clipboard') const resolvedErrorMessage = errorMessage ?? t('Failed to copy to clipboard') const success = await copyToClipboardUtil(text) if (success) { setCopiedText(text) if (notify) { toast.success(resolvedSuccessMessage) } // Clear previous timeout if (timeoutRef.current) { clearTimeout(timeoutRef.current) } // Auto-reset after 2 seconds timeoutRef.current = setTimeout(() => { setCopiedText(null) }, resetAfterMs) return true } else { // eslint-disable-next-line no-console console.warn('All copy methods failed') if (notify) { toast.error(resolvedErrorMessage) } setCopiedText(null) return false } }, [notify, successMessage, errorMessage, resetAfterMs, t] ) return { copiedText, copyToClipboard } }