From 5bade2283c93d363c30a03754224d951db653577 Mon Sep 17 00:00:00 2001 From: alma Date: Tue, 29 Apr 2025 09:39:13 +0200 Subject: [PATCH] courrier multi account restore compose --- app/courrier/page.tsx | 69 +------------ components/email/EmailSidebar.tsx | 157 ++++++++++++++++++++---------- 2 files changed, 107 insertions(+), 119 deletions(-) diff --git a/app/courrier/page.tsx b/app/courrier/page.tsx index 37cb806f..5a5856dd 100644 --- a/app/courrier/page.tsx +++ b/app/courrier/page.tsx @@ -180,15 +180,9 @@ export default function CourrierPage() { ]); const [selectedAccount, setSelectedAccount] = useState(null); - // Track expanded folders for each account - const [expandedAccounts, setExpandedAccounts] = useState>({}); - // Track selected folder per account const [selectedFolders, setSelectedFolders] = useState>({}); - // Track folder visibility per account - const [visibleFolders, setVisibleFolders] = useState>({}); - // Add state for modals/dialogs const [showEditModal, setShowEditModal] = useState(false); const [showDeleteDialog, setShowDeleteDialog] = useState(false); @@ -198,34 +192,6 @@ export default function CourrierPage() { const [editLoading, setEditLoading] = useState(false); const [deleteLoading, setDeleteLoading] = useState(false); - // Debug accounts state - useEffect(() => { - console.log('Current accounts state:', accounts); - console.log('Expanded accounts:', expandedAccounts); - console.log('Selected account:', selectedAccount); - console.log('Show folders:', showFolders); - }, [accounts, expandedAccounts, selectedAccount, showFolders]); - - // Debug selectedAccount state - useEffect(() => { - console.log('Selected account changed:', selectedAccount); - if (selectedAccount) { - console.log('Selected account folders:', selectedAccount.folders); - } - }, [selectedAccount]); - - // Add useEffect for debugging - useEffect(() => { - if (typeof window !== 'undefined') { - console.log('[DEBUG] Rendering UI with:', { - accountsCount: accounts.length, - selectedAccountId: selectedAccount?.id, - showFolders, - currentFolder - }); - } - }, [accounts, selectedAccount, showFolders, currentFolder]); - // Calculate unread count for each account and folder useEffect(() => { // Create a map to store unread counts per account and folder @@ -440,12 +406,6 @@ export default function CourrierPage() { setSelectedAccount(updatedAccounts[1]); setShowFolders(true); - // Ensure folders are visible for the selected account - setExpandedAccounts(prev => ({ - ...prev, - [updatedAccounts[1].id]: true - })); - // Set initial selected folder setSelectedFolders(prev => ({ ...prev, @@ -714,14 +674,9 @@ export default function CourrierPage() { const handleAccountSelect = (account: Account) => { setSelectedAccount(account); - setShowFolders(true); if (account.id !== 'loading-account') { - setExpandedAccounts(prev => ({ - ...prev, - [account.id]: true - })); + handleMailboxChange('INBOX', account.id); } - handleMailboxChange('INBOX', account.id); }; const handleAddAccount = async (accountData: AccountData) => { @@ -733,24 +688,6 @@ export default function CourrierPage() { // })); }; - // Debug folder rendering - useEffect(() => { - if (selectedAccount) { - console.log('Selected account folders:', selectedAccount.folders); - console.log('Is account expanded:', expandedAccounts[selectedAccount.id]); - } - }, [selectedAccount, expandedAccounts]); - - // On page load/refresh, expand all accounts so their folders are always visible - useEffect(() => { - // Expand all real accounts (not loading-account) on load/refresh - const expanded: Record = {}; - accounts.forEach(a => { - if (a.id !== 'loading-account') expanded[a.id] = true; - }); - setExpandedAccounts(expanded); - }, [accounts]); - return ( <> @@ -765,7 +702,6 @@ export default function CourrierPage() { selectedAccount={selectedAccount} selectedFolders={selectedFolders} currentFolder={currentFolder} - expandedAccounts={expandedAccounts} loading={loading} unreadCount={unreadCount} showAddAccountForm={showAddAccountForm} @@ -777,9 +713,6 @@ export default function CourrierPage() { }} onComposeNew={handleComposeNew} onAccountSelect={handleAccountSelect} - onToggleExpand={(accountId, expanded) => { - setExpandedAccounts(prev => ({ ...prev, [accountId]: expanded })); - }} onShowAddAccountForm={setShowAddAccountForm} onAddAccount={async (formData) => { setLoading(true); diff --git a/components/email/EmailSidebar.tsx b/components/email/EmailSidebar.tsx index 1710b12b..3a78b5aa 100644 --- a/components/email/EmailSidebar.tsx +++ b/components/email/EmailSidebar.tsx @@ -16,35 +16,28 @@ import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'; import { Input } from '@/components/ui/input'; import { Checkbox } from '@/components/ui/checkbox'; import { Label } from '@/components/ui/label'; - -interface Account { - id: string; - name: string; - email: string; - color: string; - folders: string[]; -} +import { IconArrowDown, IconCheck, IconChevronDown, IconChevronUp, IconEdit, IconMail, IconMailbox, IconPencil, IconPlus, IconRefresh, IconTrash } from '@tabler/icons-react'; +import { Account } from '../../types'; interface EmailSidebarProps { accounts: Account[]; selectedAccount: Account | null; selectedFolders: Record; currentFolder: string; - expandedAccounts: Record; loading: boolean; - unreadCount: number; + unreadCount: Record>; showAddAccountForm: boolean; - // Actions + showFolders?: boolean; onFolderChange: (folder: string, accountId: string) => void; onRefresh: () => void; onComposeNew: () => void; onAccountSelect: (account: Account) => void; - onToggleExpand: (accountId: string, expanded: boolean) => void; onShowAddAccountForm: (show: boolean) => void; - onAddAccount: (formData: FormData) => Promise; + onAddAccount: (formData: any) => Promise; onEditAccount: (account: Account) => void; onDeleteAccount: (account: Account) => void; onSelectEmail?: (emailId: string, accountId: string, folder: string) => void; + onShowFoldersToggle?: (show: boolean) => void; } export default function EmailSidebar({ @@ -52,20 +45,68 @@ export default function EmailSidebar({ selectedAccount, selectedFolders, currentFolder, - expandedAccounts, loading, unreadCount, showAddAccountForm, + showFolders = true, onFolderChange, onRefresh, onComposeNew, onAccountSelect, - onToggleExpand, onShowAddAccountForm, onAddAccount, onEditAccount, - onDeleteAccount + onDeleteAccount, + onSelectEmail, + onShowFoldersToggle }: EmailSidebarProps) { + const [isSaving, setIsSaving] = useState(false); + const [formData, setFormData] = useState({ + email: '', + password: '', + displayName: '', + host: '', + port: '993', + useSSL: true, + smtpHost: '', + smtpPort: '587', + smtpUseSSL: false + }); + const [activeTab, setActiveTab] = useState('imap'); + + // Handle form submission + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setIsSaving(true); + try { + await onAddAccount(formData); + setFormData({ + email: '', + password: '', + displayName: '', + host: '', + port: '993', + useSSL: true, + smtpHost: '', + smtpPort: '587', + smtpUseSSL: false + }); + onShowAddAccountForm(false); + } catch (err) { + console.error('Failed to add account:', err); + } finally { + setIsSaving(false); + } + }; + + // Handle input changes + const handleChange = (e: React.ChangeEvent) => { + const { name, value, type, checked } = e.target; + setFormData(prev => ({ + ...prev, + [name]: type === 'checkbox' ? checked : value + })); + }; // Get the appropriate icon for a folder const getFolderIcon = (folder: string) => { @@ -116,9 +157,9 @@ export default function EmailSidebar({
{getFolderIcon(baseFolder)} {formatFolderName(baseFolder)} - {baseFolder === 'INBOX' && unreadCount > 0 && ( + {baseFolder === 'INBOX' && unreadCount[accountId]?.[folder] > 0 && ( - {unreadCount} + {unreadCount[accountId][folder]} )}
@@ -163,14 +204,28 @@ export default function EmailSidebar({
Accounts - +
+ + +
{/* Display all accounts */} @@ -179,10 +234,7 @@ export default function EmailSidebar({ {showAddAccountForm && (

Add IMAP Account

-
{ - e.preventDefault(); - await onAddAccount(new FormData(e.currentTarget)); - }}> +
@@ -198,6 +250,8 @@ export default function EmailSidebar({ placeholder="email@example.com" className="h-7 text-xs bg-white border-gray-300 mb-0.5 text-gray-900" required + value={formData.email} + onChange={handleChange} />
@@ -208,14 +262,18 @@ export default function EmailSidebar({ placeholder="•••••••••" className="h-7 text-xs bg-white border-gray-300 mb-0.5 text-gray-900" required + value={formData.password} + onChange={handleChange} />
@@ -225,6 +283,8 @@ export default function EmailSidebar({ placeholder="imap.example.com" className="h-7 text-xs bg-white border-gray-300 mb-0.5 text-gray-900" required + value={formData.host} + onChange={handleChange} />
@@ -236,12 +296,14 @@ export default function EmailSidebar({ className="h-7 text-xs bg-white border-gray-300 text-gray-900" defaultValue="993" required + value={formData.port} + onChange={handleChange} />
- - + +
@@ -251,24 +313,28 @@ export default function EmailSidebar({
- +
@@ -283,9 +349,9 @@ export default function EmailSidebar({ - )}
- {/* Show folders for any expanded account */} - {expandedAccounts[account.id] && account.folders && account.folders.length > 0 && ( + {/* Show folders for each account when selected and when folders are visible */} + {selectedAccount?.id === account.id && showFolders && account.folders && account.folders.length > 0 && (
{account.folders.map((folder) => renderFolderButton(folder, account.id))}