use-copy-to-clipboard.ts 744 B

1234567891011121314151617181920212223242526272829
  1. import { useState } from 'react'
  2. type CopiedValue = string | null
  3. type CopyFn = (text: string) => Promise<boolean>
  4. function useCopyToClipboard(): [CopiedValue, CopyFn] {
  5. const [copiedText, setCopiedText] = useState<CopiedValue>(null)
  6. const copy: CopyFn = async text => {
  7. if (!navigator?.clipboard) {
  8. console.warn('Clipboard not supported')
  9. return false
  10. }
  11. try {
  12. await navigator.clipboard.writeText(text)
  13. setCopiedText(text)
  14. return true
  15. } catch (error) {
  16. console.warn('Copy failed', error)
  17. setCopiedText(null)
  18. return false
  19. }
  20. }
  21. return [copiedText, copy]
  22. }
  23. export default useCopyToClipboard