'use client'; import React, { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { Mail, Loader2, AlertCircle, MoreVertical, Settings, Plus as PlusIcon, Trash2, Edit, Inbox, Send, Star, Trash, Plus, ChevronLeft, ChevronRight, Search, ChevronDown, Folder, ChevronUp, Reply, Forward, ReplyAll, MoreHorizontal, FolderOpen, X, Paperclip, MessageSquare, Copy, EyeOff, AlertOctagon, Archive, RefreshCw } from 'lucide-react'; import { Dialog, DialogContent } from '@/components/ui/dialog'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { ScrollArea } from '@/components/ui/scroll-area'; import { Avatar, AvatarFallback } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; // Import components import EmailSidebar from '@/components/email/EmailSidebar'; import EmailList from '@/components/email/EmailList'; import EmailContent from '@/components/email/EmailContent'; import EmailHeader from '@/components/email/EmailHeader'; import ComposeEmail from '@/components/email/ComposeEmail'; // Import the custom hook import { useCourrier, EmailData } from '@/hooks/use-courrier'; // Simplified version for this component function SimplifiedLoadingFix() { // In production, don't render anything if (process.env.NODE_ENV === 'production') { return null; } // Simple debugging component return (
Debug: Email app loaded
); } interface Account { id: number; name: string; email: string; color: string; folders?: string[]; } export default function CourrierPage() { const router = useRouter(); // Get all the email functionality from the hook const { emails, selectedEmail, selectedEmailIds, currentFolder, mailboxes, isLoading, isSending, error, searchQuery, page, totalPages, loadEmails, handleEmailSelect, markEmailAsRead, toggleStarred, sendEmail, deleteEmails, toggleEmailSelection, toggleSelectAll, changeFolder, searchEmails, formatEmailForAction, setPage, } = useCourrier(); // Local state const [showComposeModal, setShowComposeModal] = useState(false); const [composeData, setComposeData] = useState(null); const [composeType, setComposeType] = useState<'new' | 'reply' | 'reply-all' | 'forward'>('new'); 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; // Handle loading more emails on scroll const handleLoadMore = () => { if (hasMoreEmails && !isLoading) { setPage(page + 1); } }; // Handle bulk actions const handleBulkAction = async (action: 'delete' | 'mark-read' | 'mark-unread' | 'archive') => { if (selectedEmailIds.length === 0) return; switch (action) { case 'delete': setShowDeleteConfirm(true); break; case 'mark-read': // Mark all selected emails as read for (const emailId of selectedEmailIds) { await markEmailAsRead(emailId, true); } break; case 'mark-unread': // Mark all selected emails as unread for (const emailId of selectedEmailIds) { await markEmailAsRead(emailId, false); } break; case 'archive': // Archive functionality would be implemented here break; } }; // Handle email reply or forward const handleReplyOrForward = (type: 'reply' | 'reply-all' | 'forward') => { if (!selectedEmail) return; const formattedEmail = formatEmailForAction(selectedEmail, type); if (!formattedEmail) return; setComposeTo(formattedEmail.to || ''); setComposeCc(formattedEmail.cc || ''); setComposeSubject(formattedEmail.subject || ''); setComposeBody(formattedEmail.body || ''); if (type === 'forward') { setIsForwarding(true); } else { setIsReplying(true); } setShowCompose(true); setShowCc(type === 'reply-all'); }; // Handle compose new email const handleComposeNew = () => { setComposeTo(''); setComposeCc(''); setComposeBcc(''); setComposeSubject(''); setComposeBody(''); setShowCc(false); setShowBcc(false); setIsReplying(false); setIsForwarding(false); setShowCompose(true); }; // Handle sending email 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.'); } }; // Handle delete confirmation const handleDeleteConfirm = async () => { await deleteEmails(selectedEmailIds); setShowDeleteConfirm(false); }; // Check login on mount useEffect(() => { // Check if the user is logged in after a short delay const timer = setTimeout(() => { if (error?.includes('Not authenticated') || error?.includes('No email credentials found')) { setShowLoginNeeded(true); } }, 2000); return () => clearTimeout(timer); }, [error]); // Go to login page const handleGoToLogin = () => { 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(); }; // Get account color const getAccountColor = (accountId: number) => { const account = accounts.find(acc => acc.id === accountId); return account ? account.color : 'bg-gray-500'; }; // 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 if (folderLower.includes('archive')) { return ; } else if (folderLower.includes('draft')) { return ; } else if (folderLower.includes('spam') || folderLower.includes('junk')) { return ; } else { return ; } }; // Render email list component const renderEmailList = () => ( ); // Render email content based on the email body const renderEmailContent = (email: any) => { try { // For simple rendering in this example, we'll just display the content directly return
; } catch (e) { console.error('Error rendering email:', e); return
Failed to render email content
; } }; // Email list wrapper with preview panel const renderEmailListWrapper = () => (
{/* Email list panel */} {renderEmailList()} {/* Preview panel - will automatically take remaining space */}
{selectedEmail ? ( <> {/* Email actions header */}

{selectedEmail.subject}

{/* Scrollable content area */}
{(selectedEmail.from?.[0]?.name || '').charAt(0) || (selectedEmail.from?.[0]?.address || '').charAt(0) || '?'}

{selectedEmail.from?.[0]?.name || ''} <{selectedEmail.from?.[0]?.address || ''}>

to {selectedEmail.to?.[0]?.address || ''}

{selectedEmail.cc && selectedEmail.cc.length > 0 && (

cc {selectedEmail.cc.map(c => c.address).join(', ')}

)}
{formatDate(selectedEmail.date)}
{renderEmailContent(selectedEmail)}
) : (

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 (
Error loading emails {error}
); } return ( <> {/* Login required dialog */} Login Required You need to configure your email account credentials before you can access your emails. Cancel Setup Email {/* Main layout */}
{/* Sidebar */}
{/* Courrier Title */}
COURRIER
{/* 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()} ); }