From b5d9c8ca11c4b8277ed675e4ea501c9671eaa487 Mon Sep 17 00:00:00 2001 From: alma Date: Wed, 14 Jan 2026 16:44:17 +0100 Subject: [PATCH] Mail Widget --- app/api/courrier/route.ts | 13 ++++++-- components/email/EmailLayout.tsx | 55 ++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/app/api/courrier/route.ts b/app/api/courrier/route.ts index 729635d..86add5f 100644 --- a/app/api/courrier/route.ts +++ b/app/api/courrier/route.ts @@ -40,9 +40,10 @@ export async function GET(request: Request) { const searchQuery = searchParams.get("search") || ""; const accountId = searchParams.get("accountId") || ""; const checkOnly = searchParams.get("checkOnly") === "true"; + const refresh = searchParams.get("refresh") === "true"; // CRITICAL FIX: Log exact parameters received by the API - console.log(`[API] Received request with: folder=${folder}, accountId=${accountId}, page=${page}, checkOnly=${checkOnly}`); + console.log(`[API] Received request with: folder=${folder}, accountId=${accountId}, page=${page}, checkOnly=${checkOnly}, refresh=${refresh}`); // CRITICAL FIX: More robust parameter normalization // 1. If folder contains an account prefix, extract it but DO NOT use it @@ -62,8 +63,14 @@ export async function GET(request: Request) { // CRITICAL FIX: Enhanced logging for parameter resolution console.log(`[API] Using normalized parameters: folder=${normalizedFolder}, accountId=${effectiveAccountId}`); - // Try to get from Redis cache first, but only if it's not a search query and not checkOnly - if (!searchQuery && !checkOnly) { + // If refresh=true, invalidate cache before fetching + if (refresh) { + console.log(`[API] Refresh requested - invalidating cache for ${session.user.id}:${effectiveAccountId}:${normalizedFolder}`); + await invalidateFolderCache(session.user.id, effectiveAccountId, normalizedFolder); + } + + // Try to get from Redis cache first, but only if it's not a search query, not checkOnly, and not refresh + if (!searchQuery && !checkOnly && !refresh) { // CRITICAL FIX: Use consistent cache key format with the correct account ID console.log(`[API] Checking Redis cache for ${session.user.id}:${effectiveAccountId}:${normalizedFolder}:${page}:${perPage}`); const cachedEmails = await getCachedEmailList( diff --git a/components/email/EmailLayout.tsx b/components/email/EmailLayout.tsx index bdd39e3..9731c67 100644 --- a/components/email/EmailLayout.tsx +++ b/components/email/EmailLayout.tsx @@ -35,6 +35,7 @@ export default function EmailLayout({ className = '' }: EmailLayoutProps) { email: string; display_name?: string; }>>([]); + const [selectedAccountId, setSelectedAccountId] = useState(''); // UI state const [loading, setLoading] = useState(true); @@ -50,11 +51,17 @@ export default function EmailLayout({ className = '' }: EmailLayoutProps) { const { toast } = useToast(); const { data: session } = useSession(); - // Load emails on component mount and when folder changes + // Load accounts on component mount useEffect(() => { - loadEmails(); - loadAccounts(); // Load accounts when component mounts - }, [currentFolder, page]); + loadAccounts(); + }, []); + + // Load emails when folder, page, or selected account changes + useEffect(() => { + if (selectedAccountId || accounts.length > 0) { + loadEmails(); + } + }, [currentFolder, page, selectedAccountId]); // Function to load emails const loadEmails = async (refresh = false) => { @@ -70,9 +77,15 @@ export default function EmailLayout({ className = '' }: EmailLayoutProps) { const queryParams = new URLSearchParams({ folder: currentFolder, page: page.toString(), - perPage: '20' + perPage: '20', + refresh: refresh.toString() }); + // Add accountId if a specific account is selected + if (selectedAccountId) { + queryParams.set('accountId', selectedAccountId); + } + if (searchQuery) { queryParams.set('search', searchQuery); } @@ -129,11 +142,17 @@ export default function EmailLayout({ className = '' }: EmailLayoutProps) { if (response.ok) { const data = await response.json(); if (data.accounts) { - setAccounts(data.accounts.map((acc: any) => ({ + const loadedAccounts = data.accounts.map((acc: any) => ({ id: acc.id || acc.email, email: acc.email, display_name: acc.display_name - }))); + })); + setAccounts(loadedAccounts); + + // Auto-select the first account if none is selected + if (!selectedAccountId && loadedAccounts.length > 0) { + setSelectedAccountId(loadedAccounts[0].id); + } } } } catch (err) { @@ -270,6 +289,28 @@ export default function EmailLayout({ className = '' }: EmailLayoutProps) {
{/* Sidebar */}
+ {/* Account selector */} + {accounts.length > 1 && ( +
+ + +
+ )} + {/* New email button */}