Files
cheetah/Cheetah/Views/ContentView.swift
leetcode-mafia b91561d6df add error alert
2023-04-18 19:42:42 -04:00

69 lines
2.2 KiB
Swift

import SwiftUI
import LibWhisper
struct ContentView: View {
@ObservedObject var viewModel: AppViewModel
@ViewBuilder
var body: some View {
if viewModel.authToken?.isEmpty == false {
VStack(spacing: 16) {
switch viewModel.downloadState {
case .pending:
Text("Downloading \(viewModel.whisperModel)...")
case .failed(let error):
if let error = error {
Text("Failed to download model. \(error.localizedDescription)")
} else {
Text("Failed to download model. An unknown error occurred.")
}
case .completed:
CoachView(viewModel: viewModel)
}
}
.padding()
.frame(minWidth: 300, minHeight: 350)
} else {
AuthTokenView(storedToken: viewModel.$authToken,
useGPT4: viewModel.$useGPT4.nonEmpty)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
let viewModel = AppViewModel()
viewModel.devices = [CaptureDevice(id: 0, name: "Audio Loopback Device")]
viewModel.buttonsAlwaysEnabled = true
viewModel.authToken = ""
viewModel.downloadState = .completed
viewModel.transcript = "So how would we break this app down into components?"
viewModel.answer = """
• Header Component: Contains two sub-components: Logo and Title.
Props: logoUrl, title
• Content Component: Contains an image and a paragraph.
Props: imageUrl, message
• Footer Component: Simple component that displays a message.
Props: message
• App Component: Renders the Header, Content, and Footer components
"""
return ContentView(viewModel: viewModel)
.previewLayout(.fixed(width: 300, height: 500))
.previewDisplayName("Cheetah")
}
}
extension Binding where Value == Bool? {
var nonEmpty: Binding<Bool> {
Binding<Bool>(
get: { self.wrappedValue ?? false },
set: { self.wrappedValue = $0 }
)
}
}