From 3516d3c7275a9e49adea209c9ee64bb85042f087 Mon Sep 17 00:00:00 2001 From: Stefan Hildebrandt <695494+hildebrandttk@users.noreply.github.com> Date: Wed, 17 Jun 2026 23:52:04 +0200 Subject: [PATCH] chore: resolve react-hooks/exhaustive-deps warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Goes through the 7 exhaustive-deps warnings individually: Added the genuinely-missing dependency (safe, no extra churn): - email-viewer useMemo: add effectiveEmailContent.hasStyleTag (used for hasOwnLayout; changes in lockstep with .html, closing a latent staleness gap). - pro-compose-tab-body handleSend: add refreshCurrentMailbox (stable zustand selector) and drop the stale fetchEmails/selectedMailbox deps — which left those two selectors entirely unused, so remove them too. - use-mailbox-drop handleDrop: add sourceMailboxId (changes in lockstep with draggedEmails, already a dep). Suppressed with a justified comment where depending on the whole object would regress behavior — these are intentional fine-grained deps: - email-composer signature-swap effect (keyed to signature fields + prev*Ref guards; whole signatureIdentity would re-splice the live editor). - email-viewer auto-mark-as-read (whole email would reset the delay timer on any unrelated field update). - email-viewer effective-attachments memo (derives from email.attachments; whole email would churn the list + its layout measurement). - email-viewer auto-MDN effect (email already captured via id + sendReadReceiptNow; autoMdnRef guards double-send). tsc --noEmit clean; eslint now reports 0 problems. --- components/email/email-composer.tsx | 5 +++++ components/email/email-viewer.tsx | 14 +++++++++++++- components/pro/pro-compose-tab-body.tsx | 4 +--- hooks/use-mailbox-drop.ts | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/components/email/email-composer.tsx b/components/email/email-composer.tsx index ccdb1bc3..9d612259 100644 --- a/components/email/email-composer.tsx +++ b/components/email/email-composer.tsx @@ -647,6 +647,11 @@ export function EmailComposer({ if (nextHtml !== currentHtml) { editor.commands.setContent(nextHtml, { emitUpdate: true }); } + // Intentionally keyed to the signature-relevant fields plus the internal + // prev*Ref guards above; depending on the whole `signatureIdentity` object + // would re-run on unrelated identity-field changes and re-splice the + // signature into the live editor. + // eslint-disable-next-line react-hooks/exhaustive-deps }, [signatureIdentity?.id, signatureIdentity?.htmlSignature, signatureIdentity?.textSignature, signatureSeparatorEnabled, signaturePosition, mode, plainTextMode]); useEffect(() => { diff --git a/components/email/email-viewer.tsx b/components/email/email-viewer.tsx index c18a19d3..239c86f8 100644 --- a/components/email/email-viewer.tsx +++ b/components/email/email-viewer.tsx @@ -1331,6 +1331,10 @@ export function EmailViewer({ }, markAsReadDelay); return () => clearTimeout(timeout); + // Keyed to email id + $seen only: depending on the whole `email` object + // would reset the mark-as-read delay timer whenever any unrelated email + // field updates (e.g. a background re-fetch). + // eslint-disable-next-line react-hooks/exhaustive-deps }, [email?.id, email?.keywords?.$seen, onMarkAsRead]); // Reset external content permission and quick reply when email changes @@ -2260,6 +2264,11 @@ export function EmailViewer({ })); return [...jmapAttachments, ...tnefExtracted, ...embeddedExtracted]; + // The memo derives only from `email.attachments` (findCalendarAttachment + // scans that array); depending on the whole `email` object would rebuild the + // attachment list — and its downstream layout measurement — on every email + // field change. + // eslint-disable-next-line react-hooks/exhaustive-deps }, [email?.attachments, smimeDecryptedAttachments, tnefHtml, tnefText, tnefAttachments, embeddedEmailUnwrapped, embeddedEmailAttachments, calendarInvitationParsingEnabled, hideInlineImageAttachments]); // Measure attachment chips in the below-header row to determine how many fit @@ -2968,7 +2977,7 @@ export function EmailViewer({ ${wordHtmlCSS} ${darkModeCSS}
${effectiveEmailContent.html}