diff --git a/Apps/MagnumOpus/ContentView.swift b/Apps/MagnumOpus/ContentView.swift index c2ef413..a18136c 100644 --- a/Apps/MagnumOpus/ContentView.swift +++ b/Apps/MagnumOpus/ContentView.swift @@ -165,11 +165,10 @@ struct ContentView: View { try viewModel.setup(config: config, credentials: credentials) try KeychainService.saveCredentials(credentials, for: config.id) Self.saveAccountConfig(config) + // syncNow + startPeriodicSync happen via .task on mailView — don't duplicate Task { - await viewModel.syncNow() await viewModel.loadMailboxes(accountId: config.id) viewModel.startObservingThreads(accountId: config.id) - viewModel.startPeriodicSync() } } catch { accountSetup.errorMessage = error.localizedDescription @@ -182,11 +181,10 @@ struct ContentView: View { else { return } do { try viewModel.setup(config: config, credentials: credentials) + // syncNow + startPeriodicSync happen via .task on mailView — don't duplicate Task { await viewModel.loadMailboxes(accountId: config.id) viewModel.startObservingThreads(accountId: config.id) - await viewModel.syncNow() - viewModel.startPeriodicSync() } } catch { // Account config exists but setup failed — show account setup diff --git a/Apps/MagnumOpus/ViewModels/MailViewModel.swift b/Apps/MagnumOpus/ViewModels/MailViewModel.swift index a00f9ee..45f00cc 100644 --- a/Apps/MagnumOpus/ViewModels/MailViewModel.swift +++ b/Apps/MagnumOpus/ViewModels/MailViewModel.swift @@ -201,11 +201,19 @@ final class MailViewModel { } } + private var isSyncing = false + func syncNow() async { - guard let coordinator else { return } + guard let coordinator, !isSyncing else { return } + isSyncing = true + defer { isSyncing = false } do { try await coordinator.syncNow() syncState = coordinator.syncState + // Reload mailboxes after sync (they may have been created on first sync) + if let accountConfig { + await loadMailboxes(accountId: accountConfig.id) + } } catch { let desc = "\(error)" print("[MailViewModel] syncNow failed: \(desc)")