Expand iOS messaging shell actions
This commit is contained in:
@@ -116,6 +116,10 @@ public final class ChatViewModel: ObservableObject {
|
||||
@Published public private(set) var messages: [Message] = []
|
||||
@Published public var composeText: String
|
||||
@Published public var replyTo: Message?
|
||||
@Published public var searchText = ""
|
||||
@Published public private(set) var searchResults: [Message] = []
|
||||
@Published public private(set) var pinnedMessages: [Message] = []
|
||||
@Published public private(set) var copiedPayload: String?
|
||||
@Published public private(set) var isLoading = false
|
||||
@Published public private(set) var errorMessage: String?
|
||||
|
||||
@@ -133,6 +137,7 @@ public final class ChatViewModel: ObservableObject {
|
||||
|
||||
do {
|
||||
messages = try await bridge.loadHistory(chatId: chat.id)
|
||||
pinnedMessages = try await bridge.pinnedMessages(chatId: chat.id)
|
||||
errorMessage = nil
|
||||
} catch {
|
||||
errorMessage = error.localizedDescription
|
||||
@@ -159,6 +164,75 @@ public final class ChatViewModel: ObservableObject {
|
||||
errorMessage = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
public func search() async {
|
||||
do {
|
||||
searchResults = try await bridge.searchMessages(chatId: chat.id, query: searchText)
|
||||
errorMessage = nil
|
||||
} catch {
|
||||
errorMessage = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
public func beginReply(to message: Message) {
|
||||
replyTo = message
|
||||
}
|
||||
|
||||
public func edit(message: Message, text: String) async {
|
||||
do {
|
||||
let edited = try await bridge.editMessage(chatId: chat.id, messageId: message.id, text: text)
|
||||
replaceMessage(edited)
|
||||
errorMessage = nil
|
||||
} catch {
|
||||
errorMessage = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
public func delete(message: Message) async {
|
||||
do {
|
||||
try await bridge.deleteMessages(chatId: chat.id, messageIds: [message.id])
|
||||
messages.removeAll { $0.id == message.id }
|
||||
errorMessage = nil
|
||||
} catch {
|
||||
errorMessage = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
public func forward(message: Message, to chatId: Int64) async {
|
||||
do {
|
||||
try await bridge.forwardMessages(toChatId: chatId, fromChatId: chat.id, messageIds: [message.id])
|
||||
errorMessage = nil
|
||||
} catch {
|
||||
errorMessage = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
public func react(message: Message, reaction: String) async {
|
||||
do {
|
||||
let reactions = try await bridge.react(chatId: chat.id, messageId: message.id, reaction: reaction)
|
||||
var updated = message
|
||||
updated.reactions = reactions
|
||||
replaceMessage(updated)
|
||||
errorMessage = nil
|
||||
} catch {
|
||||
errorMessage = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
public func copyPayload(for message: Message) async {
|
||||
do {
|
||||
copiedPayload = try await bridge.copyPayload(chatId: chat.id, messageId: message.id)
|
||||
errorMessage = nil
|
||||
} catch {
|
||||
errorMessage = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
private func replaceMessage(_ message: Message) {
|
||||
if let index = messages.firstIndex(where: { $0.id == message.id }) {
|
||||
messages[index] = message
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
|
||||
Reference in New Issue
Block a user