IceCubesApp/Packages/Conversations/Sources/Conversations/Detail/ConversationDetailViewModel.swift

79 lines
2.3 KiB
Swift
Raw Normal View History

2023-01-22 15:55:03 +00:00
import Foundation
import Models
import Network
import SwiftUI
@MainActor
@Observable class ConversationDetailViewModel {
2023-01-22 15:55:03 +00:00
var client: Client?
var conversation: Conversation
var isLoadingMessages: Bool = true
var messages: [Status] = []
var isSendingMessage: Bool = false
var newMessageText: String = ""
2023-01-22 15:55:03 +00:00
init(conversation: Conversation) {
self.conversation = conversation
2023-02-12 15:29:41 +00:00
messages = conversation.lastStatus != nil ? [conversation.lastStatus!] : []
2023-01-22 15:55:03 +00:00
}
2023-01-22 15:55:03 +00:00
func fetchMessages() async {
guard let client, let lastMessageId = messages.last?.id else { return }
do {
let context: StatusContext = try await client.get(endpoint: Statuses.context(id: lastMessageId))
isLoadingMessages = false
messages.insert(contentsOf: context.ancestors, at: 0)
messages.append(contentsOf: context.descendants)
} catch {}
2023-01-22 15:55:03 +00:00
}
2023-01-22 15:55:03 +00:00
func postMessage() async {
guard let client else { return }
isSendingMessage = true
var finalText = conversation.accounts.map { "@\($0.acct)" }.joined(separator: " ")
2023-01-22 15:55:03 +00:00
finalText += " "
finalText += newMessageText
let data = StatusData(status: finalText,
visibility: .direct,
inReplyToId: messages.last?.id)
do {
let status: Status = try await client.post(endpoint: Statuses.postStatus(json: data))
appendNewStatus(status: status)
withAnimation {
newMessageText = ""
isSendingMessage = false
}
} catch {
isSendingMessage = false
}
}
2023-01-22 15:55:03 +00:00
func handleEvent(event: any StreamEvent) {
if let event = event as? StreamEventStatusUpdate,
let index = messages.firstIndex(where: { $0.id == event.status.id })
{
2023-01-22 15:55:03 +00:00
messages[index] = event.status
} else if let event = event as? StreamEventDelete,
let index = messages.firstIndex(where: { $0.id == event.status })
{
2023-01-22 15:55:03 +00:00
messages.remove(at: index)
} else if let event = event as? StreamEventConversation,
event.conversation.id == conversation.id
{
conversation = event.conversation
if conversation.lastStatus != nil {
appendNewStatus(status: conversation.lastStatus!)
}
2023-01-22 15:55:03 +00:00
}
}
2023-01-22 15:55:03 +00:00
private func appendNewStatus(status: Status) {
if !messages.contains(where: { $0.id == status.id }) {
messages.append(status)
}
}
}