diff --git a/submodules/ChatListUI/Sources/DateSuggestion.swift b/submodules/ChatListUI/Sources/DateSuggestion.swift index 2333b02eb1..2b3d9ccc36 100644 --- a/submodules/ChatListUI/Sources/DateSuggestion.swift +++ b/submodules/ChatListUI/Sources/DateSuggestion.swift @@ -106,11 +106,13 @@ func suggestDates(for string: String, strings: PresentationStrings, dateTimeForm if stringComponents.count < 3 { for i in 0..<5 { if let date = calendar.date(byAdding: .year, value: -i, to: resultDate), date < now { - result.append((nil, date, nil)) + let lowerDate = getLowerDate(for: resultDate) + result.append((lowerDate, date, nil)) } } } else if resultDate < now { - result.append((nil, resultDate, nil)) + let lowerDate = getLowerDate(for: resultDate) + result.append((lowerDate, resultDate, nil)) } } let dd = try NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue) diff --git a/submodules/ListMessageItem/Sources/ListMessageDateHeader.swift b/submodules/ListMessageItem/Sources/ListMessageDateHeader.swift index 8205218905..9700c275bb 100644 --- a/submodules/ListMessageItem/Sources/ListMessageDateHeader.swift +++ b/submodules/ListMessageItem/Sources/ListMessageDateHeader.swift @@ -17,7 +17,7 @@ private let timezoneOffset: Int32 = { }() public func listMessageDateHeaderId(timestamp: Int32) -> Int64 { - let unclippedValue: Int64 = min(Int64(Int32.max), Int64(timestamp) + Int64(timezoneOffset)) + let unclippedValue: Int64 = min(Int64(Int32.max), Int64(timestamp)) var time: time_t = time_t(Int32(clamping: unclippedValue)) var timeinfo: tm = tm() @@ -29,7 +29,7 @@ public func listMessageDateHeaderId(timestamp: Int32) -> Int64 { } public func listMessageDateHeaderInfo(timestamp: Int32) -> (year: Int32, month: Int32) { - var time: time_t = time_t(timestamp + timezoneOffset) + var time: time_t = time_t(timestamp) var timeinfo: tm = tm() localtime_r(&time, &timeinfo) @@ -53,7 +53,7 @@ final class ListMessageDateHeader: ListViewItemHeader { self.strings = strings self.fontSize = fontSize - var time: time_t = time_t(timestamp + timezoneOffset) + var time: time_t = time_t(timestamp) var timeinfo: tm = tm() localtime_r(&time, &timeinfo) diff --git a/submodules/SearchBarNode/Sources/SearchBarNode.swift b/submodules/SearchBarNode/Sources/SearchBarNode.swift index 4d3da5b99f..5a9950ff9c 100644 --- a/submodules/SearchBarNode/Sources/SearchBarNode.swift +++ b/submodules/SearchBarNode/Sources/SearchBarNode.swift @@ -251,9 +251,11 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate { self.tokenNodes[token.id] = tokenNode } tokenNode.tapped = { [weak self] in - self?.selectedTokenIndex = i - self?.becomeFirstResponder() if let strongSelf = self { + strongSelf.selectedTokenIndex = i + if !strongSelf.isFirstResponder { + let _ = strongSelf.becomeFirstResponder() + } let newPosition = strongSelf.beginningOfDocument strongSelf.selectedTextRange = strongSelf.textRange(from: newPosition, to: newPosition) } @@ -443,6 +445,15 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate { self.updateTokenContainerPosition() } + override func becomeFirstResponder() -> Bool { + if let contentOffset = self.scrollView?.contentOffset { + Queue.mainQueue().after(0.03) { + self.scrollView?.setContentOffset(contentOffset, animated: true) + } + } + return super.becomeFirstResponder() + } + private func updateTokenContainerPosition(transition: ContainedViewLayoutTransition = .immediate) { if let scrollView = self.scrollView { transition.updateFrame(node: self.tokenContainerNode, frame: CGRect(origin: CGPoint(x: -scrollView.contentOffset.x - scrollView.contentInset.left, y: 0.0), size: self.tokenContainerNode.frame.size)) @@ -460,7 +471,7 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate { } super.keyboardAppearance = newValue if resigning { - self.becomeFirstResponder() + let _ = self.becomeFirstResponder() } } } @@ -553,7 +564,6 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate { override func touchesBegan(_ touches: Set, with event: UIEvent?) { if let _ = self.selectedTokenIndex { - self.selectedTokenIndex = nil if let touch = touches.first, let gestureRecognizers = touch.gestureRecognizers { let point = touch.location(in: self.tokenContainerNode.view) for (_, tokenNode) in self.tokenNodes { @@ -562,6 +572,7 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate { return } } + self.selectedTokenIndex = nil for gesture in gestureRecognizers { if gesture is UITapGestureRecognizer, gesture.isEnabled { gesture.isEnabled = false @@ -931,7 +942,9 @@ public class SearchBarNode: ASDisplayNode, UITextFieldDelegate { } public func activate() { - self.textField.becomeFirstResponder() + if !self.textField.isFirstResponder { + let _ = self.textField.becomeFirstResponder() + } } public func animateIn(from node: SearchBarPlaceholderNode, duration: Double, timingFunction: String) { @@ -1102,14 +1115,18 @@ public class SearchBarNode: ASDisplayNode, UITextFieldDelegate { } public func selectAll() { - self.textField.becomeFirstResponder() + if !self.textField.isFirstResponder { + let _ = self.textField.becomeFirstResponder() + } self.textField.selectAll(nil) } public func selectLastToken() { if !self.textField.tokens.isEmpty { self.textField.selectedTokenIndex = self.textField.tokens.count - 1 - self.textField.becomeFirstResponder() + if !self.textField.isFirstResponder { + let _ = self.textField.becomeFirstResponder() + } } }