Mail Widget
This commit is contained in:
parent
b5d9c8ca11
commit
4c3e466d9f
@ -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');
|
||||
|
||||
Loading…
Reference in New Issue
Block a user