Compare commits
No commits in common. "7015ccd41f4c35b65747e706c97eab7985857409" and "452ccfacd6bdf6badce21ebee565c906faf37987" have entirely different histories.
7015ccd41f
...
452ccfacd6
@ -2842,6 +2842,9 @@
|
|||||||
},
|
},
|
||||||
"Сообщение" : {
|
"Сообщение" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Сообщение слишком длинное." : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Сообщения будут с рожками и ножками." : {
|
"Сообщения будут с рожками и ножками." : {
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user