native macOS codings agent orchestrator
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(sidebar): refocus terminal on single selection

onevcat 9030147d ccdf9e19

+11 -60
+11 -60
supacode/Features/Repositories/Views/SidebarListView.swift
··· 67 67 } else { 68 68 sidebarSelections = [.repository(repositoryID)] 69 69 store.send(.selectRepository(repositoryID)) 70 - focusShelfTerminalAfterSidebarInteraction(worktreeID: store.state.selectedTerminalWorktree?.id) 70 + focusTerminalAfterSidebarSelection(worktreeID: store.state.selectedTerminalWorktree?.id) 71 71 } 72 72 return 73 73 } ··· 78 78 store.send(.selectWorktree(nil)) 79 79 return 80 80 } 81 + let shouldFocusTerminal = worktreeIDs.count == 1 81 82 sidebarSelections = Set(worktreeIDs.map(SidebarSelection.worktree)) 82 83 if let selectedWorktreeID = state.selectedWorktreeID, 83 84 worktreeIDs.contains(selectedWorktreeID) 84 85 { 85 - focusShelfTerminalAfterSidebarInteraction(worktreeID: selectedWorktreeID) 86 + if shouldFocusTerminal { 87 + focusTerminalAfterSidebarSelection(worktreeID: selectedWorktreeID) 88 + } 86 89 return 87 90 } 88 91 let nextPrimarySelection = 89 92 hotkeyRows.map(\.id).first(where: worktreeIDs.contains) 90 93 ?? worktreeIDs.first 91 - store.send(.selectWorktree(nextPrimarySelection, focusTerminal: true)) 92 - focusShelfTerminalAfterSidebarInteraction(worktreeID: nextPrimarySelection) 94 + store.send(.selectWorktree(nextPrimarySelection, focusTerminal: shouldFocusTerminal)) 95 + if shouldFocusTerminal { 96 + focusTerminalAfterSidebarSelection(worktreeID: nextPrimarySelection) 97 + } 93 98 } 94 99 ) 95 100 let repositoriesByID = Dictionary(uniqueKeysWithValues: store.repositories.map { ($0.id, $0) }) ··· 215 220 store.send(.repositoryManagement(.openRepositories(fileURLs))) 216 221 return true 217 222 } 218 - .modifier( 219 - SidebarKeyForwardingModifier( 220 - isEnabled: !state.isShelfActive, 221 - selectedWorktreeID: state.selectedWorktreeID, 222 - sidebarSelectedWorktreeIDs: state.sidebarSelectedWorktreeIDs, 223 - terminalManager: terminalManager 224 - ) 225 - ) 226 223 .focused($isSidebarFocused) 227 - .onChange(of: isSidebarFocused) { _, isFocused in 228 - guard isFocused else { return } 229 - focusShelfTerminalAfterSidebarInteraction(worktreeID: store.state.selectedTerminalWorktree?.id) 230 - } 231 224 .task(id: pendingSidebarReveal?.id) { 232 225 await revealPendingSidebarWorktree(pendingSidebarReveal, with: scrollProxy) 233 226 } 234 227 } // ScrollViewReader 235 228 } 236 229 237 - private func focusShelfTerminalAfterSidebarInteraction(worktreeID: Worktree.ID?) { 238 - guard store.state.isShelfActive, let worktreeID else { return } 230 + private func focusTerminalAfterSidebarSelection(worktreeID: Worktree.ID?) { 231 + guard let worktreeID else { return } 239 232 Task { @MainActor [terminalManager] in 240 233 for _ in 0..<4 { 241 234 await Task.yield() ··· 261 254 scrollProxy.scrollTo(pendingSidebarReveal.worktreeID, anchor: .center) 262 255 } 263 256 store.send(.consumePendingSidebarReveal(pendingSidebarReveal.id)) 264 - } 265 - } 266 - 267 - private struct SidebarKeyForwardingModifier: ViewModifier { 268 - let isEnabled: Bool 269 - let selectedWorktreeID: Worktree.ID? 270 - let sidebarSelectedWorktreeIDs: Set<Worktree.ID> 271 - let terminalManager: WorktreeTerminalManager 272 - 273 - @ViewBuilder 274 - func body(content: Content) -> some View { 275 - if isEnabled { 276 - content 277 - .onKeyPress { keyPress in 278 - handleKeyPress(keyPress) 279 - } 280 - } else { 281 - content 282 - } 283 - } 284 - 285 - private func handleKeyPress(_ keyPress: KeyPress) -> KeyPress.Result { 286 - guard !keyPress.characters.isEmpty else { return .ignored } 287 - let isNavigationKey = 288 - keyPress.key == .upArrow 289 - || keyPress.key == .downArrow 290 - || keyPress.key == .leftArrow 291 - || keyPress.key == .rightArrow 292 - || keyPress.key == .home 293 - || keyPress.key == .end 294 - || keyPress.key == .pageUp 295 - || keyPress.key == .pageDown 296 - if isNavigationKey { return .ignored } 297 - let hasCommandModifier = keyPress.modifiers.contains(.command) 298 - if hasCommandModifier { return .ignored } 299 - guard let worktreeID = selectedWorktreeID, 300 - sidebarSelectedWorktreeIDs.count == 1, 301 - sidebarSelectedWorktreeIDs.contains(worktreeID), 302 - let terminalState = terminalManager.stateIfExists(for: worktreeID) 303 - else { return .ignored } 304 - terminalState.focusAndInsertText(keyPress.characters) 305 - return .handled 306 257 } 307 258 } 308 259