Skip to content

Commit 17afb28

Browse files
committed
Keep Pair phone pending until Gateway is pairable
Do not clear the durable pairing flag when the Gateway pane appears before status refresh. Retry after refresh and when status becomes pairable.
1 parent f378dc7 commit 17afb28

3 files changed

Lines changed: 27 additions & 10 deletions

File tree

Sources/VocaMac/App/VocaMacApp.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,10 @@ final class SettingsWindowManager: ObservableObject {
9191
return page
9292
}
9393

94-
/// Returns whether a pair-phone sheet was requested, then clears the flag.
95-
func consumePendingPairingPresentation() -> Bool {
96-
guard pendingPairingPresentation else { return false }
94+
/// Consumes the pair-phone request only when the Gateway pane can show the sheet.
95+
/// Leaves the flag set otherwise so a later pairable/ready status can retry.
96+
func consumePendingPairingPresentation(canPresent: Bool) -> Bool {
97+
guard pendingPairingPresentation, canPresent else { return false }
9798
pendingPairingPresentation = false
9899
return true
99100
}

Sources/VocaMac/Views/GatewaySettingsTab.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ struct GatewaySettingsTab: View {
201201
.formStyle(.grouped)
202202
.task {
203203
await gateway.refreshStatus()
204+
presentPendingPairingIfNeeded()
204205
}
205206
.onAppear {
206207
presentPendingPairingIfNeeded()
@@ -209,6 +210,10 @@ struct GatewaySettingsTab: View {
209210
guard pending else { return }
210211
presentPendingPairingIfNeeded()
211212
}
213+
.onChange(of: gateway.status) { _, status in
214+
guard status.allowsPairing else { return }
215+
presentPendingPairingIfNeeded()
216+
}
212217
.sheet(isPresented: $showingPairSheet) {
213218
GatewayPairPhoneSheet(
214219
payloadRaw: gateway.pairingPayload?.qrPayloadString
@@ -223,10 +228,10 @@ struct GatewaySettingsTab: View {
223228
}
224229

225230
private func presentPendingPairingIfNeeded() {
226-
guard settingsWindowManager.consumePendingPairingPresentation() else { return }
227-
if gateway.status.allowsPairing {
228-
showingPairSheet = true
229-
}
231+
guard settingsWindowManager.consumePendingPairingPresentation(
232+
canPresent: gateway.status.allowsPairing
233+
) else { return }
234+
showingPairSheet = true
230235
}
231236

232237
private var isStopDisabled: Bool {

Tests/VocaMacTests/SettingsWindowManagerTests.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,20 @@ final class SettingsWindowManagerTests: XCTestCase {
2525
manager.recordOpenRequest(page: .gateway, showPairing: true)
2626

2727
XCTAssertTrue(manager.pendingPairingPresentation)
28-
XCTAssertTrue(manager.consumePendingPairingPresentation())
28+
XCTAssertTrue(manager.consumePendingPairingPresentation(canPresent: true))
29+
XCTAssertFalse(manager.pendingPairingPresentation)
30+
XCTAssertFalse(manager.consumePendingPairingPresentation(canPresent: true))
31+
}
32+
33+
func testPairingPresentationIsNotConsumedUntilPresentable() {
34+
let manager = SettingsWindowManager()
35+
manager.recordOpenRequest(page: .gateway, showPairing: true)
36+
37+
XCTAssertTrue(manager.pendingPairingPresentation)
38+
XCTAssertFalse(manager.consumePendingPairingPresentation(canPresent: false))
39+
XCTAssertTrue(manager.pendingPairingPresentation)
40+
XCTAssertTrue(manager.consumePendingPairingPresentation(canPresent: true))
2941
XCTAssertFalse(manager.pendingPairingPresentation)
30-
XCTAssertFalse(manager.consumePendingPairingPresentation())
3142
}
3243

3344
func testPairingRequestDefaultsToGatewayPage() {
@@ -37,7 +48,7 @@ final class SettingsWindowManagerTests: XCTestCase {
3748
XCTAssertEqual(manager.requestedPage, .gateway)
3849
XCTAssertTrue(manager.pendingPairingPresentation)
3950
XCTAssertEqual(manager.consumeRequestedPage(), .gateway)
40-
XCTAssertTrue(manager.consumePendingPairingPresentation())
51+
XCTAssertTrue(manager.consumePendingPairingPresentation(canPresent: true))
4152
}
4253

4354
func testPageRequestDoesNotImplyPairing() {

0 commit comments

Comments
 (0)