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 {