parent
b378e57b27
commit
1747f91bf1
@ -0,0 +1,28 @@ |
||||
import { useState, useCallback } from 'react' |
||||
import copyToClipboard from 'copy-to-clipboard' |
||||
import { useTimeout } from './useTimeout' |
||||
|
||||
/** |
||||
* useCopyToClipboard |
||||
* |
||||
* @param {number} [delay=3000] - delay in ms |
||||
* |
||||
* @return {[boolean, Function]} |
||||
*/ |
||||
const DEFAULT_DELAY = 3000 |
||||
|
||||
export function useCopyToClipboard (delay = DEFAULT_DELAY) { |
||||
const [copied, setCopied] = useState(false) |
||||
const startTimeout = useTimeout(() => setCopied(false), delay, false) |
||||
|
||||
const handleCopy = useCallback( |
||||
(text) => { |
||||
setCopied(true) |
||||
startTimeout() |
||||
copyToClipboard(text) |
||||
}, |
||||
[startTimeout], |
||||
) |
||||
|
||||
return [copied, handleCopy] |
||||
} |
@ -0,0 +1,46 @@ |
||||
import { useState, useEffect, useRef, useCallback } from 'react' |
||||
|
||||
/** |
||||
* useTimeout |
||||
* |
||||
* @param {Function} cb - callback function inside setTimeout |
||||
* @param {number} delay - delay in ms |
||||
* @param {boolean} [immediate] - determines whether the timeout is invoked immediately |
||||
* |
||||
* @return {Function} |
||||
*/ |
||||
export function useTimeout (cb, delay, immediate = true) { |
||||
const saveCb = useRef() |
||||
const [timeoutId, setTimeoutId] = useState(null) |
||||
|
||||
useEffect(() => { |
||||
saveCb.current = cb |
||||
}, [cb]) |
||||
|
||||
useEffect(() => { |
||||
if (timeoutId !== 'start') { |
||||
return |
||||
} |
||||
|
||||
const id = setTimeout(() => { |
||||
saveCb.current() |
||||
}, delay) |
||||
|
||||
setTimeoutId(id) |
||||
|
||||
return () => { |
||||
clearTimeout(timeoutId) |
||||
} |
||||
}, [delay, timeoutId]) |
||||
|
||||
const startTimeout = useCallback(() => { |
||||
clearTimeout(timeoutId) |
||||
setTimeoutId('start') |
||||
}, [timeoutId]) |
||||
|
||||
if (immediate) { |
||||
startTimeout() |
||||
} |
||||
|
||||
return startTimeout |
||||
} |
Loading…
Reference in new issue