Fix poll text limits

This commit is contained in:
Isaac 2024-04-26 19:14:48 +04:00
parent c5165b03ac
commit 53f37cd043
3 changed files with 57 additions and 23 deletions

View File

@ -657,6 +657,7 @@ final class ComposePollScreenComponent: Component {
}, },
assumeIsEditing: self.inputMediaNodeTargetTag === self.pollTextFieldTag, assumeIsEditing: self.inputMediaNodeTargetTag === self.pollTextFieldTag,
characterLimit: component.initialData.maxPollTextLength, characterLimit: component.initialData.maxPollTextLength,
emptyLineHandling: .allowed,
returnKeyAction: { [weak self] in returnKeyAction: { [weak self] in
guard let self else { guard let self else {
return return
@ -751,6 +752,7 @@ final class ComposePollScreenComponent: Component {
}, },
assumeIsEditing: self.inputMediaNodeTargetTag === pollOption.textFieldTag, assumeIsEditing: self.inputMediaNodeTargetTag === pollOption.textFieldTag,
characterLimit: component.initialData.maxPollOptionLength, characterLimit: component.initialData.maxPollOptionLength,
emptyLineHandling: .notAllowed,
returnKeyAction: { [weak self] in returnKeyAction: { [weak self] in
guard let self else { guard let self else {
return return
@ -1132,6 +1134,7 @@ final class ComposePollScreenComponent: Component {
}, },
assumeIsEditing: self.inputMediaNodeTargetTag === self.quizAnswerTextInputTag, assumeIsEditing: self.inputMediaNodeTargetTag === self.quizAnswerTextInputTag,
characterLimit: component.initialData.maxPollTextLength, characterLimit: component.initialData.maxPollTextLength,
emptyLineHandling: .allowed,
returnKeyAction: { [weak self] in returnKeyAction: { [weak self] in
guard let self else { guard let self else {
return return
@ -1564,7 +1567,7 @@ public class ComposePollScreen: ViewControllerComponentContainer, AttachmentCont
public static func initialData(context: AccountContext) -> InitialData { public static func initialData(context: AccountContext) -> InitialData {
return InitialData( return InitialData(
maxPollTextLength: Int(context.userLimits.maxCaptionLength), maxPollTextLength: Int(255),
maxPollOptionLength: 100 maxPollOptionLength: 100
) )
} }

View File

@ -75,6 +75,7 @@ public final class ListComposePollOptionComponent: Component {
public let resetText: ResetText? public let resetText: ResetText?
public let assumeIsEditing: Bool public let assumeIsEditing: Bool
public let characterLimit: Int? public let characterLimit: Int?
public let emptyLineHandling: TextFieldComponent.EmptyLineHandling
public let returnKeyAction: (() -> Void)? public let returnKeyAction: (() -> Void)?
public let backspaceKeyAction: (() -> Void)? public let backspaceKeyAction: (() -> Void)?
public let selection: Selection? public let selection: Selection?
@ -90,6 +91,7 @@ public final class ListComposePollOptionComponent: Component {
resetText: ResetText? = nil, resetText: ResetText? = nil,
assumeIsEditing: Bool = false, assumeIsEditing: Bool = false,
characterLimit: Int, characterLimit: Int,
emptyLineHandling: TextFieldComponent.EmptyLineHandling,
returnKeyAction: (() -> Void)?, returnKeyAction: (() -> Void)?,
backspaceKeyAction: (() -> Void)?, backspaceKeyAction: (() -> Void)?,
selection: Selection?, selection: Selection?,
@ -104,6 +106,7 @@ public final class ListComposePollOptionComponent: Component {
self.resetText = resetText self.resetText = resetText
self.assumeIsEditing = assumeIsEditing self.assumeIsEditing = assumeIsEditing
self.characterLimit = characterLimit self.characterLimit = characterLimit
self.emptyLineHandling = emptyLineHandling
self.returnKeyAction = returnKeyAction self.returnKeyAction = returnKeyAction
self.backspaceKeyAction = backspaceKeyAction self.backspaceKeyAction = backspaceKeyAction
self.selection = selection self.selection = selection
@ -134,6 +137,9 @@ public final class ListComposePollOptionComponent: Component {
if lhs.characterLimit != rhs.characterLimit { if lhs.characterLimit != rhs.characterLimit {
return false return false
} }
if lhs.emptyLineHandling != rhs.emptyLineHandling {
return false
}
if lhs.selection != rhs.selection { if lhs.selection != rhs.selection {
return false return false
} }
@ -325,7 +331,7 @@ public final class ListComposePollOptionComponent: Component {
}, },
isOneLineWhenUnfocused: false, isOneLineWhenUnfocused: false,
characterLimit: component.characterLimit, characterLimit: component.characterLimit,
emptyLineHandling: .notAllowed, emptyLineHandling: component.emptyLineHandling,
formatMenuAvailability: .none, formatMenuAvailability: .none,
returnKeyType: .next, returnKeyType: .next,
lockedFormatAction: { lockedFormatAction: {

View File

@ -609,31 +609,56 @@ public final class TextFieldComponent: Component {
} }
if let characterLimit = component.characterLimit { if let characterLimit = component.characterLimit {
let replacementString = text as NSString
let string = self.inputState.inputText.string as NSString let string = self.inputState.inputText.string as NSString
let updatedString = string.replacingCharacters(in: range, with: text) let deltaLength = replacementString.length - range.length
if (updatedString as NSString).length > characterLimit { let resultingLength = string.length + deltaLength
if resultingLength > characterLimit {
let availableLength = characterLimit - string.length
if availableLength > 0 {
var insertString = replacementString.substring(to: availableLength)
switch component.emptyLineHandling {
case .allowed:
break
case .oneConsecutive:
while insertString.range(of: "\n\n") != nil {
if let range = insertString.range(of: "\n\n") {
insertString.replaceSubrange(range, with: "\n")
}
}
case .notAllowed:
insertString = insertString.replacingOccurrences(of: "\n", with: "")
}
self.insertText(NSAttributedString(string: insertString))
}
return false return false
} }
} }
switch component.emptyLineHandling { if text.count != 0 {
case .allowed: switch component.emptyLineHandling {
break case .allowed:
case .oneConsecutive: break
let string = self.inputState.inputText.string as NSString case .oneConsecutive:
let updatedString = string.replacingCharacters(in: range, with: text) let string = self.inputState.inputText.string as NSString
if updatedString.range(of: "\n\n") != nil { let updatedString = string.replacingCharacters(in: range, with: text)
return false if updatedString.range(of: "\n\n") != nil {
} return false
case .notAllowed: }
if (range.length == 0 && text == "\n"), let returnKeyAction = component.returnKeyAction { case .notAllowed:
returnKeyAction() if (range.length == 0 && text == "\n"), let returnKeyAction = component.returnKeyAction {
return false returnKeyAction()
} return false
}
let string = self.inputState.inputText.string as NSString
let updatedString = string.replacingCharacters(in: range, with: text) if text.range(of: "\n") != nil {
if updatedString.range(of: "\n") != nil { let updatedText = text.replacingOccurrences(of: "\n", with: "")
return false if !updatedText.isEmpty {
self.insertText(NSAttributedString(string: updatedText))
}
return false
}
} }
} }