ui(macos): skip local onboarding steps in remote mode

main
Peter Steinberger 2025-12-14 03:49:17 +00:00
parent f427bec31c
commit 3a08e6df9d
1 changed files with 36 additions and 4 deletions

View File

@ -63,7 +63,19 @@ struct OnboardingView: View {
private let contentHeight: CGFloat = 520 private let contentHeight: CGFloat = 520
private let connectionPageIndex = 1 private let connectionPageIndex = 1
private let permissionsPageIndex = 3 private let permissionsPageIndex = 3
private var pageCount: Int { 8 } private var pageOrder: [Int] {
if self.state.connectionMode == .remote {
// Remote setup doesn't need local gateway/CLI/workspace setup pages.
return [0, 1, 3, 6, 7]
}
return [0, 1, 2, 3, 4, 5, 6, 7]
}
private var pageCount: Int { self.pageOrder.count }
private var activePageIndex: Int {
self.activePageIndex(for: self.currentPage)
}
private var buttonTitle: String { self.currentPage == self.pageCount - 1 ? "Finish" : "Next" } private var buttonTitle: String { self.currentPage == self.pageCount - 1 ? "Finish" : "Next" }
private let devLinkCommand = "ln -sf $(pwd)/apps/macos/.build/debug/ClawdisCLI /usr/local/bin/clawdis-mac" private let devLinkCommand = "ln -sf $(pwd)/apps/macos/.build/debug/ClawdisCLI /usr/local/bin/clawdis-mac"
@ -95,7 +107,7 @@ struct OnboardingView: View {
self.whatsappPage().frame(width: self.pageWidth) self.whatsappPage().frame(width: self.pageWidth)
self.readyPage().frame(width: self.pageWidth) self.readyPage().frame(width: self.pageWidth)
} }
.offset(x: CGFloat(-self.currentPage) * self.pageWidth) .offset(x: CGFloat(-self.activePageIndex) * self.pageWidth)
.animation( .animation(
.interactiveSpring(response: 0.5, dampingFraction: 0.86, blendDuration: 0.25), .interactiveSpring(response: 0.5, dampingFraction: 0.86, blendDuration: 0.25),
value: self.currentPage) value: self.currentPage)
@ -113,10 +125,12 @@ struct OnboardingView: View {
self.updateMonitoring(for: 0) self.updateMonitoring(for: 0)
} }
.onChange(of: self.currentPage) { _, newValue in .onChange(of: self.currentPage) { _, newValue in
self.updateMonitoring(for: newValue) self.updateMonitoring(for: self.activePageIndex(for: newValue))
} }
.onChange(of: self.state.connectionMode) { _, _ in .onChange(of: self.state.connectionMode) { _, _ in
self.updateDiscoveryMonitoring(for: self.currentPage) let oldActive = self.activePageIndex
self.reconcilePageForModeChange(previousActivePageIndex: oldActive)
self.updateDiscoveryMonitoring(for: self.activePageIndex)
} }
.onDisappear { .onDisappear {
self.stopPermissionMonitoring() self.stopPermissionMonitoring()
@ -130,6 +144,24 @@ struct OnboardingView: View {
} }
} }
private func activePageIndex(for pageCursor: Int) -> Int {
guard !self.pageOrder.isEmpty else { return 0 }
let clamped = min(max(0, pageCursor), self.pageOrder.count - 1)
return self.pageOrder[clamped]
}
private func reconcilePageForModeChange(previousActivePageIndex: Int) {
if let exact = self.pageOrder.firstIndex(of: previousActivePageIndex) {
withAnimation { self.currentPage = exact }
return
}
if let next = self.pageOrder.firstIndex(where: { $0 > previousActivePageIndex }) {
withAnimation { self.currentPage = next }
return
}
withAnimation { self.currentPage = max(0, self.pageOrder.count - 1) }
}
private func welcomePage() -> some View { private func welcomePage() -> some View {
self.onboardingPage { self.onboardingPage {
VStack(spacing: 22) { VStack(spacing: 22) {