diff --git a/frontend/src/pages/ArticleHistory.tsx b/frontend/src/pages/ArticleHistory.tsx index 47588a8..303cc0f 100644 --- a/frontend/src/pages/ArticleHistory.tsx +++ b/frontend/src/pages/ArticleHistory.tsx @@ -2,6 +2,7 @@ import { type Component, createSignal, onMount, + onCleanup, Show, For, createEffect, @@ -56,6 +57,12 @@ const ArticleHistory: Component = () => { const [filterSourceType, setFilterSourceType] = createSignal(''); const [page, setPage] = createSignal(0); const [confirming, setConfirming] = createSignal(false); + const [confirmTimer, setConfirmTimer] = createSignal | undefined>(); + + onCleanup(() => { + const t = confirmTimer(); + if (t) clearTimeout(t); + }); const totalPages = () => Math.max(1, Math.ceil(total() / PAGE_SIZE)); @@ -92,7 +99,7 @@ const ArticleHistory: Component = () => { const handleClear = async () => { if (!confirming()) { setConfirming(true); - setTimeout(() => setConfirming(false), 3000); + setConfirmTimer(setTimeout(() => setConfirming(false), 3000)); return; } try { diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index 9f46a9d..7a2d018 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -2,6 +2,7 @@ import { type Component, createSignal, onMount, + onCleanup, Show, For, } from 'solid-js'; @@ -32,6 +33,11 @@ const Home: Component = () => { const [deletingId, setDeletingId] = createSignal(null); const [deleteTimers, setDeleteTimers] = createSignal>>({}); + onCleanup(() => { + const timers = deleteTimers(); + Object.values(timers).forEach((timer) => clearTimeout(timer)); + }); + onMount(async () => { try { const data = await synthesesApi.list(); diff --git a/frontend/src/pages/SynthesisDetail.tsx b/frontend/src/pages/SynthesisDetail.tsx index bb2d6c0..231e73b 100644 --- a/frontend/src/pages/SynthesisDetail.tsx +++ b/frontend/src/pages/SynthesisDetail.tsx @@ -2,6 +2,7 @@ import { type Component, createSignal, onMount, + onCleanup, Show, For, } from 'solid-js'; @@ -83,6 +84,12 @@ const SynthesisDetail: Component = () => { const [sendingEmail, setSendingEmail] = createSignal(false); const [emailSuccess, setEmailSuccess] = createSignal(false); const [emailError, setEmailError] = createSignal(null); + const [emailTimer, setEmailTimer] = createSignal | undefined>(); + + onCleanup(() => { + const t = emailTimer(); + if (t) clearTimeout(t); + }); // Export state const [exportingMarkdown, setExportingMarkdown] = createSignal(false); @@ -147,7 +154,7 @@ const SynthesisDetail: Component = () => { try { await synthesesApi.sendEmail(synth.id, email()); setEmailSuccess(true); - setTimeout(() => setEmailSuccess(false), 5000); + setEmailTimer(setTimeout(() => setEmailSuccess(false), 5000)); } catch (err) { if (isApiError(err)) { setEmailError(err.message);