diff --git a/features/conversation-assistant/macos/Sources/Views/MenuBarView.swift b/features/conversation-assistant/macos/Sources/Views/MenuBarView.swift index 057fa4340..d0c3c9496 100644 --- a/features/conversation-assistant/macos/Sources/Views/MenuBarView.swift +++ b/features/conversation-assistant/macos/Sources/Views/MenuBarView.swift @@ -126,19 +126,34 @@ struct MenuBarView: View { Spacer() - // Sync Button - Button(action: viewModel.triggerSync) { - HStack { - if viewModel.isSyncing { - ProgressView() - .scaleEffect(0.7) + // Sync Buttons + HStack(spacing: 8) { + Button(action: viewModel.triggerSync) { + HStack { + if viewModel.isSyncing && !viewModel.isResetting { + ProgressView() + .scaleEffect(0.7) + } + Text(viewModel.isSyncing && !viewModel.isResetting ? "Syncing..." : "Sync Now") } - Text(viewModel.isSyncing ? "Syncing..." : "Sync Now") + .frame(maxWidth: .infinity) } - .frame(maxWidth: .infinity) + .buttonStyle(.borderedProminent) + .disabled(viewModel.isSyncing || viewModel.isResetting || viewModel.needsFullDiskAccess) + + Button(action: viewModel.forceSync) { + HStack { + if viewModel.isResetting { + ProgressView() + .scaleEffect(0.7) + } + Text(viewModel.isResetting ? "Resetting..." : "Force Sync") + } + .frame(maxWidth: .infinity) + } + .buttonStyle(.bordered) + .disabled(viewModel.isSyncing || viewModel.isResetting || viewModel.needsFullDiskAccess) } - .buttonStyle(.borderedProminent) - .disabled(viewModel.isSyncing || viewModel.needsFullDiskAccess) .padding() } .padding(.vertical) diff --git a/features/conversation-assistant/macos/Sources/Views/MenuBarViewModel.swift b/features/conversation-assistant/macos/Sources/Views/MenuBarViewModel.swift index e48cb37b3..cca5aa88f 100644 --- a/features/conversation-assistant/macos/Sources/Views/MenuBarViewModel.swift +++ b/features/conversation-assistant/macos/Sources/Views/MenuBarViewModel.swift @@ -9,6 +9,7 @@ class MenuBarViewModel: ObservableObject { @Published var conversationCount = 0 @Published var lastSyncText = "Never" @Published var isSyncing = false + @Published var isResetting = false @Published var needsFullDiskAccess = false @Published var syncErrorMessage: String? @@ -68,6 +69,13 @@ class MenuBarViewModel: ObservableObject { } .store(in: &cancellables) + syncManager.$isResetting + .receive(on: DispatchQueue.main) + .sink { [weak self] resetting in + self?.isResetting = resetting + } + .store(in: &cancellables) + // Register device on startup if not authenticated if !isAuthenticated { registerDevice() @@ -124,6 +132,10 @@ class MenuBarViewModel: ObservableObject { syncManager.syncNow() } + func forceSync() { + syncManager.resetAndResync() + } + func openFullDiskAccessSettings() { syncManager.openFullDiskAccessSettings() }