Limit chat input field text length when editing media

This commit is contained in:
Ilya Laktyushin 2020-05-06 15:55:20 +04:00
parent 1e914ba95c
commit da3e372772
3 changed files with 31 additions and 9 deletions

View File

@ -2805,7 +2805,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
})
if let editMessage = interfaceState.editMessage, let message = combinedInitialData.initialData?.associatedMessages[editMessage.messageId] {
updated = updatedChatEditInterfaceMessagetState(state: updated, message: message)
updated = updatedChatEditInterfaceMessageState(state: updated, message: message)
}
updated = updated.updatedSlowmodeState(slowmodeState)
return updated
@ -3323,10 +3323,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
break
}
}
return $0.withUpdatedEditMessage(ChatEditMessageState(messageId: messageId, inputState: ChatTextInputState(inputText: chatInputStateStringWithAppliedEntities(message.text, entities: entities)), disableUrlPreview: nil))
var inputTextMaxLength: Int32?
for media in message.media {
if media is TelegramMediaImage || media is TelegramMediaFile {
inputTextMaxLength = strongSelf.context.currentLimitsConfiguration.with { $0 }.maxMediaCaptionLength
break
}
}
return $0.withUpdatedEditMessage(ChatEditMessageState(messageId: messageId, inputState: ChatTextInputState(inputText: chatInputStateStringWithAppliedEntities(message.text, entities: entities)), disableUrlPreview: nil, inputTextMaxLength: inputTextMaxLength))
}
updated = updatedChatEditInterfaceMessagetState(state: updated, message: message)
updated = updatedChatEditInterfaceMessageState(state: updated, message: message)
updated = updated.updatedInputMode({ _ in
return .text
})
@ -5790,7 +5797,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if !desc.text.isEmpty {
state = state.updatedInterfaceState { state in
if let editMessage = state.editMessage {
return state.withUpdatedEditMessage(ChatEditMessageState(messageId: editMessage.messageId, inputState: ChatTextInputState(inputText: NSAttributedString(string: desc.text)), disableUrlPreview: editMessage.disableUrlPreview))
return state.withUpdatedEditMessage(editMessage.withUpdatedInputState(ChatTextInputState(inputText: NSAttributedString(string: desc.text))))
}
return state
}

View File

@ -36,11 +36,13 @@ struct ChatEditMessageState: PostboxCoding, Equatable {
let messageId: MessageId
let inputState: ChatTextInputState
let disableUrlPreview: String?
let inputTextMaxLength: Int32?
init(messageId: MessageId, inputState: ChatTextInputState, disableUrlPreview: String?) {
init(messageId: MessageId, inputState: ChatTextInputState, disableUrlPreview: String?, inputTextMaxLength: Int32?) {
self.messageId = messageId
self.inputState = inputState
self.disableUrlPreview = disableUrlPreview
self.inputTextMaxLength = inputTextMaxLength
}
init(decoder: PostboxDecoder) {
@ -51,6 +53,7 @@ struct ChatEditMessageState: PostboxCoding, Equatable {
self.inputState = ChatTextInputState()
}
self.disableUrlPreview = decoder.decodeOptionalStringForKey("dup")
self.inputTextMaxLength = decoder.decodeOptionalInt32ForKey("tl")
}
func encode(_ encoder: PostboxEncoder) {
@ -63,18 +66,23 @@ struct ChatEditMessageState: PostboxCoding, Equatable {
} else {
encoder.encodeNil(forKey: "dup")
}
if let inputTextMaxLength = self.inputTextMaxLength {
encoder.encodeInt32(inputTextMaxLength, forKey: "ml")
} else {
encoder.encodeNil(forKey: "ml")
}
}
static func ==(lhs: ChatEditMessageState, rhs: ChatEditMessageState) -> Bool {
return lhs.messageId == rhs.messageId && lhs.inputState == rhs.inputState && lhs.disableUrlPreview == rhs.disableUrlPreview
return lhs.messageId == rhs.messageId && lhs.inputState == rhs.inputState && lhs.disableUrlPreview == rhs.disableUrlPreview && lhs.inputTextMaxLength == rhs.inputTextMaxLength
}
func withUpdatedInputState(_ inputState: ChatTextInputState) -> ChatEditMessageState {
return ChatEditMessageState(messageId: self.messageId, inputState: inputState, disableUrlPreview: self.disableUrlPreview)
return ChatEditMessageState(messageId: self.messageId, inputState: inputState, disableUrlPreview: self.disableUrlPreview, inputTextMaxLength: self.inputTextMaxLength)
}
func withUpdatedDisableUrlPreview(_ disableUrlPreview: String?) -> ChatEditMessageState {
return ChatEditMessageState(messageId: self.messageId, inputState: self.inputState, disableUrlPreview: disableUrlPreview)
return ChatEditMessageState(messageId: self.messageId, inputState: self.inputState, disableUrlPreview: disableUrlPreview, inputTextMaxLength: self.inputTextMaxLength)
}
}

View File

@ -1456,7 +1456,6 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
}
if let textInputNode = self.textInputNode, let presentationInterfaceState = self.presentationInterfaceState {
if case .format = self.inputMenu.state {
self.inputMenu.deactivate()
UIMenuController.shared.update()
@ -1561,6 +1560,14 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
}
}
}
let newText = (editableTextNode.textView.text as NSString).replacingCharacters(in: range, with: cleanText)
if let interfaceState = self.presentationInterfaceState, let editMessage = interfaceState.interfaceState.editMessage, let inputTextMaxLength = editMessage.inputTextMaxLength {
if newText.count > inputTextMaxLength {
return false
}
}
if cleanText != text {
let string = NSMutableAttributedString(attributedString: editableTextNode.attributedText ?? NSAttributedString())
var textColor: UIColor = .black