use-clipboard
shadcn-hooks/use-clipboardFreeHook
A hook to copy text to clipboard
Install it
npx shadcn@latest add https://shadcn-hooks.com/r/use-clipboard.jsonSource
1import { useEffect, useMemo, useRef, useState } from 'react'2import { useEventListener } from '@/registry/hooks/use-event-listener'3import { useMemoizedFn } from '@/registry/hooks/use-memoized-fn'4import { useUnmount } from '@/registry/hooks/use-unmount'5import { isBrowser } from '@/registry/lib/is-browser'67export interface UseClipboardOptions {8 /**9 * Enabled reading for clipboard10 *11 * @default false12 */13 read?: boolean1415 /**16 * Copy source17 */18 source?: string1920 /**21 * Milliseconds to reset state of `copied` ref22 *23 * @default 150024 */25 copiedDuring?: number2627 /**28 * Whether fallback to document.execCommand('copy') if clipboard is undefined.29 *30 * @default false31 */32 legacy?: boolean33}3435export interface UseClipboardReturn {36 isSupported: boolean37 text: string38 copied: boolean39 copy: (text?: string) => Promise<void>40}4142type PermissionState = 'granted' | 'denied' | 'prompt' | undefined4344function isAllowed(status: PermissionState): boolean {45 return status === 'granted' || status === 'prompt'46}4748function legacyCopy(value: string): void {49 const ta = document.createElement('textarea')50 ta.value = value51 ta.style.position = 'absolute'52 ta.style.opacity = '0'53 ta.setAttribute('readonly', '')54 document.body.appendChild(ta)55 ta.select()56 document.execCommand('copy')57 ta.remove()58}5960function legacyRead(): string {61 return document?.getSelection?.()?.toString() ?? ''62}6364/**65 * Reactive Clipboard API.66 *67 * @param options - Configuration options68 * @returns Clipboard state and methods69 */70export function useClipboard(71 options: UseClipboardOptions = {},72): UseClipboardReturn {73 const { read = false, source, copiedDuring = 1500, legacy = false } = options7475 const [text, setText] = useState<string>('')76 const [copied, setCopied] = useState<boolean>(false)77 const [permissionRead, setPermissionRead] =78 useState<PermissionState>(undefined)79 const [permissionWrite, setPermissionWrite] =80 useState<PermissionState>(undefined)8182 const timeoutRef = useRef<number | null>(null)8384 const isClipboardApiSupported = useMemo(() => {85 if (!isBrowser) return false86 return 'clipboard' in navigator87 }, [])8889 const isSupported = useMemo(() => {90 return isClipboardApiSupported || legacy91 }, [isClipboardApiSupported, legacy])9293 // Check permissions94 useEffect(() => {95 if (!isBrowser || !isClipboardApiSupported) return9697 const checkPermissions = async () => {98 try {99// … truncated
What it pulls in
Other registry items
Files it writes
More from shadcn-hooks
All 58 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| use-active-elementuse-active-element | shadcn-hooks | Hooks | Free | no deps | |
| use-batteryuse-battery | shadcn-hooks | Hooks | Free | no deps | |
| use-booleanuse-boolean | shadcn-hooks | Hooks | Free | no deps | |
| use-click-any-whereuse-click-any-where | shadcn-hooks | Hooks | Free | no deps | |
| use-click-awayuse-click-away | shadcn-hooks | Hooks | Free | no deps | |
| use-controllable-valueuse-controllable-value | shadcn-hooks | Hooks | Free | 1 dep | |
| use-counteruse-counter | shadcn-hooks | Hooks | Free | no deps | |
| use-creationuse-creation | shadcn-hooks | Hooks | Free | 1 dep |
