diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index c687387b..53039407 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -456,7 +456,6 @@ export default function Home() { try { await deleteEmail(client, selectedEmail.id); - selectEmail(null); } catch (error) { console.error("Failed to delete email:", error); } @@ -470,7 +469,6 @@ export default function Home() { if (archiveMailbox) { try { await moveToMailbox(client, selectedEmail.id, archiveMailbox.id); - selectEmail(null); } catch (error) { console.error("Failed to archive email:", error); } @@ -526,9 +524,6 @@ export default function Home() { const toastInstance = (await import('sonner')).toast; toastInstance.success(t('email_viewer.spam.toast_not_spam_success')); - - // Deselect email after moving it out of junk - selectEmail(null); } catch (_error) { console.error("Failed to restore email:", _error); const toastInstance = (await import('sonner')).toast; diff --git a/stores/email-store.ts b/stores/email-store.ts index 14604a65..d943a2f5 100644 --- a/stores/email-store.ts +++ b/stores/email-store.ts @@ -105,6 +105,17 @@ interface EmailStore { loadMockData: () => void; } +// Helper: compute the next email to select when removing one from the list +function getNextSelectedEmail(state: { emails: Email[]; selectedEmail: Email | null }, removedEmailId: string): Email | null { + if (state.selectedEmail?.id !== removedEmailId) return state.selectedEmail; + const idx = state.emails.findIndex(e => e.id === removedEmailId); + if (idx === -1) return null; + // Prefer next email, fall back to previous + if (idx < state.emails.length - 1) return state.emails[idx + 1]; + if (idx > 0) return state.emails[idx - 1]; + return null; +} + export const useEmailStore = create((set, get) => ({ emails: [], mailboxes: [], @@ -439,7 +450,7 @@ export const useEmailStore = create((set, get) => ({ return { emails: state.emails.filter(e => e.id !== emailId), - selectedEmail: state.selectedEmail?.id === emailId ? null : state.selectedEmail, + selectedEmail: getNextSelectedEmail(state, emailId), mailboxes: updatedMailboxes }; }); @@ -485,7 +496,7 @@ export const useEmailStore = create((set, get) => ({ return { emails: state.emails.filter(e => e.id !== emailId), - selectedEmail: state.selectedEmail?.id === emailId ? null : state.selectedEmail, + selectedEmail: getNextSelectedEmail(state, emailId), mailboxes: updatedMailboxes }; }); @@ -625,7 +636,7 @@ export const useEmailStore = create((set, get) => ({ return { emails: state.emails.filter(e => e.id !== emailId), - selectedEmail: state.selectedEmail?.id === emailId ? null : state.selectedEmail, + selectedEmail: getNextSelectedEmail(state, emailId), mailboxes: updatedMailboxes }; }); @@ -906,13 +917,8 @@ export const useEmailStore = create((set, get) => ({ set(state => ({ emails: state.emails.filter(e => e.id !== emailId), - selectedEmail: state.selectedEmail?.id === emailId ? null : state.selectedEmail, + selectedEmail: getNextSelectedEmail(state, emailId), })); - - const currentIndex = emails.findIndex(e => e.id === emailId); - if (currentIndex >= 0 && currentIndex < emails.length - 1) { - set({ selectedEmail: emails[currentIndex + 1] }); - } } catch (error) { console.error('Failed to mark as spam:', error); throw error;