Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sandeshdamkondwar/4b337bc148ac140b8faea9dabf2671cc to your computer and use it in GitHub Desktop.
Save sandeshdamkondwar/4b337bc148ac140b8faea9dabf2671cc to your computer and use it in GitHub Desktop.
A custom React Hook for writing and reading from the modern clipboard API
// hooks/use-clipboard-api.js
import { useState, useCallback } from 'react'
function useClipboardApi() {
const [content, setContent] = useState(null)
const askPermission = useCallback(async queryName => {
try {
const permissionStatus = await navigator.permissions.query(queryName)
return permissionStatus.state === 'granted'
} catch (error) {
// Browser compatibility / Security error (ONLY HTTPS) ...
return false
}
}, [])
const copy = useCallback(
async blob => {
const hasWritePermission = await askPermission({ name: 'clipboard-write' })
if (hasWritePermission) {
const content = [new ClipboardItem({ [blob.type]: blob })]
await navigator.clipboard.write(content).then(read)
}
},
[askPermission, read]
)
const read = useCallback(async () => {
const hasReadPermission = await askPermission({ name: 'clipboard-read' })
if (hasReadPermission) {
const content = await navigator.clipboard.read()
setContent(content)
}
}, [askPermission])
useEffect(() => {
read()
}, [read])
return { content, copy }
}
export default useClipboardApi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment