add error alert

This commit is contained in:
leetcode-mafia
2023-04-18 19:42:42 -04:00
parent 82da6641bb
commit b91561d6df
6 changed files with 58 additions and 28 deletions

View File

@ -24,6 +24,7 @@ class AppViewModel: ObservableObject {
@Published var analyzer: ConversationAnalyzer? @Published var analyzer: ConversationAnalyzer?
@Published var answerRequest = AnswerRequest.none @Published var answerRequest = AnswerRequest.none
@Published var errorDescription: String?
@Published var transcript: String? @Published var transcript: String?
@Published var answer: String? @Published var answer: String?
@ -67,35 +68,40 @@ struct CheetahApp: App {
// Install manifest needed for the browser extension to talk to ExtensionHelper // Install manifest needed for the browser extension to talk to ExtensionHelper
_ = try? installNativeMessagingManifest() _ = try? installNativeMessagingManifest()
do { while true {
for try await request in viewModel.$answerRequest.receive(on: RunLoop.main).values { do {
if let analyzer = viewModel.analyzer { for try await request in viewModel.$answerRequest.receive(on: RunLoop.main).values {
switch request { if let analyzer = viewModel.analyzer {
case .answerQuestion: switch request {
try await analyzer.answer() case .answerQuestion:
viewModel.answer = analyzer.context[.answer] try await analyzer.answer()
viewModel.codeAnswer = analyzer.context[.codeAnswer] viewModel.answer = analyzer.context[.answer]
viewModel.answerRequest = .none viewModel.codeAnswer = analyzer.context[.codeAnswer]
viewModel.answerRequest = .none
case .refineAnswer(let selection):
try await analyzer.answer(refine: true, selection: selection) case .refineAnswer(let selection):
viewModel.answer = analyzer.context[.answer] try await analyzer.answer(refine: true, selection: selection)
viewModel.codeAnswer = analyzer.context[.codeAnswer] viewModel.answer = analyzer.context[.answer]
viewModel.answerRequest = .none viewModel.codeAnswer = analyzer.context[.codeAnswer]
viewModel.answerRequest = .none
case .analyzeCode:
try await analyzer.analyzeCode(extensionState: extensionState) case .analyzeCode:
viewModel.answer = analyzer.context[.answer] try await analyzer.analyzeCode(extensionState: extensionState)
viewModel.answerRequest = .none viewModel.answer = analyzer.context[.answer]
viewModel.answerRequest = .none
case .none:
break case .none:
break
}
} }
} }
} catch let error as ErrorResult {
viewModel.errorDescription = error.message
viewModel.answerRequest = .none
} catch {
viewModel.errorDescription = error.localizedDescription
viewModel.answerRequest = .none
} }
} catch {
viewModel.answerRequest = .none
//TODO: handle error
} }
} }

View File

@ -77,6 +77,8 @@ class OpenAIExecutor {
let text = result.choices?.first?.text let text = result.choices?.first?.text
if let text = text { if let text = text {
log(completion: text) log(completion: text)
} else if let error = result.error {
throw error
} }
return text return text
} }
@ -87,6 +89,8 @@ class OpenAIExecutor {
let content = result.choices?.first?.message.content let content = result.choices?.first?.message.content
if let content = content { if let content = content {
log(completion: content) log(completion: content)
} else if let error = result.error {
throw error
} }
return content return content
} }

View File

@ -30,7 +30,7 @@ struct AuthTokenView: View {
} }
} }
struct APIKeyView_Previews: PreviewProvider { struct AuthTokenView_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
return AuthTokenView( return AuthTokenView(
storedToken: Binding.constant(nil), storedToken: Binding.constant(nil),

View File

@ -7,6 +7,9 @@ struct CoachView: View {
@State var answer: String @State var answer: String
@State var answerSelection = NSRange() @State var answerSelection = NSRange()
@State var showError = false
@State var errorDescription = ""
init(viewModel: AppViewModel) { init(viewModel: AppViewModel) {
self.viewModel = viewModel self.viewModel = viewModel
self.answer = viewModel.answer ?? "" self.answer = viewModel.answer ?? ""
@ -55,6 +58,17 @@ struct CoachView: View {
} }
} }
} }
.onReceive(viewModel.$errorDescription) {
if let error = $0 {
self.showError = true
self.errorDescription = error
}
}
.alert(errorDescription, isPresented: $showError) {
Button("OK", role: .cancel) {
self.showError = false
}
}
HStack { HStack {
VStack(alignment: .leading, spacing: 20) { VStack(alignment: .leading, spacing: 20) {
if let transcript = viewModel.transcript { if let transcript = viewModel.transcript {

View File

@ -6,7 +6,7 @@ struct ContentView: View {
@ViewBuilder @ViewBuilder
var body: some View { var body: some View {
if viewModel.authToken != nil { if viewModel.authToken?.isEmpty == false {
VStack(spacing: 16) { VStack(spacing: 16) {
switch viewModel.downloadState { switch viewModel.downloadState {
case .pending: case .pending:

View File

@ -12,6 +12,12 @@ public struct OpenAI<T: Payload>: Codable {
public let choices: [T]? public let choices: [T]?
public let usage: UsageResult? public let usage: UsageResult?
public let data: [T]? public let data: [T]?
public let error: ErrorResult?
}
public struct ErrorResult: Codable, Error {
public let message: String
public let code: String
} }
public struct TextResult: Payload { public struct TextResult: Payload {