| @@ -1,29 +1,31 @@ | |||
| import { useState } from 'react' | |||
| import { useCallback, useState } from 'react' | |||
| import writeText from 'copy-to-clipboard' | |||
| type CopiedValue = string | null | |||
| type CopyFn = (text: string) => Promise<boolean> | |||
| function useCopyToClipboard(): [CopiedValue, CopyFn] { | |||
| const [copiedText, setCopiedText] = useState<CopiedValue>(null) | |||
| const [copiedText, setCopiedText] = useState<CopiedValue>(null) | |||
| const copy: CopyFn = async text => { | |||
| if (!navigator?.clipboard) { | |||
| console.warn('Clipboard not supported') | |||
| return false | |||
| } | |||
| const copy: CopyFn = useCallback(async (text: string) => { | |||
| if (!navigator?.clipboard) { | |||
| console.warn('Clipboard not supported') | |||
| return false | |||
| } | |||
| try { | |||
| await navigator.clipboard.writeText(text) | |||
| setCopiedText(text) | |||
| return true | |||
| } catch (error) { | |||
| console.warn('Copy failed', error) | |||
| setCopiedText(null) | |||
| return false | |||
| } | |||
| try { | |||
| writeText(text) | |||
| setCopiedText(text) | |||
| return true | |||
| } | |||
| catch (error) { | |||
| console.warn('Copy failed', error) | |||
| setCopiedText(null) | |||
| return false | |||
| } | |||
| }, []) | |||
| return [copiedText, copy] | |||
| return [copiedText, copy] | |||
| } | |||
| export default useCopyToClipboard | |||
| export default useCopyToClipboard | |||