diff --git a/app/courrier/page.tsx b/app/courrier/page.tsx index e6947392..9e30e26f 100644 --- a/app/courrier/page.tsx +++ b/app/courrier/page.tsx @@ -5,7 +5,7 @@ import { useRouter } from 'next/navigation'; import { Mail, Loader2, AlertCircle, ChevronLeft, ChevronRight, Reply, ReplyAll, Forward, - Star, FolderOpen + Star, FolderOpen, Plus as PlusIcon, RefreshCw, ChevronUp, ChevronDown } from 'lucide-react'; import { Dialog, DialogContent } from '@/components/ui/dialog'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; @@ -48,6 +48,14 @@ function SimplifiedLoadingFix() { ); } +interface Account { + id: number; + name: string; + email: string; + color: string; + folders?: string[]; +} + export default function CourrierPage() { const router = useRouter(); @@ -85,6 +93,29 @@ export default function CourrierPage() { const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [showLoginNeeded, setShowLoginNeeded] = useState(false); + // States to match the provided implementation + const [sidebarOpen, setSidebarOpen] = useState(true); + const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false); + const [isReplying, setIsReplying] = useState(false); + const [isForwarding, setIsForwarding] = useState(false); + const [accountsDropdownOpen, setAccountsDropdownOpen] = useState(false); + const [showCompose, setShowCompose] = useState(false); + const [composeTo, setComposeTo] = useState(''); + const [composeCc, setComposeCc] = useState(''); + const [composeBcc, setComposeBcc] = useState(''); + const [composeSubject, setComposeSubject] = useState(''); + const [composeBody, setComposeBody] = useState(''); + const [showCc, setShowCc] = useState(false); + const [showBcc, setShowBcc] = useState(false); + const [attachments, setAttachments] = useState([]); + + // Mock accounts + 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' } + ]); + const [selectedAccount, setSelectedAccount] = useState(null); + // Check for more emails const hasMoreEmails = page < totalPages; @@ -131,38 +162,69 @@ export default function CourrierPage() { const formattedEmail = formatEmailForAction(selectedEmail, type); if (!formattedEmail) return; - setComposeData({ - to: formattedEmail.to, - cc: formattedEmail.cc, - subject: formattedEmail.subject, - body: formattedEmail.body, - }); + setComposeTo(formattedEmail.to || ''); + setComposeCc(formattedEmail.cc || ''); + setComposeSubject(formattedEmail.subject || ''); + setComposeBody(formattedEmail.body || ''); - setComposeType(type); - setShowComposeModal(true); + if (type === 'forward') { + setIsForwarding(true); + } else { + setIsReplying(true); + } + + setShowCompose(true); + setShowCc(type === 'reply-all'); }; // Handle compose new email const handleComposeNew = () => { - setComposeData({ - to: '', - subject: '', - body: '', - }); - setComposeType('new'); - setShowComposeModal(true); + setComposeTo(''); + setComposeCc(''); + setComposeBcc(''); + setComposeSubject(''); + setComposeBody(''); + setShowCc(false); + setShowBcc(false); + setIsReplying(false); + setIsForwarding(false); + setShowCompose(true); }; // Handle sending email - const handleSend = async (emailData: EmailData) => { - await sendEmail(emailData); - - setShowComposeModal(false); - setComposeData(null); - - // Refresh the Sent folder if we're currently viewing it - if (currentFolder.toLowerCase() === 'sent') { - loadEmails(); + const handleSend = async () => { + if (!composeTo) { + alert('Please specify at least one recipient'); + return; + } + + try { + await sendEmail({ + to: composeTo, + cc: composeCc, + bcc: composeBcc, + subject: composeSubject, + body: composeBody, + }); + + // Clear compose form and close modal + setComposeTo(''); + setComposeCc(''); + setComposeBcc(''); + setComposeSubject(''); + setComposeBody(''); + setAttachments([]); + setShowCompose(false); + setIsReplying(false); + setIsForwarding(false); + + // Refresh the Sent folder if we're currently viewing it + if (currentFolder.toLowerCase() === 'sent') { + loadEmails(); + } + } catch (error) { + console.error('Error sending email:', error); + alert('Failed to send email. Please try again.'); } }; @@ -189,6 +251,163 @@ export default function CourrierPage() { router.push('/courrier/login'); }; + // Handle mailbox change + const handleMailboxChange = (newMailbox: string) => { + changeFolder(newMailbox); + }; + + // Format date for display + const formatDate = (dateString: string) => { + const date = new Date(dateString); + const now = new Date(); + + if (date.toDateString() === now.toDateString()) { + return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); + } else { + return date.toLocaleDateString([], { month: 'short', day: 'numeric' }); + } + }; + + // Render sidebar navigation + const renderSidebarNav = () => ( + + ); + + // Helper to format folder names + const formatFolderName = (folder: string) => { + return folder.charAt(0).toUpperCase() + folder.slice(1).toLowerCase(); + }; + + // Helper to get folder icons + const getFolderIcon = (folder: string) => { + const folderLower = folder.toLowerCase(); + + if (folderLower.includes('inbox')) { + return ; + } else if (folderLower.includes('sent')) { + return ; + } else if (folderLower.includes('trash')) { + return ; + } else { + return ; + } + }; + + // Email list wrapper with preview panel + const renderEmailListWrapper = () => ( +
+ {/* Email list panel */} + + + {/* Preview panel - will automatically take remaining space */} +
+ {selectedEmail ? ( + <> + {/* Email actions header */} +
+
+
+
+

+ {selectedEmail.subject || '(No subject)'} +

+
+
+
+
+ + + +
+
+
+
+ + {/* Email content with scroll area */} + + + + + ) : ( +
+ +

Select an email to view its contents

+
+ )} +
+
+ ); + + // Delete confirmation dialog + const renderDeleteConfirmDialog = () => ( + + + + Delete Emails + + Are you sure you want to delete {selectedEmailIds.length} selected email{selectedEmailIds.length > 1 ? 's' : ''}? This action cannot be undone. + + + + Cancel + Delete + + + + ); + // If there's a critical error, show error dialog if (error && !isLoading && emails.length === 0 && !showLoginNeeded) { return ( @@ -202,39 +421,8 @@ export default function CourrierPage() { ); } - // Create a properly formatted email message from composeData for the ComposeEmail component - const createEmailMessage = () => { - if (!composeData) return null; - - return { - id: 'temp-id', - messageId: '', - subject: composeData.subject || '', - from: [{ name: '', address: '' }], - to: [{ name: '', address: composeData.to || '' }], - cc: composeData.cc ? [{ name: '', address: composeData.cc }] : [], - bcc: composeData.bcc ? [{ name: '', address: composeData.bcc }] : [], - date: new Date(), - content: composeData.body || '', - html: composeData.body || '', - hasAttachments: false - }; - }; - - // Format date for display - const formatDate = (dateString: string) => { - const date = new Date(dateString); - const now = new Date(); - - if (date.toDateString() === now.toDateString()) { - return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); - } else { - return date.toLocaleDateString([], { month: 'short', day: 'numeric' }); - } - }; - return ( -
+ <> {/* Login required dialog */} @@ -253,137 +441,143 @@ export default function CourrierPage() { - {/* Delete confirmation dialog */} - - - - Confirm Deletion - - Are you sure you want to delete {selectedEmailIds.length} {selectedEmailIds.length === 1 ? 'email' : 'emails'}? - This action cannot be undone. - - - - Cancel - - Delete - - - - - - {/* Compose email dialog */} - - - setShowComposeModal(false)} - onSend={handleSend} - /> - - - - {/* Main email interface */} -
- {/* Email header */} - - - {/* Main content area - fixed-width sidebar and list panel layout */} -
- {/* Sidebar - fixed width 64px */} -
- loadEmails(false)} - onCompose={handleComposeNew} - isLoading={isLoading} - /> -
- - {/* Email list - fixed width 320px */} -
- -
- - {/* Email content - takes remaining space */} -
- {selectedEmail ? ( - <> - {/* Email actions header */} -
-
-
-
-

- {selectedEmail.subject || '(No subject)'} -

-
-
-
-
- - - -
-
-
+ {/* Main layout */} +
+
+
+ {/* Sidebar */} +
+ {/* Courrier Title */} +
+
+ + COURRIER
- - {/* Email content with avatar and proper scroll area */} - - - - - ) : ( -
- -

Select an email to view its contents

- )} + + {/* Compose button and refresh button */} +
+ + +
+ + {/* Accounts Section */} +
+ + + {accountsDropdownOpen && ( +
+ {accounts.map(account => ( +
+ +
+ ))} +
+ )} +
+ + {/* Navigation */} + {renderSidebarNav()} +
+ + {/* Main content area */} +
+ {/* Email list panel */} + {renderEmailListWrapper()} +
-
-
+ + + {/* Compose Email Modal */} + { + console.log('Email sent:', email); + setShowCompose(false); + setIsReplying(false); + setIsForwarding(false); + return Promise.resolve(); + }} + onCancel={() => { + setShowCompose(false); + setComposeTo(''); + setComposeCc(''); + setComposeBcc(''); + setComposeSubject(''); + setComposeBody(''); + setShowCc(false); + setShowBcc(false); + setAttachments([]); + setIsReplying(false); + setIsForwarding(false); + }} + /> + {renderDeleteConfirmDialog()} + ); } \ No newline at end of file