From 508157549bec4d130e54dd7556da2e076018ebc5 Mon Sep 17 00:00:00 2001 From: alma Date: Wed, 16 Apr 2025 11:38:12 +0200 Subject: [PATCH] mail page ui correction maj 3 --- app/mail/page.tsx | 124 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 101 insertions(+), 23 deletions(-) diff --git a/app/mail/page.tsx b/app/mail/page.tsx index fcb3a51..9a14800 100644 --- a/app/mail/page.tsx +++ b/app/mail/page.tsx @@ -390,6 +390,20 @@ function decodeMimeContent(content: string): string { return cleanHtml(content); } +// Add this helper function +const renderEmailContent = (email: Email) => { + const decodedContent = decodeMimeContent(email.body); + if (email.body.includes('Content-Type: text/html')) { + return
; + } + return
{decodedContent}
; +}; + +// Add this helper function +const decodeEmailContent = (content: string, charset: string = 'utf-8') => { + return convertCharset(content, charset); +}; + export default function MailPage() { const router = useRouter(); const [loading, setLoading] = useState(true); @@ -425,6 +439,7 @@ export default function MailPage() { const [deleteType, setDeleteType] = useState<'email' | 'emails' | 'account'>('email'); const [itemToDelete, setItemToDelete] = useState(null); const [showCc, setShowCc] = useState(false); + const [contentLoading, setContentLoading] = useState(false); // Check for stored credentials useEffect(() => { @@ -489,7 +504,8 @@ export default function MailPage() { date: new Date(email.date), read: email.read || false, starred: email.starred || false, - category: email.category || 'inbox' + category: email.category || 'inbox', + body: decodeMimeContent(email.body) })); setEmails(processedEmails); @@ -539,12 +555,15 @@ export default function MailPage() { // Add email action handlers const handleEmailSelect = (emailId: number) => { - setSelectedEmails(prev => { - if (prev.includes(emailId)) { - return prev.filter(id => id !== emailId); - } - return [...prev, emailId]; - }); + const email = emails.find(e => e.id === emailId); + if (email) { + setSelectedEmail(email); + // Mark as read + const updatedEmails = emails.map(e => + e.id === emailId ? { ...e, read: true } : e + ); + setEmails(updatedEmails); + } }; const handleEmailCheckbox = (e: React.ChangeEvent, emailId: number) => { @@ -576,25 +595,26 @@ export default function MailPage() { }; const handleReply = async (type: 'reply' | 'replyAll' | 'forward') => { - const selectedEmailData = selectedEmail; + const selectedEmailData = getSelectedEmail(); if (!selectedEmailData) return; setShowCompose(true); const subject = `${type === 'forward' ? 'Fwd: ' : 'Re: '}${selectedEmailData.subject}`; let to = ''; let content = ''; + const decodedBody = decodeMimeContent(selectedEmailData.body); switch (type) { case 'reply': to = selectedEmailData.from; - content = `\n\nOn ${new Date(selectedEmailData.date).toLocaleString()}, ${selectedEmailData.fromName} wrote:\n> ${selectedEmailData.body.split('\n').join('\n> ')}`; + content = `\n\nOn ${new Date(selectedEmailData.date).toLocaleString()}, ${selectedEmailData.fromName} wrote:\n> ${decodedBody.split('\n').join('\n> ')}`; break; case 'replyAll': to = selectedEmailData.from; - content = `\n\nOn ${new Date(selectedEmailData.date).toLocaleString()}, ${selectedEmailData.fromName} wrote:\n> ${selectedEmailData.body.split('\n').join('\n> ')}`; + content = `\n\nOn ${new Date(selectedEmailData.date).toLocaleString()}, ${selectedEmailData.fromName} wrote:\n> ${decodedBody.split('\n').join('\n> ')}`; break; case 'forward': - content = `\n\n---------- Forwarded message ----------\nFrom: ${selectedEmailData.fromName} <${selectedEmailData.from}>\nDate: ${new Date(selectedEmailData.date).toLocaleString()}\nSubject: ${selectedEmailData.subject}\n\n${selectedEmailData.body}`; + content = `\n\n---------- Forwarded message ----------\nFrom: ${selectedEmailData.fromName} <${selectedEmailData.from}>\nDate: ${new Date(selectedEmailData.date).toLocaleString()}\nSubject: ${selectedEmailData.subject}\n\n${decodedBody}`; break; } @@ -973,8 +993,22 @@ export default function MailPage() {
- {selectedEmail.body} + {decodeMimeContent(selectedEmail.body)}
+ + {selectedEmail && parseFullEmail(selectedEmail.body).attachments.length > 0 && ( +
+

Attachments

+
+ {parseFullEmail(selectedEmail.body).attachments.map((attachment, index) => ( +
+ + {attachment.filename} +
+ ))} +
+
+ )} ) : (
@@ -989,24 +1023,68 @@ export default function MailPage() { - Are you sure? + + {deleteType === 'email' ? 'Delete Email' : + deleteType === 'emails' ? 'Delete Selected Emails' : + 'Delete Account'} + - {deleteType === 'email' && "This email will be moved to trash."} - {deleteType === 'emails' && `${selectedEmails.length} emails will be moved to trash.`} - {deleteType === 'account' && "This account will be permanently removed. This action cannot be undone."} + This action cannot be undone. - setShowDeleteConfirm(false)}>Cancel - - {deleteType === 'account' ? 'Delete Account' : 'Move to Trash'} - + Cancel + Delete + + {/* Compose Modal */} + {showCompose && ( +
+
+
+

New Message

+ +
+
+
+ + setComposeTo(e.target.value)} + /> +
+
+ + setComposeSubject(e.target.value)} + /> +
+
+ +