add send long msg
This commit is contained in:
parent
452ccfacd6
commit
da5745cad8
@ -2842,9 +2842,6 @@
|
||||
},
|
||||
"Сообщение" : {
|
||||
|
||||
},
|
||||
"Сообщение слишком длинное." : {
|
||||
|
||||
},
|
||||
"Сообщения будут с рожками и ножками." : {
|
||||
|
||||
|
||||
@ -74,11 +74,7 @@ final class PrivateChatViewModel: ObservableObject {
|
||||
completion(false)
|
||||
return
|
||||
}
|
||||
guard trimmed.count <= maxMessageLength else {
|
||||
sendingErrorMessage = NSLocalizedString("Сообщение слишком длинное.", comment: "")
|
||||
completion(false)
|
||||
return
|
||||
}
|
||||
|
||||
guard !isSending else {
|
||||
sendingErrorMessage = NSLocalizedString("Дождитесь отправки предыдущего сообщения.", comment: "")
|
||||
completion(false)
|
||||
@ -92,36 +88,61 @@ final class PrivateChatViewModel: ObservableObject {
|
||||
isSending = true
|
||||
sendingErrorMessage = nil
|
||||
|
||||
chatService.sendPrivateMessage(chatId: chatId, content: trimmed) { [weak self] result in
|
||||
guard let self else { return }
|
||||
let chunks = splitMessage(trimmed, maxLength: maxMessageLength)
|
||||
let dispatchGroup = DispatchGroup()
|
||||
var overallSuccess = true
|
||||
|
||||
switch result {
|
||||
case .success(let data):
|
||||
let newMessage = MessageItem(
|
||||
messageId: data.messageId,
|
||||
messageType: "text",
|
||||
chatId: data.chatId,
|
||||
senderId: currentUserId,
|
||||
senderData: nil,
|
||||
content: trimmed,
|
||||
mediaLink: nil,
|
||||
isViewed: true,
|
||||
viewedAt: nil,
|
||||
createdAt: data.createdAt,
|
||||
updatedAt: data.createdAt,
|
||||
forwardMetadata: nil
|
||||
)
|
||||
for chunk in chunks {
|
||||
dispatchGroup.enter()
|
||||
chatService.sendPrivateMessage(chatId: chatId, content: chunk) { [weak self] result in
|
||||
guard let self else {
|
||||
dispatchGroup.leave()
|
||||
return
|
||||
}
|
||||
|
||||
self.messages = Self.merge(existing: self.messages, newMessages: [newMessage])
|
||||
self.errorMessage = nil
|
||||
completion(true)
|
||||
case .failure(let error):
|
||||
self.sendingErrorMessage = self.message(for: error)
|
||||
completion(false)
|
||||
switch result {
|
||||
case .success(let data):
|
||||
let newMessage = MessageItem(
|
||||
messageId: data.messageId,
|
||||
messageType: "text",
|
||||
chatId: data.chatId,
|
||||
senderId: currentUserId,
|
||||
senderData: nil,
|
||||
content: chunk,
|
||||
mediaLink: nil,
|
||||
isViewed: true,
|
||||
viewedAt: nil,
|
||||
createdAt: data.createdAt,
|
||||
updatedAt: data.createdAt,
|
||||
forwardMetadata: nil
|
||||
)
|
||||
self.messages = Self.merge(existing: self.messages, newMessages: [newMessage])
|
||||
case .failure(let error):
|
||||
self.sendingErrorMessage = self.message(for: error)
|
||||
overallSuccess = false
|
||||
}
|
||||
dispatchGroup.leave()
|
||||
}
|
||||
|
||||
self.isSending = false
|
||||
}
|
||||
|
||||
dispatchGroup.notify(queue: .main) {
|
||||
self.isSending = false
|
||||
if overallSuccess {
|
||||
self.errorMessage = nil
|
||||
}
|
||||
completion(overallSuccess)
|
||||
}
|
||||
}
|
||||
|
||||
private func splitMessage(_ message: String, maxLength: Int) -> [String] {
|
||||
var chunks: [String] = []
|
||||
var remaining = message
|
||||
while !remaining.isEmpty {
|
||||
let chunk = String(remaining.prefix(maxLength))
|
||||
chunks.append(chunk)
|
||||
remaining = String(remaining.dropFirst(maxLength))
|
||||
}
|
||||
return chunks
|
||||
}
|
||||
|
||||
func refresh() {
|
||||
@ -216,4 +237,4 @@ final class PrivateChatViewModel: ObservableObject {
|
||||
|
||||
return lhs.messageId < rhs.messageId
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user