use-copy-to-clipboard
efferd-/use-copy-to-clipboardFreeHook
Use copy to clipboard hook.
Install it
npx shadcn@latest add http://efferd.com/r/use-copy-to-clipboard.jsonSource
1"use client";23import { useCallback, useEffect, useRef, useState } from "react";45type UseCopyToClipboardReturn = {6 copied: boolean;7 copy: (text: string) => Promise<boolean>;8};910// Fallback to old browsers11function fallbackCopy(str: string): boolean {12 const textarea = document.createElement("textarea");13 let success = false;1415 textarea.value = str;16 textarea.setAttribute("readonly", "");1718 textarea.style.position = "absolute";19 textarea.style.left = "-9999px";2021 document.body.appendChild(textarea);2223 textarea.select();2425 try {26 success = document.execCommand("copy");27 } catch {28 success = false;29 } finally {30 document.body.removeChild(textarea);31 }3233 return success;34}3536export function useCopyToClipboard(duration = 1500): UseCopyToClipboardReturn {37 const [copied, setCopied] = useState<boolean>(false);38 const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);3940 const copy = useCallback(41 async (text: string): Promise<boolean> => {42 try {43 let success = false;4445 if (navigator.clipboard && navigator.clipboard.writeText) {46 await navigator.clipboard.writeText(text);47 success = true;48 } else {49 success = fallbackCopy(text);50 }5152 if (success) {53 setCopied(true);54 if (timeoutRef.current) clearTimeout(timeoutRef.current);55 timeoutRef.current = setTimeout(() => setCopied(false), duration);56 return true;57 }58 throw new Error("Copy command failed");59 } catch (err: unknown) {60 console.error("Failed to copy text: ", err);61 return false;62 }63 },64 [duration]65 );6667 useEffect(() => {68 return () => {69 if (timeoutRef.current) {70 clearTimeout(timeoutRef.current);71 }72 };73 }, []);7475 return {76 copied,77 copy,78 };79}
Files it writes
More from efferd
All 201 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| use-keypressuse-keypress | efferd | Hooks | Free | no deps | |
| use-media-queryuse-media-query | efferd | Hooks | Free | no deps | |
| use-scrolluse-scroll | efferd | Hooks | Free | no deps |
