From 4b53dc63332c5c9824e8d4e3dbc402ad82cf27a5 Mon Sep 17 00:00:00 2001 From: amrit Date: Tue, 15 Jul 2025 11:32:53 +0530 Subject: [PATCH 1/2] feat: add counter for drafts, sent, archive --- apps/mail/components/ui/nav-main.tsx | 1 - apps/server/src/lib/driver/google.ts | 34 ++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/apps/mail/components/ui/nav-main.tsx b/apps/mail/components/ui/nav-main.tsx index 91ee06fc9f..5dc02c77eb 100644 --- a/apps/mail/components/ui/nav-main.tsx +++ b/apps/mail/components/ui/nav-main.tsx @@ -311,7 +311,6 @@ function NavItem(item: NavItemProps & { href: string }) { {item.title}

{stats && - item.id?.toLowerCase() !== 'sent' && stats.some((stat) => stat.label?.toLowerCase() === item.id?.toLowerCase()) && ( {stats diff --git a/apps/server/src/lib/driver/google.ts b/apps/server/src/lib/driver/google.ts index b44542ef6f..9f19013148 100644 --- a/apps/server/src/lib/driver/google.ts +++ b/apps/server/src/lib/driver/google.ts @@ -206,10 +206,36 @@ export class GoogleMailManager implements MailManager { Effect.all(labelRequests, { concurrency: 'unbounded' }), ); - return results.map((res) => ({ - label: res.data.name ?? res.data.id ?? '', - count: Number(res.data.threadsUnread), - })); + type LabelCount = { label: string; count: number }; + + const mapped: LabelCount[] = await Promise.all( + results.map(async (res) => { + let labelName = (res.data.name ?? res.data.id ?? '').toLowerCase(); + if (labelName === 'draft') labelName = 'drafts'; + const isTotalLabel = labelName === 'drafts' || labelName === 'sent'; + return { + label: labelName, + count: Number(isTotalLabel ? res.data.threadsTotal : res.data.threadsUnread), + }; + }), + ); + + // Get archive count + try { + const archiveRes = await this.gmail.users.threads.list({ + userId: 'me', + q: 'in:archive', + maxResults: 1, + }); + mapped.push({ + label: 'archive', + count: Number(archiveRes.data.resultSizeEstimate ?? 0), + }); + } catch (error: unknown) { + console.error('Failed to fetch archive count:', error); + } + + return mapped; }, { email: this.config.auth?.email }, ); From fafaad584154bffe7fc5d811da6f75f4fe562409 Mon Sep 17 00:00:00 2001 From: amrit Date: Tue, 15 Jul 2025 12:21:21 +0530 Subject: [PATCH 2/2] address ai comments --- apps/server/src/lib/driver/google.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/server/src/lib/driver/google.ts b/apps/server/src/lib/driver/google.ts index 9f19013148..4092d180bd 100644 --- a/apps/server/src/lib/driver/google.ts +++ b/apps/server/src/lib/driver/google.ts @@ -208,17 +208,22 @@ export class GoogleMailManager implements MailManager { type LabelCount = { label: string; count: number }; - const mapped: LabelCount[] = await Promise.all( + const mapped: LabelCount[] = (await Promise.all( results.map(async (res) => { + if ('_tag' in res && res._tag === 'LabelFetchFailed') { + return null; + } let labelName = (res.data.name ?? res.data.id ?? '').toLowerCase(); - if (labelName === 'draft') labelName = 'drafts'; + if (labelName === 'draft') { + labelName = 'drafts'; + } const isTotalLabel = labelName === 'drafts' || labelName === 'sent'; return { label: labelName, count: Number(isTotalLabel ? res.data.threadsTotal : res.data.threadsUnread), }; }), - ); + )).filter((item): item is LabelCount => item !== null); // Get archive count try {