From 58f66c4fdcf5f950fb5c758befa8fe8da031c709 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Sun, 1 Nov 2026 05:42:00 +0100 Subject: [PATCH] fix: list the folders in the import dialog when it opens from Settings --- .../__tests__/mail-import-dialog.test.tsx | 11 +++++++++++ components/mail-transfer/mail-import-dialog.tsx | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/components/mail-transfer/__tests__/mail-import-dialog.test.tsx b/components/mail-transfer/__tests__/mail-import-dialog.test.tsx index c15a88713..f191fd56e 100644 --- a/components/mail-transfer/__tests__/mail-import-dialog.test.tsx +++ b/components/mail-transfer/__tests__/mail-import-dialog.test.tsx @@ -71,6 +71,17 @@ describe('MailImportDialog', () => { expect(startImport).toHaveBeenCalledWith(expect.objectContaining({ accountId: 'acc1', targetMailboxId: null, keepFolders: true })); }); + it('loads the folders when opened from Settings before the mail view did, then picks the Inbox', async () => { + const fetchMailboxes = vi.fn(async () => {}); + const loaded = useEmailStore.getState().mailboxes; + useEmailStore.setState({ mailboxes: [], fetchMailboxes } as never); + render(); + act(() => openMailImport()); + expect(fetchMailboxes).toHaveBeenCalled(); + act(() => useEmailStore.setState({ mailboxes: loaded } as never)); + await waitFor(() => expect((screen.getByTestId('mail-import-target') as HTMLSelectElement).value).toBe('inbox')); + }); + it('cannot start without files', () => { render(); act(() => openMailImport()); diff --git a/components/mail-transfer/mail-import-dialog.tsx b/components/mail-transfer/mail-import-dialog.tsx index 026fe1d00..37da46feb 100644 --- a/components/mail-transfer/mail-import-dialog.tsx +++ b/components/mail-transfer/mail-import-dialog.tsx @@ -72,6 +72,17 @@ export function MailImportDialog({ request }: { request: ImportRequest }) { const targetId = target === TOP ? null : targetMailbox ? targetMailbox.originalId || targetMailbox.id : null; const effectiveKeep = anyFolders && keepFolders; + // Opened from Settings, the mail view may not have loaded the folders yet. + useEffect(() => { + if (client && mailboxes.length === 0) void useEmailStore.getState().fetchMailboxes(client).catch(() => {}); + }, [client, mailboxes.length]); + + // Keep the choice valid when the folders arrive or the files change. + useEffect(() => { + const valid = target === TOP ? anyFolders : targets.some((x) => x.mailbox.id === target); + if (!valid && target !== initialTarget) setTarget(initialTarget); + }, [targets, target, anyFolders, initialTarget]); + // An earlier import of the same file into the same place that stopped part way. useEffect(() => { let current = true;