mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-04-14 12:46:05 +00:00
92 lines
3.1 KiB
Swift
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|