Merge pull request #2023 from manaflow-ai/task-fix-add-workspace-insert-index-crash

Avoid crash when creating a new workspace
This commit is contained in:
Lawrence Chen 2026-03-23 19:27:02 -07:00 committed by GitHub
commit 22c50a4416
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 34 additions and 5 deletions

View file

@ -2003,17 +2003,28 @@ class TabManager: ObservableObject {
placementOverride: NewWorkspacePlacement? = nil
) -> Int {
let placement = placementOverride ?? WorkspacePlacementSettings.current()
let pinnedCount = snapshot.tabs.filter { $0.isPinned }.count
let selectedIndex = snapshot.selectedTabId.flatMap { tabId in
snapshot.tabs.firstIndex(where: { $0.id == tabId })
let tabs = snapshot.tabs
var pinnedCount = 0
var selectedIndex: Int?
var selectedIsPinned = false
let selectedTabId = snapshot.selectedTabId
for (index, tab) in tabs.enumerated() {
if tab.isPinned {
pinnedCount += 1
}
if selectedIndex == nil, tab.id == selectedTabId {
selectedIndex = index
selectedIsPinned = tab.isPinned
}
}
let selectedIsPinned = selectedIndex.map { snapshot.tabs[$0].isPinned } ?? false
return WorkspacePlacementSettings.insertionIndex(
placement: placement,
selectedIndex: selectedIndex,
selectedIsPinned: selectedIsPinned,
pinnedCount: pinnedCount,
totalCount: snapshot.tabs.count
totalCount: tabs.count
)
}

View file

@ -334,6 +334,24 @@ final class WorkspaceCreationPlacementTests: XCTestCase {
XCTAssertEqual(insertedIndex, baselineCount)
}
func testAddWorkspaceAfterCurrentOverrideAppendsAfterLastSelectedWorkspace() {
let manager = TabManager()
guard !manager.tabs.isEmpty else {
XCTFail("Expected TabManager to initialise with at least one workspace")
return
}
_ = manager.addWorkspace()
_ = manager.addWorkspace()
let fourth = manager.addWorkspace()
let baselineOrder = manager.tabs.map(\.id)
manager.selectWorkspace(fourth)
let inserted = manager.addWorkspace(placementOverride: .afterCurrent)
XCTAssertEqual(manager.tabs.map(\.id).filter { $0 != inserted.id }, baselineOrder)
XCTAssertEqual(manager.tabs.last?.id, inserted.id)
}
private func makeManagerWithThreeWorkspaces() -> TabManager {
let manager = TabManager()
_ = manager.addWorkspace()