The Node.js® Website
1'use client';
2
3import { useEffect, useState } from 'react';
4
5const copyToClipboard = (value: string | undefined) => {
6 if (!value || typeof navigator === 'undefined') {
7 return Promise.resolve(false);
8 }
9
10 return navigator.clipboard
11 .writeText(value)
12 .then(() => true)
13 .catch(() => false);
14};
15
16const useCopyToClipboard = () => {
17 const [copied, setCopied] = useState(false);
18
19 const copyText = (text: string | undefined) =>
20 copyToClipboard(text).then(setCopied);
21
22 useEffect(() => {
23 if (copied) {
24 const timerId = setTimeout(() => setCopied(false), 3000);
25
26 return () => clearTimeout(timerId);
27 }
28
29 return undefined;
30 }, [copied]);
31
32 return [copied, copyText] as const;
33};
34
35export default useCopyToClipboard;