From da5745cad85ad61f3350ac7447b4e033a24d97ec Mon Sep 17 00:00:00 2001 From: cheykrym Date: Fri, 12 Dec 2025 02:26:28 +0300 Subject: [PATCH] add send long msg --- yobble/Resources/Localizable.xcstrings | 3 - yobble/ViewModels/PrivateChatViewModel.swift | 85 ++++++++++++-------- 2 files changed, 53 insertions(+), 35 deletions(-) diff --git a/yobble/Resources/Localizable.xcstrings b/yobble/Resources/Localizable.xcstrings index 30cf44e..abe9a5c 100644 --- a/yobble/Resources/Localizable.xcstrings +++ b/yobble/Resources/Localizable.xcstrings @@ -2842,9 +2842,6 @@ }, "Сообщение" : { - }, - "Сообщение слишком длинное." : { - }, "Сообщения будут с рожками и ножками." : { diff --git a/yobble/ViewModels/PrivateChatViewModel.swift b/yobble/ViewModels/PrivateChatViewModel.swift index 96aa5f4..deaa326 100644 --- a/yobble/ViewModels/PrivateChatViewModel.swift +++ b/yobble/ViewModels/PrivateChatViewModel.swift @@ -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 } -} \ No newline at end of file +}