diff --git a/VoiceInk/HotkeyManager.swift b/VoiceInk/HotkeyManager.swift index 9cc37a6..0168613 100644 --- a/VoiceInk/HotkeyManager.swift +++ b/VoiceInk/HotkeyManager.swift @@ -245,12 +245,18 @@ class HotkeyManager: ObservableObject { if isHandsFreeMode { isHandsFreeMode = false - Task { @MainActor in await whisperState.handleToggleMiniRecorder() } + Task { @MainActor in + guard !whisperState.isTranscribing && !whisperState.isProcessing else { return } + await whisperState.handleToggleMiniRecorder() + } return } if !whisperState.isMiniRecorderVisible { - Task { @MainActor in await whisperState.handleToggleMiniRecorder() } + Task { @MainActor in + guard !whisperState.isTranscribing && !whisperState.isProcessing else { return } + await whisperState.handleToggleMiniRecorder() + } } } else { let now = Date() @@ -261,7 +267,10 @@ class HotkeyManager: ObservableObject { if pressDuration < briefPressThreshold { isHandsFreeMode = true } else { - Task { @MainActor in await whisperState.handleToggleMiniRecorder() } + Task { @MainActor in + guard !whisperState.isTranscribing && !whisperState.isProcessing else { return } + await whisperState.handleToggleMiniRecorder() + } } } @@ -282,11 +291,13 @@ class HotkeyManager: ObservableObject { if isShortcutHandsFreeMode { isShortcutHandsFreeMode = false + guard !whisperState.isTranscribing && !whisperState.isProcessing else { return } await whisperState.handleToggleMiniRecorder() return } if !whisperState.isMiniRecorderVisible { + guard !whisperState.isTranscribing && !whisperState.isProcessing else { return } await whisperState.handleToggleMiniRecorder() } } @@ -303,6 +314,7 @@ class HotkeyManager: ObservableObject { if pressDuration < briefPressThreshold { isShortcutHandsFreeMode = true } else { + guard !whisperState.isTranscribing && !whisperState.isProcessing else { return } await whisperState.handleToggleMiniRecorder() } } diff --git a/VoiceInk/Views/Settings/SettingsView.swift b/VoiceInk/Views/Settings/SettingsView.swift index 8ea8e66..ca7bcee 100644 --- a/VoiceInk/Views/Settings/SettingsView.swift +++ b/VoiceInk/Views/Settings/SettingsView.swift @@ -263,7 +263,10 @@ struct SettingsView: View { .alert("Reset Onboarding", isPresented: $showResetOnboardingAlert) { Button("Cancel", role: .cancel) { } Button("Reset", role: .destructive) { - hasCompletedOnboarding = false + // Defer state change to avoid layout issues while alert dismisses + DispatchQueue.main.async { + hasCompletedOnboarding = false + } } } message: { Text("Are you sure you want to reset the onboarding? You'll see the introduction screens again the next time you launch the app.")