@@ -2,8 +2,9 @@ import { Button } from '@/components/ui/button'
22import { Tooltip , TooltipContent , TooltipTrigger } from '@/components/ui/tooltip'
33import { useClipboard } from '@/hooks/use-clipboard'
44import { Check , Copy , Link } from 'lucide-react'
5- import { useCallback } from 'react'
5+ import { useCallback , useEffect , useRef } from 'react'
66import { useTranslation } from 'react-i18next'
7+ import { toast } from 'sonner'
78
89interface CopyButtonProps {
910 value : string
@@ -12,22 +13,40 @@ interface CopyButtonProps {
1213 defaultMessage ?: string
1314 icon ?: 'copy' | 'link'
1415 onClick ?: ( e : React . MouseEvent ) => void
16+ showToast ?: boolean
17+ toastSuccessMessage ?: string
18+ toastErrorMessage ?: string
1519}
1620
17- export function CopyButton ( { value, className, copiedMessage = 'Copied!' , defaultMessage = 'Click to copy' , icon = 'copy' , onClick } : CopyButtonProps ) {
21+ export function CopyButton ( { value, className, copiedMessage = 'Copied!' , defaultMessage = 'Click to copy' , icon = 'copy' , onClick, showToast = false , toastSuccessMessage , toastErrorMessage } : CopyButtonProps ) {
1822 const { t } = useTranslation ( )
1923
20- const { copy, copied } = useClipboard ( { timeout : 1500 } )
24+ const { copy, copied, error } = useClipboard ( { timeout : 1500 } )
25+ const shouldShowToast = useRef ( false )
26+
2127 const handleCopy = useCallback (
2228 async ( e : React . MouseEvent ) => {
2329 e . preventDefault ( )
2430 e . stopPropagation ( )
31+ shouldShowToast . current = showToast
2532 await copy ( value )
2633 onClick ?.( e )
2734 } ,
28- [ copy , value , onClick ] ,
35+ [ copy , value , onClick , showToast ] ,
2936 )
3037
38+ useEffect ( ( ) => {
39+ if ( ! shouldShowToast . current ) return
40+
41+ if ( copied ) {
42+ toast . success ( toastSuccessMessage ? t ( toastSuccessMessage ) : t ( copiedMessage ) )
43+ shouldShowToast . current = false
44+ } else if ( error ) {
45+ toast . error ( toastErrorMessage ? t ( toastErrorMessage ) : t ( 'copyFailed' , { defaultValue : 'Failed to copy' } ) )
46+ shouldShowToast . current = false
47+ }
48+ } , [ copied , error , toastSuccessMessage , toastErrorMessage , copiedMessage , t ] )
49+
3150 return (
3251 < Tooltip open = { copied ? true : undefined } >
3352 < TooltipTrigger asChild >
0 commit comments