HuggingChat-Mac/Models/Conversation.swift (76 lines of code) (raw):
//
// Conversation.swift
// HuggingChat-Mac
//
// Created by Cyril Zakka on 8/23/24.
//
import Combine
import Foundation
final class Conversation: Decodable, Identifiable {
let id = UUID()
let serverId: String
var title: String
let modelId: String
let updatedAt: Date
var messages: [Message]
var areMessagesLoaded: Bool
var assistantId: String?
init(
serverId: String, title: String, modelId: String, updatedAt: Date, messages: [Message],
areMessagesLoaded: Bool, assistantId: String? = nil
) {
self.serverId = serverId
self.title = title
self.modelId = modelId
self.updatedAt = updatedAt
self.messages = messages
self.areMessagesLoaded = areMessagesLoaded
self.assistantId = assistantId
}
enum CodingKeys: CodingKey {
case id
case title
case modelId
case updatedAt
case messages
case areMessagesLoaded
case assistantId
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.serverId = try container.decode(String.self, forKey: .id)
self.title = try container.decode(String.self, forKey: .title)
self.modelId = try container.decode(String.self, forKey: .modelId)
self.updatedAt = try container.decode(Date.self, forKey: .updatedAt)
do {
let messages = try container.decode([Message].self, forKey: .messages)
self.messages = messages
self.areMessagesLoaded = true
} catch {
//ToDo: Handle Error
// print("error: \(error)")
self.messages = []
self.areMessagesLoaded = false
}
self.assistantId = try container.decodeIfPresent(String.self, forKey: .assistantId)
}
func loadMessages() -> AnyPublisher<[Message], HFError> {
return NetworkService.getConversation(id: serverId).map { [weak self] conv in
self?.messages = conv.messages
return conv.messages
}.eraseToAnyPublisher()
}
static func conversation(with id: String) -> Conversation {
return Conversation(
serverId: id, title: "Blahblahbla", modelId: "", updatedAt: Date(), messages: [],
areMessagesLoaded: false)
}
static func conversation(title: String, updatedAt: Date) -> Conversation {
return Conversation(
serverId: UUID().uuidString, title: title, modelId: "model", updatedAt: updatedAt,
messages: [], areMessagesLoaded: false)
}
func toTitleEditionBody() -> TitleEditionBody {
return TitleEditionBody(title: title)
}
func isFirstMessageSystem() -> Bool {
if case .system = messages.first?.author {
return true
}
return false
}
//
// func areMessagesConsistent(with rMessages: [MessageRow]) -> Bool {
// var rIDs = rMessages.map { $0.id }
// let mIDs = messages.map { $0.id }.dropFirst()
//
// return rIDs == mIDs
// }
}
extension Conversation {
}