'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 = () => (
{mailboxes.map((folder) => (
handleMailboxChange(folder)}
>
{getFolderIcon(folder)}
{formatFolderName(folder)}
))}
);
// 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 */}
handleEmailSelect('')}
className="md:hidden flex-shrink-0"
>
{selectedEmail.subject}
handleReplyOrForward('reply')}
>
handleReplyOrForward('reply-all')}
>
handleReplyOrForward('forward')}
>
toggleStarred(selectedEmail.id)}
>
{/* 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 */}
{/* Compose button and refresh button */}
{
setShowCompose(true);
setComposeTo('');
setComposeCc('');
setComposeBcc('');
setComposeSubject('');
setComposeBody('');
setShowCc(false);
setShowBcc(false);
}}
>
handleMailboxChange('INBOX')}
className="text-gray-600 hover:text-gray-900 hover:bg-gray-100"
>
{/* Accounts Section */}
setAccountsDropdownOpen(!accountsDropdownOpen)}
>
Accounts
{accountsDropdownOpen ? : }
{accountsDropdownOpen && (
{accounts.map(account => (
setSelectedAccount(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()}
>
);
}