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] { 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) updated = updated.updatedSlowmodeState(slowmodeState)
return updated return updated
@ -3323,10 +3323,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
break 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 updated = updated.updatedInputMode({ _ in
return .text return .text
}) })
@ -5790,7 +5797,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if !desc.text.isEmpty { if !desc.text.isEmpty {
state = state.updatedInterfaceState { state in state = state.updatedInterfaceState { state in
if let editMessage = state.editMessage { 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 return state
} }

View File

@ -36,11 +36,13 @@ struct ChatEditMessageState: PostboxCoding, Equatable {
let messageId: MessageId let messageId: MessageId
let inputState: ChatTextInputState let inputState: ChatTextInputState
let disableUrlPreview: String? 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.messageId = messageId
self.inputState = inputState self.inputState = inputState
self.disableUrlPreview = disableUrlPreview self.disableUrlPreview = disableUrlPreview
self.inputTextMaxLength = inputTextMaxLength
} }
init(decoder: PostboxDecoder) { init(decoder: PostboxDecoder) {
@ -51,6 +53,7 @@ struct ChatEditMessageState: PostboxCoding, Equatable {
self.inputState = ChatTextInputState() self.inputState = ChatTextInputState()
} }
self.disableUrlPreview = decoder.decodeOptionalStringForKey("dup") self.disableUrlPreview = decoder.decodeOptionalStringForKey("dup")
self.inputTextMaxLength = decoder.decodeOptionalInt32ForKey("tl")
} }
func encode(_ encoder: PostboxEncoder) { func encode(_ encoder: PostboxEncoder) {
@ -63,18 +66,23 @@ struct ChatEditMessageState: PostboxCoding, Equatable {
} else { } else {
encoder.encodeNil(forKey: "dup") 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 { 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 { 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 { 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 let textInputNode = self.textInputNode, let presentationInterfaceState = self.presentationInterfaceState {
if case .format = self.inputMenu.state { if case .format = self.inputMenu.state {
self.inputMenu.deactivate() self.inputMenu.deactivate()
UIMenuController.shared.update() 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 { if cleanText != text {
let string = NSMutableAttributedString(attributedString: editableTextNode.attributedText ?? NSAttributedString()) let string = NSMutableAttributedString(attributedString: editableTextNode.attributedText ?? NSAttributedString())
var textColor: UIColor = .black var textColor: UIColor = .black