use-copy-to-clipboard.ts 729 B

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