diff --git a/ElementX/Sources/Screens/ComposerToolbar/ComposerToolbarViewModel.swift b/ElementX/Sources/Screens/ComposerToolbar/ComposerToolbarViewModel.swift index ac48b30432..192e681200 100644 --- a/ElementX/Sources/Screens/ComposerToolbar/ComposerToolbarViewModel.swift +++ b/ElementX/Sources/Screens/ComposerToolbar/ComposerToolbarViewModel.swift @@ -16,6 +16,7 @@ import Combine import Foundation +import GameKit import SwiftUI import WysiwygComposer @@ -100,8 +101,10 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool .store(in: &cancellables) setupMentionsHandling(mentionDisplayHelper: mentionDisplayHelper) + + focusComposerIfHardwareKeyboardConnected() } - + // MARK: - Public override func process(viewAction: ComposerToolbarViewAction) { @@ -361,6 +364,22 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool private func removeLinks() { wysiwygViewModel.applyLinkOperation(.removeLinks) } + + private func focusComposerIfHardwareKeyboardConnected() { + // The simulator always detects the hardware keyboard as connected + #if !targetEnvironment(simulator) + if GCKeyboard.coalesced != nil { + state.bindings.composerFocused = true + } + + NotificationCenter.default.addObserver(self, selector: #selector(hardwareKeyboardDidConnect), name: .GCKeyboardDidConnect, object: nil) + #endif + } + + @objc private func hardwareKeyboardDidConnect(_ notification: Notification) { + MXLog.error("Hardware keyboard did connect") + state.bindings.composerFocused = true + } } private extension LinkAction { diff --git a/ElementX/Sources/Screens/ComposerToolbar/View/ComposerToolbar.swift b/ElementX/Sources/Screens/ComposerToolbar/View/ComposerToolbar.swift index 24eba0bb79..569340dcf2 100644 --- a/ElementX/Sources/Screens/ComposerToolbar/View/ComposerToolbar.swift +++ b/ElementX/Sources/Screens/ComposerToolbar/View/ComposerToolbar.swift @@ -190,6 +190,9 @@ struct ComposerToolbar: View { .onChange(of: composerFocused) { newValue in context.composerFocused = newValue } + .onAppear { + composerFocused = context.composerFocused + } } private var placeholder: String { diff --git a/ElementX/Sources/Screens/ComposerToolbar/View/MessageComposer.swift b/ElementX/Sources/Screens/ComposerToolbar/View/MessageComposer.swift index 829d7338bb..2a4e97a070 100644 --- a/ElementX/Sources/Screens/ComposerToolbar/View/MessageComposer.swift +++ b/ElementX/Sources/Screens/ComposerToolbar/View/MessageComposer.swift @@ -31,7 +31,6 @@ struct MessageComposer: View { let replyCancellationAction: () -> Void let editCancellationAction: () -> Void let onAppearAction: () -> Void - @FocusState private var focused: Bool @State private var composerTranslation: CGFloat = 0 private let composerShape = RoundedRectangle(cornerRadius: 21, style: .circular) @@ -77,7 +76,6 @@ struct MessageComposer: View { alignment: .top) .tint(.compound.iconAccentTertiary) .padding(.vertical, 10) - .focused($focused) .onAppear { onAppearAction() } diff --git a/changelog.d/1911.feature b/changelog.d/1911.feature new file mode 100644 index 0000000000..c4ad89cb0d --- /dev/null +++ b/changelog.d/1911.feature @@ -0,0 +1 @@ +Automatically focus the composer when a hardware keyboards is connected \ No newline at end of file