copy-link.js 1.3 KB

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