mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 22:25:57 +00:00
Poll emoji improvements
This commit is contained in:
@@ -93,7 +93,8 @@ final class ComposePollScreenComponent: Component {
|
||||
private let pollTextFieldTag = NSObject()
|
||||
private var resetPollText: String?
|
||||
|
||||
private var quizAnswerTextInputState = ListMultilineTextFieldItemComponent.ExternalState()
|
||||
private var quizAnswerTextInputState = TextFieldComponent.ExternalState()
|
||||
private let quizAnswerTextInputTag = NSObject()
|
||||
private var resetQuizAnswerText: String?
|
||||
|
||||
private var nextPollOptionId: Int = 0
|
||||
@@ -119,6 +120,8 @@ final class ComposePollScreenComponent: Component {
|
||||
|
||||
private var currentEmojiSuggestionView: ComponentHostView<Empty>?
|
||||
|
||||
private var currentEditingTag: AnyObject?
|
||||
|
||||
override init(frame: CGRect) {
|
||||
self.scrollView = UIScrollView()
|
||||
self.scrollView.showsVerticalScrollIndicator = true
|
||||
@@ -450,6 +453,11 @@ final class ComposePollScreenComponent: Component {
|
||||
textInputStates.append((textInputView, pollOption.textInputState))
|
||||
}
|
||||
}
|
||||
if self.isQuiz {
|
||||
if let textInputView = self.quizAnswerSection.findTaggedView(tag: self.quizAnswerTextInputTag) as? ListComposePollOptionComponent.View {
|
||||
textInputStates.append((textInputView, self.quizAnswerTextInputState))
|
||||
}
|
||||
}
|
||||
|
||||
return textInputStates
|
||||
}
|
||||
@@ -1085,39 +1093,59 @@ final class ComposePollScreenComponent: Component {
|
||||
maximumNumberOfLines: 0
|
||||
)),
|
||||
items: [
|
||||
AnyComponentWithIdentity(id: 0, component: AnyComponent(ListMultilineTextFieldItemComponent(
|
||||
AnyComponentWithIdentity(id: 0, component: AnyComponent(ListComposePollOptionComponent(
|
||||
externalState: self.quizAnswerTextInputState,
|
||||
context: component.context,
|
||||
theme: environment.theme,
|
||||
strings: environment.strings,
|
||||
initialText: "",
|
||||
resetText: self.resetQuizAnswerText.flatMap { resetQuizAnswerText in
|
||||
return ListMultilineTextFieldItemComponent.ResetText(value: resetQuizAnswerText)
|
||||
resetText: self.resetQuizAnswerText.flatMap { resetText in
|
||||
return ListComposePollOptionComponent.ResetText(value: resetText)
|
||||
},
|
||||
placeholder: "Add a Comment (Optional)",
|
||||
autocapitalizationType: .none,
|
||||
autocorrectionType: .no,
|
||||
characterLimit: 256,
|
||||
emptyLineHandling: .oneConsecutive,
|
||||
updated: { _ in
|
||||
assumeIsEditing: self.inputMediaNodeTargetTag === self.quizAnswerTextInputTag,
|
||||
characterLimit: component.initialData.maxPollTextLength,
|
||||
returnKeyAction: { [weak self] in
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
self.endEditing(true)
|
||||
},
|
||||
textUpdateTransition: .spring(duration: 0.4)
|
||||
backspaceKeyAction: nil,
|
||||
selection: nil,
|
||||
inputMode: self.currentInputMode,
|
||||
toggleInputMode: { [weak self] in
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
switch self.currentInputMode {
|
||||
case .keyboard:
|
||||
self.currentInputMode = .emoji
|
||||
case .emoji:
|
||||
self.currentInputMode = .keyboard
|
||||
}
|
||||
self.state?.updated(transition: .spring(duration: 0.4))
|
||||
},
|
||||
tag: self.quizAnswerTextInputTag
|
||||
)))
|
||||
]
|
||||
)),
|
||||
environment: {},
|
||||
containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: 10000.0)
|
||||
)
|
||||
self.resetQuizAnswerText = nil
|
||||
let quizAnswerSectionFrame = CGRect(origin: CGPoint(x: sideInset, y: contentHeight + quizAnswerSectionHeight), size: quizAnswerSectionSize)
|
||||
if let quizAnswerSectionView = self.quizAnswerSection.view {
|
||||
if let quizAnswerSectionView = self.quizAnswerSection.view as? ListSectionComponent.View {
|
||||
if quizAnswerSectionView.superview == nil {
|
||||
self.scrollView.addSubview(quizAnswerSectionView)
|
||||
self.quizAnswerSection.parentState = state
|
||||
}
|
||||
transition.setFrame(view: quizAnswerSectionView, frame: quizAnswerSectionFrame)
|
||||
transition.setAlpha(view: quizAnswerSectionView, alpha: self.isQuiz ? 1.0 : 0.0)
|
||||
|
||||
if let itemView = quizAnswerSectionView.itemView(id: 0) as? ListComposePollOptionComponent.View {
|
||||
itemView.updateCustomPlaceholder(value: environment.strings.CreatePoll_Explanation, size: itemView.bounds.size, transition: .immediate)
|
||||
}
|
||||
}
|
||||
quizAnswerSectionHeight += pollTextSectionSize.height
|
||||
quizAnswerSectionHeight += quizAnswerSectionSize.height
|
||||
|
||||
if self.isQuiz {
|
||||
contentHeight += quizAnswerSectionHeight
|
||||
@@ -1140,7 +1168,15 @@ final class ComposePollScreenComponent: Component {
|
||||
|
||||
let textInputStates = self.collectTextInputStates()
|
||||
|
||||
let isEditing = textInputStates.contains(where: { $0.state.isEditing })
|
||||
let previousEditingTag = self.currentEditingTag
|
||||
let isEditing: Bool
|
||||
if let index = textInputStates.firstIndex(where: { $0.state.isEditing }) {
|
||||
isEditing = true
|
||||
self.currentEditingTag = textInputStates[index].view.currentTag
|
||||
} else {
|
||||
isEditing = false
|
||||
self.currentEditingTag = nil
|
||||
}
|
||||
|
||||
if let (_, suggestionTextInputState) = textInputStates.first(where: { $0.state.isEditing && $0.state.currentEmojiSuggestion != nil }), let emojiSuggestion = suggestionTextInputState.currentEmojiSuggestion, emojiSuggestion.disposable == nil {
|
||||
emojiSuggestion.disposable = (EmojiSuggestionsComponent.suggestionData(context: component.context, isSavedMessages: false, query: emojiSuggestion.position.value)
|
||||
@@ -1277,11 +1313,7 @@ final class ComposePollScreenComponent: Component {
|
||||
}
|
||||
|
||||
let combinedBottomInset: CGFloat
|
||||
if isEditing {
|
||||
combinedBottomInset = bottomInset + 8.0 + inputHeight
|
||||
} else {
|
||||
combinedBottomInset = bottomInset + environment.safeInsets.bottom
|
||||
}
|
||||
combinedBottomInset = bottomInset + max(environment.safeInsets.bottom, 8.0 + inputHeight)
|
||||
contentHeight += combinedBottomInset
|
||||
|
||||
var recenterOnTag: AnyObject?
|
||||
@@ -1371,6 +1403,16 @@ final class ComposePollScreenComponent: Component {
|
||||
}
|
||||
}
|
||||
|
||||
if previousEditingTag !== self.currentEditingTag, self.currentInputMode != .keyboard {
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
self.currentInputMode = .keyboard
|
||||
self.state?.updated(transition: .spring(duration: 0.4))
|
||||
}
|
||||
}
|
||||
|
||||
return availableSize
|
||||
}
|
||||
}
|
||||
|
||||
@@ -448,22 +448,41 @@ public final class ListComposePollOptionComponent: Component {
|
||||
)
|
||||
let modeSelectorFrame = CGRect(origin: CGPoint(x: size.width - 4.0 - modeSelectorSize.width, y: floor((size.height - modeSelectorSize.height) * 0.5)), size: modeSelectorSize)
|
||||
if let modeSelectorView = modeSelector.view as? PlainButtonComponent.View {
|
||||
let alphaTransition: Transition = .easeInOut(duration: 0.2)
|
||||
|
||||
if modeSelectorView.superview == nil {
|
||||
self.addSubview(modeSelectorView)
|
||||
Transition.immediate.setAlpha(view: modeSelectorView, alpha: 0.0)
|
||||
Transition.immediate.setScale(view: modeSelectorView, scale: 0.001)
|
||||
}
|
||||
|
||||
if playAnimation, let animationView = modeSelectorView.contentView as? LottieComponent.View {
|
||||
animationView.playOnce()
|
||||
}
|
||||
|
||||
modeSelectorTransition.setFrame(view: modeSelectorView, frame: modeSelectorFrame)
|
||||
modeSelectorTransition.setPosition(view: modeSelectorView, position: modeSelectorFrame.center)
|
||||
modeSelectorTransition.setBounds(view: modeSelectorView, bounds: CGRect(origin: CGPoint(), size: modeSelectorFrame.size))
|
||||
|
||||
if let externalState = component.externalState {
|
||||
modeSelectorView.isHidden = !externalState.isEditing
|
||||
let displaySelector = externalState.isEditing
|
||||
|
||||
alphaTransition.setAlpha(view: modeSelectorView, alpha: displaySelector ? 1.0 : 0.0)
|
||||
alphaTransition.setScale(view: modeSelectorView, scale: displaySelector ? 1.0 : 0.001)
|
||||
}
|
||||
}
|
||||
} else if let modeSelector = self.modeSelector {
|
||||
self.modeSelector = nil
|
||||
modeSelector.view?.removeFromSuperview()
|
||||
if let modeSelectorView = modeSelector.view {
|
||||
if !transition.animation.isImmediate {
|
||||
let alphaTransition: Transition = .easeInOut(duration: 0.2)
|
||||
alphaTransition.setAlpha(view: modeSelectorView, alpha: 0.0, completion: { [weak modeSelectorView] _ in
|
||||
modeSelectorView?.removeFromSuperview()
|
||||
})
|
||||
alphaTransition.setScale(view: modeSelectorView, scale: 0.001)
|
||||
} else {
|
||||
modeSelectorView.removeFromSuperview()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.separatorInset = leftInset
|
||||
|
||||
Reference in New Issue
Block a user