Skip to content

Commit b91561d

Browse files
add error alert
1 parent 82da664 commit b91561d

File tree

6 files changed

+58
-28
lines changed

6 files changed

+58
-28
lines changed

Cheetah/CheetahApp.swift

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class AppViewModel: ObservableObject {
2424

2525
@Published var analyzer: ConversationAnalyzer?
2626
@Published var answerRequest = AnswerRequest.none
27+
@Published var errorDescription: String?
2728

2829
@Published var transcript: String?
2930
@Published var answer: String?
@@ -67,35 +68,40 @@ struct CheetahApp: App {
6768
// Install manifest needed for the browser extension to talk to ExtensionHelper
6869
_ = try? installNativeMessagingManifest()
6970

70-
do {
71-
for try await request in viewModel.$answerRequest.receive(on: RunLoop.main).values {
72-
if let analyzer = viewModel.analyzer {
73-
switch request {
74-
case .answerQuestion:
75-
try await analyzer.answer()
76-
viewModel.answer = analyzer.context[.answer]
77-
viewModel.codeAnswer = analyzer.context[.codeAnswer]
78-
viewModel.answerRequest = .none
79-
80-
case .refineAnswer(let selection):
81-
try await analyzer.answer(refine: true, selection: selection)
82-
viewModel.answer = analyzer.context[.answer]
83-
viewModel.codeAnswer = analyzer.context[.codeAnswer]
84-
viewModel.answerRequest = .none
85-
86-
case .analyzeCode:
87-
try await analyzer.analyzeCode(extensionState: extensionState)
88-
viewModel.answer = analyzer.context[.answer]
89-
viewModel.answerRequest = .none
90-
91-
case .none:
92-
break
71+
while true {
72+
do {
73+
for try await request in viewModel.$answerRequest.receive(on: RunLoop.main).values {
74+
if let analyzer = viewModel.analyzer {
75+
switch request {
76+
case .answerQuestion:
77+
try await analyzer.answer()
78+
viewModel.answer = analyzer.context[.answer]
79+
viewModel.codeAnswer = analyzer.context[.codeAnswer]
80+
viewModel.answerRequest = .none
81+
82+
case .refineAnswer(let selection):
83+
try await analyzer.answer(refine: true, selection: selection)
84+
viewModel.answer = analyzer.context[.answer]
85+
viewModel.codeAnswer = analyzer.context[.codeAnswer]
86+
viewModel.answerRequest = .none
87+
88+
case .analyzeCode:
89+
try await analyzer.analyzeCode(extensionState: extensionState)
90+
viewModel.answer = analyzer.context[.answer]
91+
viewModel.answerRequest = .none
92+
93+
case .none:
94+
break
95+
}
9396
}
9497
}
98+
} catch let error as ErrorResult {
99+
viewModel.errorDescription = error.message
100+
viewModel.answerRequest = .none
101+
} catch {
102+
viewModel.errorDescription = error.localizedDescription
103+
viewModel.answerRequest = .none
95104
}
96-
} catch {
97-
viewModel.answerRequest = .none
98-
//TODO: handle error
99105
}
100106
}
101107

Cheetah/OpenAIExecutor.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ class OpenAIExecutor {
7777
let text = result.choices?.first?.text
7878
if let text = text {
7979
log(completion: text)
80+
} else if let error = result.error {
81+
throw error
8082
}
8183
return text
8284
}
@@ -87,6 +89,8 @@ class OpenAIExecutor {
8789
let content = result.choices?.first?.message.content
8890
if let content = content {
8991
log(completion: content)
92+
} else if let error = result.error {
93+
throw error
9094
}
9195
return content
9296
}

Cheetah/Views/AuthTokenView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct AuthTokenView: View {
3030
}
3131
}
3232

33-
struct APIKeyView_Previews: PreviewProvider {
33+
struct AuthTokenView_Previews: PreviewProvider {
3434
static var previews: some View {
3535
return AuthTokenView(
3636
storedToken: Binding.constant(nil),

Cheetah/Views/CoachView.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ struct CoachView: View {
77
@State var answer: String
88
@State var answerSelection = NSRange()
99

10+
@State var showError = false
11+
@State var errorDescription = ""
12+
1013
init(viewModel: AppViewModel) {
1114
self.viewModel = viewModel
1215
self.answer = viewModel.answer ?? ""
@@ -55,6 +58,17 @@ struct CoachView: View {
5558
}
5659
}
5760
}
61+
.onReceive(viewModel.$errorDescription) {
62+
if let error = $0 {
63+
self.showError = true
64+
self.errorDescription = error
65+
}
66+
}
67+
.alert(errorDescription, isPresented: $showError) {
68+
Button("OK", role: .cancel) {
69+
self.showError = false
70+
}
71+
}
5872
HStack {
5973
VStack(alignment: .leading, spacing: 20) {
6074
if let transcript = viewModel.transcript {

Cheetah/Views/ContentView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ struct ContentView: View {
66

77
@ViewBuilder
88
var body: some View {
9-
if viewModel.authToken != nil {
9+
if viewModel.authToken?.isEmpty == false {
1010
VStack(spacing: 16) {
1111
switch viewModel.downloadState {
1212
case .pending:

OpenAISwift/Models/OpenAI.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ public struct OpenAI<T: Payload>: Codable {
1212
public let choices: [T]?
1313
public let usage: UsageResult?
1414
public let data: [T]?
15+
public let error: ErrorResult?
16+
}
17+
18+
public struct ErrorResult: Codable, Error {
19+
public let message: String
20+
public let code: String
1521
}
1622

1723
public struct TextResult: Payload {

0 commit comments

Comments
 (0)