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,12 +609,34 @@ 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
} }
} }
if text.count != 0 {
switch component.emptyLineHandling { switch component.emptyLineHandling {
case .allowed: case .allowed:
break break
@ -630,12 +652,15 @@ public final class TextFieldComponent: Component {
return false return false
} }
let string = self.inputState.inputText.string as NSString if text.range(of: "\n") != nil {
let updatedString = string.replacingCharacters(in: range, with: text) let updatedText = text.replacingOccurrences(of: "\n", with: "")
if updatedString.range(of: "\n") != nil { if !updatedText.isEmpty {
self.insertText(NSAttributedString(string: updatedText))
}
return false return false
} }
} }
}
return true return true
} }