2023-01-22 15:55:03 +00:00
|
|
|
import Foundation
|
|
|
|
import Models
|
|
|
|
import Network
|
|
|
|
import SwiftUI
|
|
|
|
|
|
|
|
@MainActor
|
2023-09-18 05:01:23 +00:00
|
|
|
@Observable class ConversationDetailViewModel {
|
2023-01-22 15:55:03 +00:00
|
|
|
var client: Client?
|
|
|
|
|
|
|
|
var conversation: Conversation
|
2023-01-25 12:02:28 +00:00
|
|
|
|
2023-09-18 05:01:23 +00:00
|
|
|
var isLoadingMessages: Bool = true
|
|
|
|
var messages: [Status] = []
|
2023-01-25 12:02:28 +00:00
|
|
|
|
2023-09-18 05:01:23 +00:00
|
|
|
var isSendingMessage: Bool = false
|
|
|
|
var newMessageText: String = ""
|
2023-01-25 12:02:28 +00:00
|
|
|
|
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-25 12:02:28 +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)
|
2023-01-25 12:02:28 +00:00
|
|
|
} catch {}
|
2023-01-22 15:55:03 +00:00
|
|
|
}
|
2023-01-25 12:02:28 +00:00
|
|
|
|
2023-01-22 15:55:03 +00:00
|
|
|
func postMessage() async {
|
|
|
|
guard let client else { return }
|
|
|
|
isSendingMessage = true
|
2023-01-25 12:02:28 +00:00
|
|
|
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-25 12:02:28 +00:00
|
|
|
|
2023-01-22 15:55:03 +00:00
|
|
|
func handleEvent(event: any StreamEvent) {
|
|
|
|
if let event = event as? StreamEventStatusUpdate,
|
2023-01-25 12:02:28 +00:00
|
|
|
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,
|
2023-01-25 12:02:28 +00:00
|
|
|
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,
|
2023-01-25 12:02:28 +00:00
|
|
|
event.conversation.id == conversation.id
|
|
|
|
{
|
|
|
|
conversation = event.conversation
|
2023-02-08 05:27:44 +00:00
|
|
|
if conversation.lastStatus != nil {
|
|
|
|
appendNewStatus(status: conversation.lastStatus!)
|
|
|
|
}
|
2023-01-22 15:55:03 +00:00
|
|
|
}
|
|
|
|
}
|
2023-01-25 12:02:28 +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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|