Mail Widget
This commit is contained in:
parent
b5d9c8ca11
commit
4c3e466d9f
@ -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
|
||||||
if (!response.ok) {
|
const emailPromises = accounts.map(async (account) => {
|
||||||
throw new Error('Failed to fetch emails');
|
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) {
|
// Transform and sort all emails
|
||||||
setError(data.error);
|
const transformedEmails = allEmails
|
||||||
setEmails([]);
|
.map((email: any) => ({
|
||||||
} else {
|
|
||||||
// Transform data format if needed
|
|
||||||
const transformedEmails = data.emails.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,15 +94,15 @@ 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())
|
||||||
.slice(0, 5); // Only show the first 5 emails
|
.slice(0, 5); // Only show the first 5 emails
|
||||||
|
|
||||||
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');
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user