From 4580a197dda5729330d4c34336ab5b8e9ff4a8dd Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Thu, 14 May 2026 00:16:53 +0200 Subject: [PATCH] fix(mail): reactive page (refresh stats + status on scan/connect) + center donut+legend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two small fixes blocking real "feierabend": 1. Stats-Counter veraltet nach Scan/Connect/Disconnect: - mail.tsx hatte zwei separate Data-Sources: useMailStatus (accounts + errors + heartbeat) und useMailStats (blockedByDay + blockedByConnection) - onScanSuccess + onIntervalChanged + OAuth-onSuccess + disconnect-handler refreshten nur useMailStatus → der Account-Collapsible-Counter (kommt aus useMailStats.blockedByConnection) blieb veraltet - Beobachtet: GMX-Scan-Button meldet "90 blockiert" als Feedback, aber Card-Header zeigt weiter 60 - Fix: refreshAll() = refresh() + refreshStats() parallel. Alle reactive callsites (4 Stellen) auf refreshAll umgestellt - useMailStats hatte refresh schon exportiert (Z. 153), nur nicht verdrahtet 2. Donut + Legend horizontal zentriert: - vorher: alignItems center (vertikal), Legend flex:1 → linksbündig mit Legend bis Card-Rand gestreckt - jetzt: justifyContent center + Legend ohne flex:1 → Block in der Mitte mit Whitespace links/rechts Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/rebreak-native/app/(app)/mail.tsx | 21 +++++++++++++------ .../components/mail/MailDistributionChart.tsx | 4 ++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/apps/rebreak-native/app/(app)/mail.tsx b/apps/rebreak-native/app/(app)/mail.tsx index b1ce2fa..e4a9acb 100644 --- a/apps/rebreak-native/app/(app)/mail.tsx +++ b/apps/rebreak-native/app/(app)/mail.tsx @@ -255,7 +255,16 @@ export default function MailScreen() { useMailStatus(plan); const { disconnect, disconnecting } = useMailDisconnect(); const hasAccounts = accounts.length > 0; - const { blockedByDay, blockedByConnection } = useMailStats(hasAccounts); + const { blockedByDay, blockedByConnection, refresh: refreshStats } = useMailStats(hasAccounts); + + // Globaler Refresh-Handler für alle reactive-Trigger (Scan-Success, + // Interval-Change, Connect/Disconnect): refresht beide Datenquellen + // parallel — useMailStatus (accounts, connect-errors, heartbeat) UND + // useMailStats (blockedByDay, blockedByConnection für Charts + Counter). + const refreshAll = () => { + refresh(); + refreshStats(); + }; const [sheetVisible, setSheetVisible] = useState(false); const [successVisible, setSuccessVisible] = useState(false); @@ -290,11 +299,11 @@ export default function MailScreen() { await disconnect(id); setDisconnectingId(null); if (expandedAccount === id) setExpandedAccount(null); - refresh(); + refreshAll(); } function handleConnectSuccess() { - refresh(); + refreshAll(); if (pendingOAuthConnectionId) { setOauthTitleSheetConnectionId(pendingOAuthConnectionId); setPendingOAuthConnectionId(null); @@ -509,11 +518,11 @@ export default function MailScreen() { expanded={expandedAccount === account.id} onToggle={() => toggleAccount(account.id)} onDisconnect={handleDisconnect} - onIntervalChanged={refresh} + onIntervalChanged={refreshAll} onEditSuccess={handleConnectSuccess} disconnecting={disconnectingId === account.id && disconnecting} blockedLast30d={connStat?.count} - onScanSuccess={refresh} + onScanSuccess={refreshAll} /> ); })} @@ -533,7 +542,7 @@ export default function MailScreen() { connectionId={oauthTitleSheetConnectionId} currentTitle={null} onClose={() => { setOauthTitleSheetConnectionId(null); setSuccessVisible(true); }} - onSuccess={() => { setOauthTitleSheetConnectionId(null); setSuccessVisible(true); refresh(); }} + onSuccess={() => { setOauthTitleSheetConnectionId(null); setSuccessVisible(true); refreshAll(); }} /> )} diff --git a/apps/rebreak-native/components/mail/MailDistributionChart.tsx b/apps/rebreak-native/components/mail/MailDistributionChart.tsx index 53ef497..12d09cd 100644 --- a/apps/rebreak-native/components/mail/MailDistributionChart.tsx +++ b/apps/rebreak-native/components/mail/MailDistributionChart.tsx @@ -98,14 +98,14 @@ export function MailDistributionChart({ data, hero, totalBlocked, isLegend }: Pr paddingBottom: 12, }} > - + - + {slices.map((slice) => ( ))}