From 53edb10e0dfbbf29d1a56989403b07fe348ddf4d Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Sat, 30 May 2026 01:47:23 -0700 Subject: [PATCH] fix: guard comment composer async state (#3560) --- .../src/components/LinearItemDrawer.tsx | 19 +++++++++++++++++-- .../src/components/editor/MarkdownPreview.tsx | 15 ++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/components/LinearItemDrawer.tsx b/src/renderer/src/components/LinearItemDrawer.tsx index 173c287bcbc..0e8e99e7585 100644 --- a/src/renderer/src/components/LinearItemDrawer.tsx +++ b/src/renderer/src/components/LinearItemDrawer.tsx @@ -953,6 +953,14 @@ export function LinearIssueCommentFooter({ const [body, setBody] = useState('') const [submitting, setSubmitting] = useState(false) const textareaRef = useRef(null) + const mountedRef = useRef(true) + + useEffect(() => { + mountedRef.current = true + return () => { + mountedRef.current = false + } + }, []) const autoGrow = useCallback(() => { const el = textareaRef.current @@ -972,6 +980,9 @@ export function LinearIssueCommentFooter({ try { const result = await linearAddIssueComment(settings, issueId, trimmed, workspaceId) const typed = result as { ok: boolean; id?: string; error?: string } + if (!mountedRef.current) { + return + } if (typed.ok) { setBody('') onCommentAdded({ @@ -983,9 +994,13 @@ export function LinearIssueCommentFooter({ toast.error(typed.error ?? 'Failed to add comment') } } catch (err) { - toast.error(err instanceof Error ? err.message : 'Failed to add comment') + if (mountedRef.current) { + toast.error(err instanceof Error ? err.message : 'Failed to add comment') + } } finally { - setSubmitting(false) + if (mountedRef.current) { + setSubmitting(false) + } } }, [body, issueId, onCommentAdded, settings, workspaceId]) diff --git a/src/renderer/src/components/editor/MarkdownPreview.tsx b/src/renderer/src/components/editor/MarkdownPreview.tsx index 218d6e4942c..64364ed8d55 100644 --- a/src/renderer/src/components/editor/MarkdownPreview.tsx +++ b/src/renderer/src/components/editor/MarkdownPreview.tsx @@ -1713,6 +1713,14 @@ function MarkdownAnnotationComposer({ const [body, setBody] = useState('') const [submitting, setSubmitting] = useState(false) const textareaRef = useRef(null) + const mountedRef = useRef(true) + + useEffect(() => { + mountedRef.current = true + return () => { + mountedRef.current = false + } + }, []) useEffect(() => { textareaRef.current?.focus() @@ -1727,11 +1735,16 @@ function MarkdownAnnotationComposer({ setSubmitting(true) try { const ok = await onSubmit(trimmed) + if (!mountedRef.current) { + return + } if (ok) { setBody('') } } finally { - setSubmitting(false) + if (mountedRef.current) { + setSubmitting(false) + } } }