Compare commits

..

No commits in common. "7015ccd41f4c35b65747e706c97eab7985857409" and "452ccfacd6bdf6badce21ebee565c906faf37987" have entirely different histories.

3 changed files with 41 additions and 78 deletions

View File

@ -2842,6 +2842,9 @@
}, },
"Сообщение" : { "Сообщение" : {
},
"Сообщение слишком длинное." : {
}, },
"Сообщения будут с рожками и ножками." : { "Сообщения будут с рожками и ножками." : {

View File

@ -14,7 +14,7 @@ final class PrivateChatViewModel: ObservableObject {
private let chatId: String private let chatId: String
private let currentUserId: String? private let currentUserId: String?
private let pageSize: Int private let pageSize: Int
let maxMessageLength: Int = 4096 private let maxMessageLength: Int = 4096
private var didLoadInitially: Bool = false private var didLoadInitially: Bool = false
private var messageObserver: NSObjectProtocol? private var messageObserver: NSObjectProtocol?
@ -74,7 +74,11 @@ final class PrivateChatViewModel: ObservableObject {
completion(false) completion(false)
return return
} }
guard trimmed.count <= maxMessageLength else {
sendingErrorMessage = NSLocalizedString("Сообщение слишком длинное.", comment: "")
completion(false)
return
}
guard !isSending else { guard !isSending else {
sendingErrorMessage = NSLocalizedString("Дождитесь отправки предыдущего сообщения.", comment: "") sendingErrorMessage = NSLocalizedString("Дождитесь отправки предыдущего сообщения.", comment: "")
completion(false) completion(false)
@ -88,61 +92,36 @@ final class PrivateChatViewModel: ObservableObject {
isSending = true isSending = true
sendingErrorMessage = nil sendingErrorMessage = nil
let chunks = splitMessage(trimmed, maxLength: maxMessageLength) chatService.sendPrivateMessage(chatId: chatId, content: trimmed) { [weak self] result in
let dispatchGroup = DispatchGroup() guard let self else { return }
var overallSuccess = true
for chunk in chunks { switch result {
dispatchGroup.enter() case .success(let data):
chatService.sendPrivateMessage(chatId: chatId, content: chunk) { [weak self] result in let newMessage = MessageItem(
guard let self else { messageId: data.messageId,
dispatchGroup.leave() messageType: "text",
return chatId: data.chatId,
} senderId: currentUserId,
senderData: nil,
content: trimmed,
mediaLink: nil,
isViewed: true,
viewedAt: nil,
createdAt: data.createdAt,
updatedAt: data.createdAt,
forwardMetadata: nil
)
switch result { self.messages = Self.merge(existing: self.messages, newMessages: [newMessage])
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()
}
}
dispatchGroup.notify(queue: .main) {
self.isSending = false
if overallSuccess {
self.errorMessage = nil self.errorMessage = nil
completion(true)
case .failure(let error):
self.sendingErrorMessage = self.message(for: error)
completion(false)
} }
completion(overallSuccess)
}
}
private func splitMessage(_ message: String, maxLength: Int) -> [String] { self.isSending = false
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() { func refresh() {
@ -237,4 +216,4 @@ final class PrivateChatViewModel: ObservableObject {
return lhs.messageId < rhs.messageId return lhs.messageId < rhs.messageId
} }
} }

View File

@ -624,33 +624,14 @@ struct PrivateChatView: View {
.padding(.trailing, 44) .padding(.trailing, 44)
.padding(.bottom, 10) .padding(.bottom, 10)
.frame(maxWidth: .infinity, minHeight: 40, alignment: .bottomLeading) .frame(maxWidth: .infinity, minHeight: 40, alignment: .bottomLeading)
HStack{
if draftText.count > 2047 {
Text("\(draftText.count) / \(viewModel.maxMessageLength)")
.font(.caption2)
.fontWeight(.medium)
.foregroundColor(draftText.count > viewModel.maxMessageLength ? .red : .secondary)
}
Button(action: { }) { // переключатель на стикеры
Image(systemName: "face.smiling")
.font(.system(size: 18, weight: .semibold))
.foregroundColor(.secondary)
}
.padding(.trailing, 12)
.padding(.bottom, 10)
}
// if draftText.count > 300 { Button(action: { }) { // переключатель на стикеры
// Text("\(draftText.count) / \(viewModel.maxMessageLength)") Image(systemName: "face.smiling")
// .font(.caption2) .font(.system(size: 18, weight: .semibold))
// .fontWeight(.medium) .foregroundColor(.secondary)
// .foregroundColor(draftText.count > viewModel.maxMessageLength ? .red : .secondary) }
// .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing) .padding(.trailing, 12)
// .padding(.trailing, 12) .padding(.bottom, 10)
// .padding(.top, 4)
// }
} }
.frame(minHeight: 40, alignment: .bottom) .frame(minHeight: 40, alignment: .bottom)
.background(Color(.secondarySystemBackground)) .background(Color(.secondarySystemBackground))