index.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. 'use client'
  2. import { useState } from 'react'
  3. import { t } from 'i18next'
  4. import { debounce } from 'lodash-es'
  5. import copy from 'copy-to-clipboard'
  6. import s from './style.module.css'
  7. import Tooltip from '@/app/components/base/tooltip'
  8. type ICopyBtnProps = {
  9. value: string
  10. className?: string
  11. isPlain?: boolean
  12. }
  13. const CopyBtn = ({
  14. value,
  15. className,
  16. isPlain,
  17. }: ICopyBtnProps) => {
  18. const [isCopied, setIsCopied] = useState(false)
  19. const onClickCopy = debounce(() => {
  20. copy(value)
  21. setIsCopied(true)
  22. }, 100)
  23. const onMouseLeave = debounce(() => {
  24. setIsCopied(false)
  25. }, 100)
  26. return (
  27. <div className={`${className}`}>
  28. <Tooltip
  29. popupContent={(isCopied ? t('appApi.copied') : t('appApi.copy'))}
  30. asChild={false}
  31. >
  32. <div
  33. onMouseLeave={onMouseLeave}
  34. className={'box-border flex cursor-pointer items-center justify-center rounded-md bg-components-button-secondary-bg p-0.5'}
  35. style={!isPlain
  36. ? {
  37. boxShadow: '0px 4px 8px -2px rgba(16, 24, 40, 0.1), 0px 2px 4px -2px rgba(16, 24, 40, 0.06)',
  38. }
  39. : {}}
  40. onClick={onClickCopy}
  41. >
  42. <div className={`h-6 w-6 rounded-md hover:bg-components-button-secondary-bg-hover ${s.copyIcon} ${isCopied ? s.copied : ''}`}></div>
  43. </div>
  44. </Tooltip>
  45. </div>
  46. )
  47. }
  48. export default CopyBtn