Autofocus emoji search and send the first result with the return key on macOS. (#3644)

* Autofocus emoji search and send the first result with the return key on macOS.

* Add an extra condition to make sure the user has entered a search string before sending.
This commit is contained in:
Doug
2024-12-20 11:25:05 +00:00
committed by GitHub
parent 888a61ace1
commit 365797c8b7
2 changed files with 45 additions and 4 deletions
+34 -4
View File
@@ -5,6 +5,7 @@
// Please see LICENSE in the repository root for full details.
//
import GameController
import SwiftUI
import SwiftUIIntrospect
@@ -165,7 +166,18 @@ private struct SearchController: UIViewControllerRepresentable {
// MARK: - Searchable Extensions
struct IsSearchingModifier: ViewModifier {
extension View {
func isSearching(_ isSearching: Binding<Bool>) -> some View {
modifier(IsSearchingModifier(isSearching: isSearching))
}
/// Automatically focusses the view's search field if a hardware keyboard is connected.
func focusSearchIfHardwareKeyboardAvailable() -> some View {
modifier(FocusSearchIfHardwareKeyboardAvailableModifier())
}
}
private struct IsSearchingModifier: ViewModifier {
@Environment(\.isSearching) private var isSearchingEnv
@Binding var isSearching: Bool
@@ -175,8 +187,26 @@ struct IsSearchingModifier: ViewModifier {
}
}
extension View {
func isSearching(_ isSearching: Binding<Bool>) -> some View {
modifier(IsSearchingModifier(isSearching: isSearching))
private struct FocusSearchIfHardwareKeyboardAvailableModifier: ViewModifier {
@FocusState private var isFocused
func body(content: Content) -> some View {
if #available(iOS 18.0, *) {
content
.searchFocused($isFocused)
.onAppear(perform: focusIfHardwareKeyboardAvailable)
} else {
content
}
}
func focusIfHardwareKeyboardAvailable() {
// The simulator always detects the hardware keyboard as connected
#if !targetEnvironment(simulator)
if GCKeyboard.coalesced != nil {
MXLog.info("Hardware keyboard is connected")
isFocused = true
}
#endif
}
}