courrier multi account restore compose

This commit is contained in:
alma 2025-04-28 20:23:57 +02:00
parent 6431f8d908
commit f05a982a3a
2 changed files with 22 additions and 27 deletions

View File

@ -23,7 +23,11 @@ interface EmailLayoutProps {
export default function EmailLayout({ className = '' }: EmailLayoutProps) {
// Email state
const [emails, setEmails] = useState<EmailMessage[]>([]);
const [selectedEmailId, setSelectedEmailId] = useState<string | null>(null);
const [selectedEmail, setSelectedEmail] = useState<{
emailId: string;
accountId: string;
folder: string;
} | null>(null);
const [currentFolder, setCurrentFolder] = useState<string>('INBOX');
const [folders, setFolders] = useState<string[]>([]);
const [mailboxes, setMailboxes] = useState<string[]>([]);
@ -116,14 +120,14 @@ export default function EmailLayout({ className = '' }: EmailLayoutProps) {
// Handle folder change
const handleFolderChange = (folder: string) => {
setCurrentFolder(folder);
setSelectedEmailId(null);
setSelectedEmail(null);
setPage(1);
setSearchQuery('');
};
// Handle email selection
const handleEmailSelect = (id: string, accountId: string, folder: string) => {
setSelectedEmailId(id);
const handleEmailSelect = (emailId: string, accountId: string, folder: string) => {
setSelectedEmail({ emailId, accountId, folder });
};
// Handle search
@ -142,7 +146,7 @@ export default function EmailLayout({ className = '' }: EmailLayoutProps) {
// Handle composing a new email
const handleComposeNew = () => {
setSelectedEmailId(null);
setSelectedEmail(null);
// The compose functionality will be handled by the EmailPanel component
};
@ -313,7 +317,7 @@ export default function EmailLayout({ className = '' }: EmailLayoutProps) {
<div
key={email.id}
className={`p-3 hover:bg-secondary/20 cursor-pointer transition-colors ${
selectedEmailId === email.id ? 'bg-secondary/30' : ''
selectedEmail?.emailId === email.id ? 'bg-secondary/30' : ''
} ${!email.flags.seen ? 'bg-primary/5' : ''}`}
onClick={() => handleEmailSelect(email.id, email.accountId || '', email.folder || '')}
>
@ -362,7 +366,7 @@ export default function EmailLayout({ className = '' }: EmailLayoutProps) {
{/* Email preview */}
<div className="flex-1 h-full overflow-hidden">
<EmailPanel
selectedEmailId={selectedEmailId}
selectedEmail={selectedEmail}
folder={currentFolder}
onSendEmail={handleSendEmail}
/>

View File

@ -40,8 +40,7 @@ interface EmailMessage {
}
interface EmailPanelProps {
selectedEmailId: string | null;
folder?: string;
selectedEmail: { emailId: string; accountId: string; folder: string } | null;
onSendEmail: (emailData: {
to: string;
cc?: string;
@ -57,8 +56,7 @@ interface EmailPanelProps {
}
export default function EmailPanel({
selectedEmailId,
folder = 'INBOX',
selectedEmail,
onSendEmail
}: EmailPanelProps) {
const [email, setEmail] = useState<EmailMessage | null>(null);
@ -113,41 +111,34 @@ export default function EmailPanel({
}
}, [email]);
// Load email content when selectedEmailId changes
// Load email content when selectedEmail changes
useEffect(() => {
if (selectedEmailId) {
fetchEmail(selectedEmailId);
// Close compose mode when selecting a different email
if (selectedEmail) {
fetchEmail(selectedEmail.emailId, selectedEmail.accountId, selectedEmail.folder);
setIsComposing(false);
} else {
setEmail(null);
}
}, [selectedEmailId, folder]);
}, [selectedEmail]);
// Fetch the email content
const fetchEmail = async (id: string) => {
const fetchEmail = async (emailId: string, accountId: string, folder: string) => {
setLoading(true);
setError(null);
try {
const response = await fetch(`/api/courrier/${id}?folder=${encodeURIComponent(folder)}`);
const response = await fetch(`/api/courrier/${emailId}?accountId=${encodeURIComponent(accountId)}&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);
markAsRead(emailId);
}
setEmail(data);
} catch (err) {
console.error('Error fetching email:', err);
@ -185,7 +176,7 @@ export default function EmailPanel({
};
// If no email is selected and not composing
if (!selectedEmailId && !isComposing) {
if (!selectedEmail && !isComposing) {
return (
<div className="h-full flex items-center justify-center">
<div className="text-center text-muted-foreground">
@ -224,7 +215,7 @@ export default function EmailPanel({
<p>{error}</p>
<button
className="text-primary mt-2 hover:underline"
onClick={() => selectedEmailId && fetchEmail(selectedEmailId)}
onClick={() => selectedEmail && fetchEmail(selectedEmail.emailId, selectedEmail.accountId, selectedEmail.folder)}
>
Try again
</button>