SwiftChat/StatusView.swift (54 lines of code) (raw):
//
// StatusView.swift
//
// Initially created by Cyril Zakka on 1/12/23.
//
import SwiftUI
struct StatusView: View {
@Binding var status: ModelState
@State private var showErrorPopover = false
func errorWithDetails(_ message: String, error: Error) -> any View {
HStack {
Text(message)
Spacer()
Button {
showErrorPopover.toggle()
} label: {
Image(systemName: "info.circle")
}.buttonStyle(.plain)
.popover(isPresented: $showErrorPopover) {
VStack {
Text(verbatim: "\(error)")
.lineLimit(nil)
.padding(.all, 5)
Button {
showErrorPopover.toggle()
} label: {
Text("Dismiss").frame(maxWidth: 200)
}
.padding(.bottom)
}
.frame(minWidth: 400, idealWidth: 400, maxWidth: 400)
.fixedSize()
}
}
}
var body: some View {
switch status {
case .noModel: Text("Please, select a model").frame(height: 50)
case .loading: Text("Loading model…").frame(height: 50)
case .generating(let progress):
let label = progress > 0 ? "Generating…" : "Preparing…"
ProgressView(label, value: progress, total: 1).padding().frame(height: 50)
.progressViewStyle(LinearProgressViewStyle(tint: Color.gray))
case .ready(let tps):
if let tps = tps {
HStack {
Spacer()
Text("Ready")
Spacer()
Text("\(tps, specifier: "%.2f") tokens/s").padding(.trailing)
}.frame(height: 50)
} else {
Text("Ready").frame(height: 50)
}
case .failed(let errorMessage):
Text("Error: \(errorMessage)").frame(height: 50)
}
}
}