copy-link.tsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { useCallback, useState } from 'react'
  2. import { Button } from 'react-bootstrap'
  3. import { Trans, useTranslation } from 'react-i18next'
  4. import Tooltip from './tooltip'
  5. import Icon from './icon'
  6. type CopyLinkProps = {
  7. link: string
  8. tooltipId: string
  9. }
  10. function CopyLink({ link, tooltipId }: CopyLinkProps) {
  11. const { t } = useTranslation()
  12. const [copied, setCopied] = useState(false)
  13. const handleClick = useCallback(() => {
  14. navigator.clipboard.writeText(link).then(() => {
  15. setCopied(true)
  16. window.setTimeout(() => {
  17. setCopied(false)
  18. }, 1500)
  19. })
  20. }, [link])
  21. if (!navigator.clipboard?.writeText) {
  22. return null
  23. }
  24. return (
  25. <Tooltip
  26. id={tooltipId}
  27. description={copied ? 'Copied!' : <Trans i18nKey="copy" />}
  28. overlayProps={{
  29. delayHide: copied ? 1000 : 250,
  30. shouldUpdatePosition: true,
  31. }}
  32. >
  33. <Button
  34. onClick={handleClick}
  35. bsSize="xsmall"
  36. bsStyle="link"
  37. className="copy-button"
  38. aria-label={t('copy')}
  39. >
  40. {copied ? <Icon type="check" /> : <Icon type="clipboard" />}
  41. </Button>
  42. </Tooltip>
  43. )
  44. }
  45. export default CopyLink