"use client"; import type { MouseEventHandler } from "react"; import { useEffect, useEffectEvent, useRef, useState } from "react"; export function useCopyButton( onCopy: () => void | Promise, ): [checked: boolean, onClick: MouseEventHandler] { const [checked, setChecked] = useState(false); const timeoutRef = useRef(null); const onClick: MouseEventHandler = useEffectEvent(() => { if (timeoutRef.current) window.clearTimeout(timeoutRef.current); const res = Promise.resolve(onCopy()); void res.then(() => { setChecked(true); timeoutRef.current = window.setTimeout(() => { setChecked(false); }, 1500); }); }); // Avoid updates after being unmounted useEffect(() => { return () => { if (timeoutRef.current) window.clearTimeout(timeoutRef.current); }; }, []); return [checked, onClick]; }