'use client'; import { useState, useEffect, useMemo } from 'react'; import EmailPreview from './EmailPreview'; import ComposeEmail from './ComposeEmail'; import { Loader2 } from 'lucide-react'; import { formatReplyEmail, EmailMessage as FormatterEmailMessage } from '@/lib/utils/email-formatter'; // Add local EmailMessage interface interface EmailAddress { name: string; address: string; } interface EmailMessage { id: string; messageId?: string; subject: string; from: EmailAddress[]; to: EmailAddress[]; cc?: EmailAddress[]; bcc?: EmailAddress[]; date: Date | string; flags?: { seen: boolean; flagged: boolean; answered: boolean; deleted: boolean; draft: boolean; }; preview?: string; content?: string; html?: string; text?: string; hasAttachments?: boolean; attachments?: any[]; folder?: string; size?: number; contentFetched?: boolean; } interface EmailPanelProps { selectedEmailId: string | null; folder?: string; onSendEmail: (emailData: { to: string; cc?: string; bcc?: string; subject: string; body: string; attachments?: Array<{ name: string; content: string; type: string; }>; }) => Promise; } export default function EmailPanel({ selectedEmailId, folder = 'INBOX', onSendEmail }: EmailPanelProps) { const [email, setEmail] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); // Compose mode state const [isComposing, setIsComposing] = useState(false); const [composeType, setComposeType] = useState<'new' | 'reply' | 'reply-all' | 'forward'>('new'); // Create a formatted version of the email content using the same formatter as ComposeEmail const formattedEmail = useMemo(() => { if (!email) return null; try { // Convert to the formatter message format - this is what ComposeEmail does const formatterEmail: FormatterEmailMessage = { id: email.id, messageId: email.messageId, subject: email.subject, from: email.from || [], to: email.to || [], cc: email.cc || [], bcc: email.bcc || [], date: email.date, content: email.content, html: email.html, text: email.text, hasAttachments: email.hasAttachments || false }; // Try both formatting approaches to match what ComposeEmail would display // This handles preview, reply and forward cases let formattedContent: string; // ComposeEmail switches based on type - we need to do the same const { content: replyContent } = formatReplyEmail(formatterEmail, 'reply'); // Set the formatted content formattedContent = replyContent; console.log("Generated formatted content for email preview"); // Return a new email object with the formatted content return { ...email, formattedContent }; } catch (error) { console.error('Error formatting email content:', error); return email; } }, [email]); // Load email content when selectedEmailId changes useEffect(() => { if (selectedEmailId) { fetchEmail(selectedEmailId); // Close compose mode when selecting a different email setIsComposing(false); } else { setEmail(null); } }, [selectedEmailId, folder]); // Fetch the email content const fetchEmail = async (id: string) => { setLoading(true); setError(null); try { const response = await fetch(`/api/courrier/${id}?folder=${encodeURIComponent(folder)}`); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to fetch email'); } const data = await response.json(); if (!data) { throw new Error('Email not found'); } // Mark as read if not already if (!data.flags?.seen) { markAsRead(id); } setEmail(data); } catch (err) { console.error('Error fetching email:', err); setError(err instanceof Error ? err.message : 'Failed to load email'); } finally { setLoading(false); } }; // Mark email as read const markAsRead = async (id: string) => { try { await fetch(`/api/courrier/${id}/mark-read`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ action: 'mark-read' }), }); } catch (err) { console.error('Error marking email as read:', err); } }; // Handle reply/forward actions const handleReply = (type: 'reply' | 'reply-all' | 'forward') => { setComposeType(type); setIsComposing(true); }; // Handle compose mode close const handleComposeClose = () => { setIsComposing(false); setComposeType('new'); }; // If no email is selected and not composing if (!selectedEmailId && !isComposing) { return (

Select an email to view or

); } // Show loading state if (loading) { return (

Loading email...

); } // Show error state if (error) { return (

{error}

); } // Show compose mode or email preview return (
{/* Remove ComposeEmail overlay/modal logic. Only show preview or a button to trigger compose in parent. */} {isComposing ? (

Compose mode is now handled by the main modal.

) : (
)}
); }