From 660058f0c00b8d020e2823eaeb2813c52de2a39b Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 21 Oct 2026 22:43:18 -0700 Subject: [PATCH] Dismiss the iPhone keyboard on pages with no text field --- mac/Sources/Byre/Phone.swift | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/mac/Sources/Byre/Phone.swift b/mac/Sources/Byre/Phone.swift index 4e36c45..ac6c188 100644 --- a/mac/Sources/Byre/Phone.swift +++ b/mac/Sources/Byre/Phone.swift @@ -28,6 +28,18 @@ private enum PhoneRoute: Hashable { case task } +private struct PhonePage: Equatable { + var tab: PhoneTab + var depth: Int + var task: String? + var taskTab: TaskTab? +} + +@MainActor +private func taskTab(_ store: Store) -> TaskTab { + store.sheet.flatMap { $0.owner == .lead ? nil : $0.tab } ?? store.primaryTab +} + private enum MoreRoute: Hashable { case notes, workflows, status, settings } @@ -122,6 +134,9 @@ struct PhoneView: View { .onChange(of: tab == .tasks && !path.isEmpty, initial: true) { _, shown in store.paneFocus.setShown(shown) } + .onChange(of: page) { + dismissKeyboard() + } .fullScreenCover(isPresented: Binding(get: { zoomed != nil }, set: { shown in if !shown { store.sheet = nil @@ -160,6 +175,13 @@ struct PhoneView: View { } } + private var page: PhonePage { + if tab != .tasks || path.isEmpty { + return PhonePage(tab: tab, depth: path.count) + } + return PhonePage(tab: tab, depth: path.count, task: store.selectedTaskId, taskTab: taskTab(store)) + } + private var zoomed: SheetView? { switch store.sheet?.view { case .image, .diagram: store.sheet?.view @@ -291,7 +313,7 @@ private struct PhoneTask: View { var body: some View { let selected = store.selectedTaskId.flatMap { store.findTask($0) } let accent = selected.map { taskPalette[$0.color] } ?? Palette.accent - let tab = store.sheet.flatMap { $0.owner == .lead ? nil : $0.tab } ?? store.primaryTab + let tab = taskTab(store) VStack(spacing: 0) { TaskBar() .overlay(alignment: .leading) { @@ -322,6 +344,11 @@ private struct PhoneTask: View { } } +@MainActor +private func dismissKeyboard() { + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) +} + private struct MoreScreen: View { @ViewState private var route = MoreRoute.notes @@ -331,6 +358,7 @@ private struct MoreScreen: View { ForEach([MoreRoute.notes, .workflows, .status, .settings], id: \.self) { r in PaneTabButton(label: moreTitles[r]!, active: route == r) { route = r + dismissKeyboard() } } Spacer(minLength: 0)