← full-stack-fastapi-template  /  frontend/src/hooks/useCopyToClipboard.ts

1
// source: https://usehooks-ts.com/react-hook/use-copy-to-clipboard
2
import { useCallback, useState } from "react"
3
4
type CopiedValue = string | null
5
6
type CopyFn = (text: string) => Promise<boolean>
7
8
export function useCopyToClipboard(): [CopiedValue, CopyFn] {
9
  const [copiedText, setCopiedText] = useState<CopiedValue>(null)
10
11
  const copy: CopyFn = useCallback(async (text) => {
12
    if (!navigator?.clipboard) {
13
      console.warn("Clipboard not supported")
14
      return false
15
    }
16
17
    try {
18
      await navigator.clipboard.writeText(text)
19
      setCopiedText(text)
20
21
      setTimeout(() => setCopiedText(null), 2000)
22
23
      return true
24
    } catch (error) {
25
      console.warn("Copy failed", error)
26
      setCopiedText(null)
27
      return false
28
    }
29
  }, [])
30
31
  return [copiedText, copy]
32
}
33