diff --git a/app/courrier/page.tsx b/app/courrier/page.tsx index a8cced06..0dd141cb 100644 --- a/app/courrier/page.tsx +++ b/app/courrier/page.tsx @@ -97,6 +97,61 @@ export default function CourrierPage() { const [showLoginNeeded, setShowLoginNeeded] = useState(false); const [sidebarOpen, setSidebarOpen] = useState(true); const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false); + const [accountsDropdownOpen, setAccountsDropdownOpen] = useState(false); + const [currentView, setCurrentView] = useState('INBOX'); + const [unreadCount, setUnreadCount] = useState(0); + const [loading, setLoading] = useState(false); + + // Mock accounts for the sidebar + const [accounts, setAccounts] = useState([ + { id: 0, name: 'All', email: '', color: 'bg-gray-500' }, + { id: 1, name: 'Mail', email: 'user@example.com', color: 'bg-blue-500', folders: mailboxes } + ]); + const [selectedAccount, setSelectedAccount] = useState(null); + + // Update account folders when mailboxes change + useEffect(() => { + setAccounts(prev => { + const updated = [...prev]; + if (updated[1]) { + updated[1].folders = mailboxes; + } + return updated; + }); + }, [mailboxes]); + + // Calculate unread count (this would be replaced with actual data in production) + useEffect(() => { + // Example: counting unread emails in the inbox + const unreadInInbox = emails.filter(email => !email.read && currentFolder === 'INBOX').length; + setUnreadCount(unreadInInbox); + }, [emails, currentFolder]); + + // Helper to get folder icons + const getFolderIcon = (folder: string) => { + const folderLower = folder.toLowerCase(); + + if (folderLower.includes('inbox')) { + return Inbox; + } else if (folderLower.includes('sent')) { + return Send; + } else if (folderLower.includes('trash')) { + return Trash; + } else if (folderLower.includes('archive')) { + return Archive; + } else if (folderLower.includes('draft')) { + return Edit; + } else if (folderLower.includes('spam') || folderLower.includes('junk')) { + return AlertOctagon; + } else { + return Folder; + } + }; + + // Helper to format folder names + const formatFolderName = (folder: string) => { + return folder.charAt(0).toUpperCase() + folder.slice(1).toLowerCase(); + }; // Check for more emails const hasMoreEmails = page < totalPages; @@ -160,6 +215,12 @@ export default function CourrierPage() { setComposeType('new'); setShowComposeModal(true); }; + + // Handle mailbox change + const handleMailboxChange = (folder: string) => { + changeFolder(folder); + setCurrentView(folder); + }; // Handle sending email const handleSendEmail = async (emailData: EmailData) => { @@ -171,6 +232,30 @@ export default function CourrierPage() { await deleteEmails(selectedEmailIds); setShowDeleteConfirm(false); }; + + // Render sidebar navigation + const renderSidebarNav = () => ( + + ); // Check login on mount useEffect(() => { @@ -190,10 +275,181 @@ export default function CourrierPage() { }; return ( -
- {/* Loading Fix for development */} + <> + {/* Main layout */} +
+
+
+ {/* Sidebar */} +
+ {/* Courrier Title */} +
+
+ + COURRIER +
+
+ + {/* Compose button and refresh button */} +
+ + +
+ + {/* Accounts Section */} +
+ + + {accountsDropdownOpen && ( +
+ {accounts.map(account => ( +
+ + + {/* Show folders for email accounts (not for "All" account) without the "Folders" header */} + {account.id !== 0 && ( +
+ {account.folders && account.folders.length > 0 ? ( + account.folders.map((folder) => ( + + )) + ) : ( +
+
+ {/* Create placeholder folder items with shimmer effect */} + {Array.from({ length: 5 }).map((_, index) => ( +
+
+
+
+ ))} +
+
+ )} +
+ )} +
+ ))} +
+ )} +
+ + {/* Navigation */} + {renderSidebarNav()} +
+ + {/* Email List and Content View */} +
+ {/* Email List */} + + + {/* Email Content View */} +
+ {selectedEmail ? ( + handleEmailSelect('')} + onReply={handleReply} + onReplyAll={handleReplyAll} + onForward={handleForward} + onToggleStar={() => toggleStarred(selectedEmail.id)} + /> + ) : ( +
+ +

Select an email to read

+

+ Choose an email from the list or compose a new message to get started. +

+ +
+ )} +
+
+
+
+
+ {/* Login needed alert */} setShowLoginNeeded(false)} /> - {/* Main Content */} -
- {/* Sidebar (Desktop) */} - {sidebarOpen && ( - - )} - - {/* Email List and Content View */} -
- {/* Email List */} - - - {/* Email Content View */} -
- {selectedEmail ? ( - handleEmailSelect('')} - onReply={handleReply} - onReplyAll={handleReplyAll} - onForward={handleForward} - onToggleStar={() => toggleStarred(selectedEmail.id)} - /> - ) : ( -
- -

Select an email to read

-

- Choose an email from the list or compose a new message to get started. -

- -
- )} -
-
-
- {/* Compose Modal */} - - - setShowComposeModal(false)} - onSend={async (emailData: EmailData) => { - await sendEmail(emailData); - }} - /> - - + {showComposeModal && ( + setShowComposeModal(false)} + onSend={async (emailData: EmailData) => { + await sendEmail(emailData); + }} + /> + )} {/* Delete Confirmation Dialog */} setShowDeleteConfirm(false)} /> -
+ ); } \ No newline at end of file diff --git a/components/email/ComposeEmail.tsx b/components/email/ComposeEmail.tsx index 8e539395..a23c2ed6 100644 --- a/components/email/ComposeEmail.tsx +++ b/components/email/ComposeEmail.tsx @@ -239,40 +239,196 @@ export default function ComposeEmail(props: ComposeEmailAllProps) { }; return ( - - - -
- +
+
+ {/* Modal Header */} +
+

+ {type === 'reply' ? 'Reply' : type === 'forward' ? 'Forward' : type === 'reply-all' ? 'Reply All' : 'New Message'} +

+ +
+ + {/* Modal Body */} +
+
+ {/* To Field */} +
+ + setTo(e.target.value)} + placeholder="recipient@example.com" + className="w-full mt-1 bg-white border-gray-300 text-gray-900" + /> +
+ + {/* CC/BCC Toggle Buttons */} +
+ + +
+ + {/* CC Field */} + {showCc && ( +
+ + setCc(e.target.value)} + placeholder="cc@example.com" + className="w-full mt-1 bg-white border-gray-300 text-gray-900" + /> +
+ )} + + {/* BCC Field */} + {showBcc && ( +
+ + setBcc(e.target.value)} + placeholder="bcc@example.com" + className="w-full mt-1 bg-white border-gray-300 text-gray-900" + /> +
+ )} + + {/* Subject Field */} +
+ + setSubject(e.target.value)} + placeholder="Enter subject" + className="w-full mt-1 bg-white border-gray-300 text-gray-900" + /> +
+ + {/* Message Body */} +
+ +