diff --git a/surfsense_web/components/report-panel/report-panel.tsx b/surfsense_web/components/report-panel/report-panel.tsx index 3d48fb8c5..c602a3f04 100644 --- a/surfsense_web/components/report-panel/report-panel.tsx +++ b/surfsense_web/components/report-panel/report-panel.tsx @@ -123,6 +123,13 @@ export function ReportPanelContent({ const [copied, setCopied] = useState(false); const [exporting, setExporting] = useState(null); const [saving, setSaving] = useState(false); + const copyTimerRef = useRef | undefined>(undefined); + + useEffect(() => { + return () => { + if (copyTimerRef.current) clearTimeout(copyTimerRef.current); + }; + }, []); // Editor state — tracks the latest markdown from the Plate editor const [editedMarkdown, setEditedMarkdown] = useState(null); @@ -197,7 +204,8 @@ export function ReportPanelContent({ try { await navigator.clipboard.writeText(currentMarkdown); setCopied(true); - setTimeout(() => setCopied(false), 2000); + if (copyTimerRef.current) clearTimeout(copyTimerRef.current); + copyTimerRef.current = setTimeout(() => setCopied(false), 2000); } catch (err) { console.error("Failed to copy:", err); } diff --git a/surfsense_web/hooks/use-api-key.ts b/surfsense_web/hooks/use-api-key.ts index 0c595b420..b50dd65f1 100644 --- a/surfsense_web/hooks/use-api-key.ts +++ b/surfsense_web/hooks/use-api-key.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useState } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import { getBearerToken } from "@/lib/auth-utils"; import { copyToClipboard as copyToClipboardUtil } from "@/lib/utils"; @@ -14,6 +14,13 @@ export function useApiKey(): UseApiKeyReturn { const [apiKey, setApiKey] = useState(null); const [copied, setCopied] = useState(false); const [isLoading, setIsLoading] = useState(true); + const copyTimerRef = useRef | undefined>(undefined); + + useEffect(() => { + return () => { + if (copyTimerRef.current) clearTimeout(copyTimerRef.current); + }; + }, []); useEffect(() => { // Load API key from localStorage @@ -41,7 +48,8 @@ export function useApiKey(): UseApiKeyReturn { if (success) { setCopied(true); toast.success("API key copied to clipboard"); - setTimeout(() => { + if (copyTimerRef.current) clearTimeout(copyTimerRef.current); + copyTimerRef.current = setTimeout(() => { setCopied(false); }, 2000); } else {