mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-11 11:13:29 +00:00
Merge commit 'b6ed1387166b7966d85c9c539bdaac82bf4085ec'
This commit is contained in:
commit
7228f45f24
@ -353,7 +353,7 @@ public final class VoiceChatController: ViewController {
|
|||||||
} else {
|
} else {
|
||||||
let volumeValue = peerEntry.volume.flatMap { $0 / 100 }
|
let volumeValue = peerEntry.volume.flatMap { $0 / 100 }
|
||||||
if let volume = volumeValue, volume != 100 {
|
if let volume = volumeValue, volume != 100 {
|
||||||
text = .text("\(volume / 100)% \(presentationData.strings.VoiceChat_StatusSpeaking)", .constructive)
|
text = .text("\(volume)% \(presentationData.strings.VoiceChat_StatusSpeaking)", .constructive)
|
||||||
} else {
|
} else {
|
||||||
text = .text(presentationData.strings.VoiceChat_StatusSpeaking, .constructive)
|
text = .text(presentationData.strings.VoiceChat_StatusSpeaking, .constructive)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -306,6 +306,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
let historyNodeContainer: ASDisplayNode
|
let historyNodeContainer: ASDisplayNode
|
||||||
let loadingNode: ChatLoadingNode
|
let loadingNode: ChatLoadingNode
|
||||||
private var emptyNode: ChatEmptyNode?
|
private var emptyNode: ChatEmptyNode?
|
||||||
|
private var emptyType: ChatHistoryNodeLoadState.EmptyType?
|
||||||
|
private var didDisplayEmptyGreeting = false
|
||||||
private var validEmptyNodeLayout: (CGSize, UIEdgeInsets)?
|
private var validEmptyNodeLayout: (CGSize, UIEdgeInsets)?
|
||||||
var restrictedNode: ChatRecentActionsEmptyNode?
|
var restrictedNode: ChatRecentActionsEmptyNode?
|
||||||
|
|
||||||
@ -535,11 +537,18 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
strongSelf.updateIsLoading(isLoading: false, animated: animated)
|
strongSelf.updateIsLoading(isLoading: false, animated: animated)
|
||||||
}
|
}
|
||||||
|
|
||||||
var isEmpty = false
|
var emptyType: ChatHistoryNodeLoadState.EmptyType?
|
||||||
if case .empty = loadState {
|
if case let .empty(type) = loadState {
|
||||||
isEmpty = true
|
emptyType = type
|
||||||
|
if case .joined = type {
|
||||||
|
if strongSelf.didDisplayEmptyGreeting {
|
||||||
|
emptyType = .generic
|
||||||
|
} else {
|
||||||
|
strongSelf.didDisplayEmptyGreeting = true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
strongSelf.updateIsEmpty(isEmpty, animated: animated)
|
strongSelf.updateIsEmpty(emptyType, animated: animated)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -707,11 +716,12 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateIsEmpty(_ isEmpty: Bool, animated: Bool) {
|
private func updateIsEmpty(_ emptyType: ChatHistoryNodeLoadState.EmptyType?, animated: Bool) {
|
||||||
if isEmpty && self.emptyNode == nil {
|
self.emptyType = emptyType
|
||||||
|
if let emptyType = emptyType, self.emptyNode == nil {
|
||||||
let emptyNode = ChatEmptyNode(account: self.context.account, interaction: self.interfaceInteraction)
|
let emptyNode = ChatEmptyNode(account: self.context.account, interaction: self.interfaceInteraction)
|
||||||
if let (size, insets) = self.validEmptyNodeLayout {
|
if let (size, insets) = self.validEmptyNodeLayout {
|
||||||
emptyNode.updateLayout(interfaceState: self.chatPresentationInterfaceState, size: size, insets: insets, transition: .immediate)
|
emptyNode.updateLayout(interfaceState: self.chatPresentationInterfaceState, emptyType: emptyType, size: size, insets: insets, transition: .immediate)
|
||||||
}
|
}
|
||||||
emptyNode.isHidden = self.restrictedNode != nil
|
emptyNode.isHidden = self.restrictedNode != nil
|
||||||
self.emptyNode = emptyNode
|
self.emptyNode = emptyNode
|
||||||
@ -1374,8 +1384,8 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
var emptyNodeInsets = insets
|
var emptyNodeInsets = insets
|
||||||
emptyNodeInsets.bottom += inputPanelsHeight
|
emptyNodeInsets.bottom += inputPanelsHeight
|
||||||
self.validEmptyNodeLayout = (contentBounds.size, emptyNodeInsets)
|
self.validEmptyNodeLayout = (contentBounds.size, emptyNodeInsets)
|
||||||
if let emptyNode = self.emptyNode {
|
if let emptyNode = self.emptyNode, let emptyType = self.emptyType {
|
||||||
emptyNode.updateLayout(interfaceState: self.chatPresentationInterfaceState, size: contentBounds.size, insets: emptyNodeInsets, transition: transition)
|
emptyNode.updateLayout(interfaceState: self.chatPresentationInterfaceState, emptyType: emptyType, size: contentBounds.size, insets: emptyNodeInsets, transition: transition)
|
||||||
transition.updateFrame(node: emptyNode, frame: contentBounds)
|
transition.updateFrame(node: emptyNode, frame: contentBounds)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -809,7 +809,7 @@ final class ChatEmptyNode: ASDisplayNode {
|
|||||||
self.addSubnode(self.backgroundNode)
|
self.addSubnode(self.backgroundNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateLayout(interfaceState: ChatPresentationInterfaceState, size: CGSize, insets: UIEdgeInsets, transition: ContainedViewLayoutTransition) {
|
func updateLayout(interfaceState: ChatPresentationInterfaceState, emptyType: ChatHistoryNodeLoadState.EmptyType, size: CGSize, insets: UIEdgeInsets, transition: ContainedViewLayoutTransition) {
|
||||||
if self.currentTheme !== interfaceState.theme || self.currentStrings !== interfaceState.strings {
|
if self.currentTheme !== interfaceState.theme || self.currentStrings !== interfaceState.strings {
|
||||||
self.currentTheme = interfaceState.theme
|
self.currentTheme = interfaceState.theme
|
||||||
self.currentStrings = interfaceState.strings
|
self.currentStrings = interfaceState.strings
|
||||||
@ -838,7 +838,11 @@ final class ChatEmptyNode: ASDisplayNode {
|
|||||||
} else if let _ = interfaceState.peerNearbyData {
|
} else if let _ = interfaceState.peerNearbyData {
|
||||||
contentType = .peerNearby
|
contentType = .peerNearby
|
||||||
} else if let _ = peer as? TelegramUser {
|
} else if let _ = peer as? TelegramUser {
|
||||||
contentType = .greeting
|
if case .joined = emptyType {
|
||||||
|
contentType = .greeting
|
||||||
|
} else {
|
||||||
|
contentType = .regular
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
contentType = .regular
|
contentType = .regular
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1700,7 +1700,18 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
|
|
||||||
let loadState: ChatHistoryNodeLoadState
|
let loadState: ChatHistoryNodeLoadState
|
||||||
if transition.historyView.filteredEntries.isEmpty {
|
if transition.historyView.filteredEntries.isEmpty {
|
||||||
loadState = .empty
|
if let firstEntry = transition.historyView.originalView.entries.first {
|
||||||
|
var isPeerJoined = false
|
||||||
|
for media in firstEntry.message.media {
|
||||||
|
if let action = media as? TelegramMediaAction, action.action == .peerJoined {
|
||||||
|
isPeerJoined = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loadState = .empty(isPeerJoined ? .joined : .generic)
|
||||||
|
} else {
|
||||||
|
loadState = .empty(.generic)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
loadState = .messages
|
loadState = .messages
|
||||||
}
|
}
|
||||||
@ -1732,8 +1743,15 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
|
|
||||||
let loadState: ChatHistoryNodeLoadState
|
let loadState: ChatHistoryNodeLoadState
|
||||||
if let historyView = strongSelf.historyView {
|
if let historyView = strongSelf.historyView {
|
||||||
if historyView.filteredEntries.isEmpty {
|
if let firstEntry = historyView.originalView.entries.first, historyView.filteredEntries.isEmpty {
|
||||||
loadState = .empty
|
var isPeerJoined = false
|
||||||
|
for media in firstEntry.message.media {
|
||||||
|
if let action = media as? TelegramMediaAction, action.action == .peerJoined {
|
||||||
|
isPeerJoined = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loadState = .empty(isPeerJoined ? .joined : .generic)
|
||||||
} else {
|
} else {
|
||||||
loadState = .messages
|
loadState = .messages
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,9 +10,14 @@ public enum ChatHistoryNodeHistoryState: Equatable {
|
|||||||
case loaded(isEmpty: Bool)
|
case loaded(isEmpty: Bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ChatHistoryNodeLoadState {
|
public enum ChatHistoryNodeLoadState: Equatable {
|
||||||
|
public enum EmptyType: Equatable {
|
||||||
|
case generic
|
||||||
|
case joined
|
||||||
|
}
|
||||||
|
|
||||||
case loading
|
case loading
|
||||||
case empty
|
case empty(EmptyType)
|
||||||
case messages
|
case messages
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -484,6 +484,11 @@ class ContactMultiselectionControllerImpl: ViewController, ContactMultiselection
|
|||||||
strongSelf.requestLayout(transition: ContainedViewLayoutTransition.animated(duration: 0.4, curve: .spring))
|
strongSelf.requestLayout(transition: ContainedViewLayoutTransition.animated(duration: 0.4, curve: .spring))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.contactsNode.complete = { [weak self] in
|
||||||
|
if let strongSelf = self, let rightBarButtonItem = strongSelf.navigationItem.rightBarButtonItem, rightBarButtonItem.isEnabled {
|
||||||
|
strongSelf.rightNavigationButtonPressed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.displayNodeDidLoad()
|
self.displayNodeDidLoad()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,6 +57,7 @@ final class ContactMultiselectionControllerNode: ASDisplayNode {
|
|||||||
var removeSelectedPeer: ((ContactListPeerId) -> Void)?
|
var removeSelectedPeer: ((ContactListPeerId) -> Void)?
|
||||||
var removeSelectedCategory: ((Int) -> Void)?
|
var removeSelectedCategory: ((Int) -> Void)?
|
||||||
var additionalCategorySelected: ((Int) -> Void)?
|
var additionalCategorySelected: ((Int) -> Void)?
|
||||||
|
var complete: (() -> Void)?
|
||||||
|
|
||||||
var editableTokens: [EditableTokenListToken] = []
|
var editableTokens: [EditableTokenListToken] = []
|
||||||
|
|
||||||
@ -214,6 +215,9 @@ final class ContactMultiselectionControllerNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.tokenListNode.textReturned = { [weak self] in
|
||||||
|
self?.complete?()
|
||||||
|
}
|
||||||
|
|
||||||
self.presentationDataDisposable = (context.sharedContext.presentationData
|
self.presentationDataDisposable = (context.sharedContext.presentationData
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] presentationData in
|
|> deliverOnMainQueue).start(next: { [weak self] presentationData in
|
||||||
|
|||||||
@ -123,6 +123,7 @@ final class EditableTokenListNode: ASDisplayNode, UITextFieldDelegate {
|
|||||||
|
|
||||||
var textUpdated: ((String) -> Void)?
|
var textUpdated: ((String) -> Void)?
|
||||||
var deleteToken: ((AnyHashable) -> Void)?
|
var deleteToken: ((AnyHashable) -> Void)?
|
||||||
|
var textReturned: (() -> Void)?
|
||||||
|
|
||||||
init(theme: EditableTokenListNodeTheme, placeholder: String) {
|
init(theme: EditableTokenListNodeTheme, placeholder: String) {
|
||||||
self.theme = theme
|
self.theme = theme
|
||||||
@ -335,6 +336,11 @@ final class EditableTokenListNode: ASDisplayNode, UITextFieldDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||||
|
self.textReturned?()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func textFieldDidBeginEditing(_ textField: UITextField) {
|
func textFieldDidBeginEditing(_ textField: UITextField) {
|
||||||
/*if self.caretIndicatorNode.supernode == self {
|
/*if self.caretIndicatorNode.supernode == self {
|
||||||
self.caretIndicatorNode.removeFromSupernode()
|
self.caretIndicatorNode.removeFromSupernode()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user