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 [error, setError] = useState<string | null>(null);
const [mailUrl, setMailUrl] = useState<string | null>(null);
const [accounts, setAccounts] = useState<Array<{ id: string; email: string }>>([]);
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) => {
setLoading(true);
setError(null);
try {
const response = await fetch('/api/courrier?folder=INBOX&page=1&perPage=5' + (isRefresh ? '&refresh=true' : ''));
if (!response.ok) {
throw new Error('Failed to fetch emails');
}
// 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) {
console.warn(`Failed to fetch emails for account ${account.id}`);
return [];
}
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
}));
});
const data = await response.json();
const allEmailsArrays = await Promise.all(emailPromises);
const allEmails = allEmailsArrays.flat();
if (data.error) {
setError(data.error);
setEmails([]);
} else {
// Transform data format if needed
const transformedEmails = data.emails.map((email: any) => ({
// Transform and sort all emails
const transformedEmails = allEmails
.map((email: any) => ({
id: email.id,
subject: email.subject,
from: email.from[0]?.address || '',
@ -58,15 +94,15 @@ export function Email() {
date: email.date,
read: email.flags.seen,
starred: email.flags.flagged,
folder: email.folder
folder: email.folder,
accountId: email.accountId
}))
// Sort emails by date (most recent first)
.sort((a: Email, b: Email) => new Date(b.date).getTime() - new Date(a.date).getTime())
.slice(0, 5); // Only show the first 5 emails
setEmails(transformedEmails);
setMailUrl('/courrier');
}
setEmails(transformedEmails);
setMailUrl('/courrier');
} catch (error) {
console.error('Error fetching emails:', error);
setError('Failed to load emails');