Skip to content

Instantly share code, notes, and snippets.

@apatronl
Last active May 2, 2024 03:31
Show Gist options
  • Save apatronl/04cfc0aac513ad19afab32952fd8cb59 to your computer and use it in GitHub Desktop.
Save apatronl/04cfc0aac513ad19afab32952fd8cb59 to your computer and use it in GitHub Desktop.
@MainActor
@Observable
class ChatViewModel {
// Private
private let client: GeminiClient = GeminiClient()
// Public
var error: Error?
var waitingForResponse: Bool = false
var draftMessage: String = ""
private(set) var messages: [Message] = []
var scrollPosition: UUID? = nil
func sendMessage() async {
guard canSendMessage else { return }
let latestMessage = addMessage(draftMessage, role: .sender)
draftMessage.removeAll()
// Send message to Gemini
error = nil
waitingForResponse = true
let result = await client.send(message: latestMessage.text)
waitingForResponse = false
switch result {
case .success(let response):
addMessage(response, role: .receiver)
case .failure(let error):
self.error = error
}
}
public var canSendMessage: Bool {
!draftMessage.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
}
@discardableResult
private func addMessage(_ text: String, role: Role) -> Message {
let message = Message(role: role, text: text)
messages.append(message)
scrollPosition = message.id
return message
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment