first commit
This commit is contained in:
32
ui/hooks/useCopyToClipboard.ts
Normal file
32
ui/hooks/useCopyToClipboard.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { useCallback, useRef, useState } from "react";
|
||||
import { toast } from "sonner";
|
||||
|
||||
interface UseCopyToClipboardOptions {
|
||||
successMessage?: string;
|
||||
errorMessage?: string;
|
||||
resetDelay?: number;
|
||||
}
|
||||
|
||||
export function useCopyToClipboard(options: UseCopyToClipboardOptions = {}) {
|
||||
const { successMessage = "Copied to clipboard", errorMessage = "Failed to copy", resetDelay = 2000 } = options;
|
||||
const [copied, setCopied] = useState(false);
|
||||
const timeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);
|
||||
|
||||
const copy = useCallback(
|
||||
async (text: string) => {
|
||||
try {
|
||||
await navigator.clipboard.writeText(text);
|
||||
setCopied(true);
|
||||
toast.success(successMessage);
|
||||
|
||||
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
||||
timeoutRef.current = setTimeout(() => setCopied(false), resetDelay);
|
||||
} catch {
|
||||
toast.error(errorMessage);
|
||||
}
|
||||
},
|
||||
[successMessage, errorMessage, resetDelay],
|
||||
);
|
||||
|
||||
return { copy, copied };
|
||||
}
|
||||
Reference in New Issue
Block a user