vibetunnel/ios/VibeTunnel/App/ContentView.swift
2025-06-23 14:58:11 +02:00

92 lines
3.1 KiB
Swift

import SwiftUI
import UniformTypeIdentifiers
/// Root content view that manages the main app navigation.
///
/// Displays either the connection view or session list based on
/// connection state, and handles opening cast files.
struct ContentView: View {
@Environment(ConnectionManager.self)
var connectionManager
@State private var showingFilePicker = false
@State private var showingCastPlayer = false
@State private var selectedCastFile: URL?
@State private var isValidatingConnection = true
@State private var showingWelcome = false
@AppStorage("welcomeCompleted")
private var welcomeCompleted = false
var body: some View {
Group {
if isValidatingConnection && connectionManager.isConnected {
// Show loading while validating restored connection
VStack(spacing: Theme.Spacing.large) {
ProgressView()
.progressViewStyle(CircularProgressViewStyle(tint: Theme.Colors.primaryAccent))
.scaleEffect(1.5)
Text("Restoring connection...")
.font(Theme.Typography.terminalSystem(size: 14))
.foregroundColor(Theme.Colors.terminalForeground)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Theme.Colors.terminalBackground)
} else if connectionManager.isConnected, connectionManager.serverConfig != nil {
SessionListView()
} else {
EnhancedConnectionView()
}
}
.animation(.default, value: connectionManager.isConnected)
.onAppear {
validateRestoredConnection()
// Show welcome on first launch
if !welcomeCompleted {
showingWelcome = true
}
}
.fullScreenCover(isPresented: $showingWelcome) {
WelcomeView()
}
.onOpenURL { url in
// Handle cast file opening
if url.pathExtension == "cast" {
selectedCastFile = url
showingCastPlayer = true
}
}
.sheet(isPresented: $showingCastPlayer) {
if let castFile = selectedCastFile {
CastPlayerView(castFileURL: castFile)
}
}
}
private func validateRestoredConnection() {
guard connectionManager.isConnected,
connectionManager.serverConfig != nil
else {
isValidatingConnection = false
return
}
// Test the restored connection
Task {
do {
// Try to fetch sessions to validate connection
_ = try await APIClient.shared.getSessions()
// Connection is valid
await MainActor.run {
isValidatingConnection = false
}
} catch {
// Connection failed, reset state
await MainActor.run {
connectionManager.disconnect()
isValidatingConnection = false
}
}
}
}
}