@hakuna-matata-ui/hooks
Version:
React hooks for Chakra components
58 lines (49 loc) • 1.52 kB
text/typescript
import { useState, useCallback, useEffect } from "react"
import copy from "copy-to-clipboard"
export interface UseClipboardOptions {
/**
* timeout delay (in ms) to switch back to initial state once copied.
*/
timeout?: number
/**
* Set the desired MIME type
*/
format?: string
}
/**
* React hook to copy content to clipboard
*
* @param text the text or value to copy
* @param {Number} [optionsOrTimeout=1500] optionsOrTimeout - delay (in ms) to switch back to initial state once copied.
* @param {Object} optionsOrTimeout
* @param {string} optionsOrTimeout.format - set the desired MIME type
* @param {number} optionsOrTimeout.timeout - delay (in ms) to switch back to initial state once copied.
*/
export function useClipboard(
text: string,
optionsOrTimeout: number | UseClipboardOptions = {},
) {
const [hasCopied, setHasCopied] = useState(false)
const { timeout = 1500, ...copyOptions } =
typeof optionsOrTimeout === "number"
? { timeout: optionsOrTimeout }
: optionsOrTimeout
const onCopy = useCallback(() => {
const didCopy = copy(text, copyOptions)
setHasCopied(didCopy)
}, [text, copyOptions])
useEffect(() => {
let timeoutId: number | null = null
if (hasCopied) {
timeoutId = window.setTimeout(() => {
setHasCopied(false)
}, timeout)
}
return () => {
if (timeoutId) {
window.clearTimeout(timeoutId)
}
}
}, [timeout, hasCopied])
return { value: text, onCopy, hasCopied }
}