Mail Widget

This commit is contained in:
alma 2026-01-14 16:46:49 +01:00
parent b5d9c8ca11
commit 4c3e466d9f

View File

@ -28,29 +28,65 @@ export function Email() {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
const [mailUrl, setMailUrl] = useState<string | null>(null); const [mailUrl, setMailUrl] = useState<string | null>(null);
const [accounts, setAccounts] = useState<Array<{ id: string; email: string }>>([]);
useEffect(() => { useEffect(() => {
fetchEmails(); loadAccounts();
}, []); }, []);
useEffect(() => {
if (accounts.length > 0) {
fetchEmails();
}
}, [accounts]);
const loadAccounts = async () => {
try {
const response = await fetch('/api/courrier/accounts');
if (response.ok) {
const data = await response.json();
if (data.accounts) {
setAccounts(data.accounts.map((acc: any) => ({
id: acc.id || acc.email,
email: acc.email
})));
}
}
} catch (err) {
console.error('Error loading accounts:', err);
}
};
const fetchEmails = async (isRefresh = false) => { const fetchEmails = async (isRefresh = false) => {
setLoading(true); setLoading(true);
setError(null); setError(null);
try { try {
const response = await fetch('/api/courrier?folder=INBOX&page=1&perPage=5' + (isRefresh ? '&refresh=true' : '')); // Fetch emails from all accounts in parallel
const emailPromises = accounts.map(async (account) => {
const url = `/api/courrier?folder=INBOX&page=1&perPage=5&accountId=${encodeURIComponent(account.id)}${isRefresh ? '&refresh=true' : ''}`;
const response = await fetch(url);
if (!response.ok) { if (!response.ok) {
throw new Error('Failed to fetch emails'); console.warn(`Failed to fetch emails for account ${account.id}`);
return [];
} }
const data = await response.json(); const data = await response.json();
if (data.error || !data.emails) {
return [];
}
// Add accountId to each email for proper identification
return data.emails.map((email: any) => ({
...email,
accountId: account.id
}));
});
if (data.error) { const allEmailsArrays = await Promise.all(emailPromises);
setError(data.error); const allEmails = allEmailsArrays.flat();
setEmails([]);
} else { // Transform and sort all emails
// Transform data format if needed const transformedEmails = allEmails
const transformedEmails = data.emails.map((email: any) => ({ .map((email: any) => ({
id: email.id, id: email.id,
subject: email.subject, subject: email.subject,
from: email.from[0]?.address || '', from: email.from[0]?.address || '',
@ -58,7 +94,8 @@ export function Email() {
date: email.date, date: email.date,
read: email.flags.seen, read: email.flags.seen,
starred: email.flags.flagged, starred: email.flags.flagged,
folder: email.folder folder: email.folder,
accountId: email.accountId
})) }))
// Sort emails by date (most recent first) // Sort emails by date (most recent first)
.sort((a: Email, b: Email) => new Date(b.date).getTime() - new Date(a.date).getTime()) .sort((a: Email, b: Email) => new Date(b.date).getTime() - new Date(a.date).getTime())
@ -66,7 +103,6 @@ export function Email() {
setEmails(transformedEmails); setEmails(transformedEmails);
setMailUrl('/courrier'); setMailUrl('/courrier');
}
} catch (error) { } catch (error) {
console.error('Error fetching emails:', error); console.error('Error fetching emails:', error);
setError('Failed to load emails'); setError('Failed to load emails');