From 1c7a8246b5217314a74a70fd43da4b76e36c5865 Mon Sep 17 00:00:00 2001 From: Dotta Date: Tue, 17 Mar 2026 13:22:38 -0500 Subject: [PATCH] fix: clear issue copy timer between clicks --- ui/src/pages/IssueDetail.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/ui/src/pages/IssueDetail.tsx b/ui/src/pages/IssueDetail.tsx index a6ac9c76..e9aeb855 100644 --- a/ui/src/pages/IssueDetail.tsx +++ b/ui/src/pages/IssueDetail.tsx @@ -210,6 +210,7 @@ export function IssueDetail() { }); const [attachmentError, setAttachmentError] = useState(null); const [attachmentDragActive, setAttachmentDragActive] = useState(false); + const copiedTimerRef = useRef | null>(null); const fileInputRef = useRef(null); const lastMarkedReadIssueIdRef = useRef(null); @@ -590,6 +591,14 @@ export function IssueDetail() { return () => closePanel(); }, [issue]); // eslint-disable-line react-hooks/exhaustive-deps + useEffect(() => { + return () => { + if (copiedTimerRef.current !== null) { + clearTimeout(copiedTimerRef.current); + } + }; + }, []); + const copyIssueToClipboard = async () => { if (!issue) return; const decodeEntities = (text: string) => { @@ -603,7 +612,13 @@ export function IssueDetail() { await navigator.clipboard.writeText(md); setCopied(true); pushToast({ title: "Copied to clipboard", tone: "success" }); - setTimeout(() => setCopied(false), 2000); + if (copiedTimerRef.current !== null) { + clearTimeout(copiedTimerRef.current); + } + copiedTimerRef.current = setTimeout(() => { + setCopied(false); + copiedTimerRef.current = null; + }, 2000); }; if (isLoading) return

Loading...

;