mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-08 08:31:13 +00:00
no message
This commit is contained in:
parent
e2fc5ace75
commit
dd4ed9c23d
@ -26,7 +26,8 @@ func authorizationNextOptionText(_ type: AuthorizationCodeNextType?, timeout: In
|
|||||||
if timeout <= 0 {
|
if timeout <= 0 {
|
||||||
return (NSAttributedString(string: strings.Login_CodeSentSms, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false)
|
return (NSAttributedString(string: strings.Login_CodeSentSms, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false)
|
||||||
} else {
|
} else {
|
||||||
return (NSAttributedString(string: strings.Login_SmsRequestState1(Int(minutes), Int(seconds)).0, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false)
|
let timeString = NSString(format: "%d:%.02d", Int(minutes), Int(seconds))
|
||||||
|
return (NSAttributedString(string: strings.Login_WillSendSms(timeString as String).0, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false)
|
||||||
}
|
}
|
||||||
case .call, .flashCall:
|
case .call, .flashCall:
|
||||||
if timeout <= 0 {
|
if timeout <= 0 {
|
||||||
|
@ -49,16 +49,18 @@ class AutodownloadSizeLimitItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? AutodownloadSizeLimitItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? AutodownloadSizeLimitItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -27,16 +27,18 @@ class BotCheckoutHeaderItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? BotCheckoutHeaderItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? BotCheckoutHeaderItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -28,16 +28,18 @@ class BotCheckoutPriceItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? BotCheckoutPriceItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? BotCheckoutPriceItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -24,16 +24,18 @@ class CalculatingCacheSizeItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? CalculatingCacheSizeItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? CalculatingCacheSizeItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -99,18 +99,20 @@ class CallListCallItem: ListViewItem {
|
|||||||
node.contentSize = nodeLayout.contentSize
|
node.contentSize = nodeLayout.contentSize
|
||||||
node.insets = nodeLayout.insets
|
node.insets = nodeLayout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {
|
completion(node, {
|
||||||
nodeApply().1(false)
|
return (nil, {
|
||||||
|
nodeApply().1(false)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? CallListCallItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? CallListCallItemNode {
|
||||||
let layout = node.asyncLayout()
|
let layout = nodeValue.asyncLayout()
|
||||||
async {
|
async {
|
||||||
let (first, last, firstWithHeader) = CallListCallItem.mergeType(item: self, previousItem: previousItem, nextItem: nextItem)
|
let (first, last, firstWithHeader) = CallListCallItem.mergeType(item: self, previousItem: previousItem, nextItem: nextItem)
|
||||||
let (nodeLayout, apply) = layout(self, params, first, last, firstWithHeader, callListNeighbors(item: self, topItem: previousItem, bottomItem: nextItem))
|
let (nodeLayout, apply) = layout(self, params, first, last, firstWithHeader, callListNeighbors(item: self, topItem: previousItem, bottomItem: nextItem))
|
||||||
|
@ -33,9 +33,11 @@ final class ChatBotInfoItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -46,10 +48,10 @@ final class ChatBotInfoItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ChatBotInfoItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ChatBotInfoItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = nodeLayout(self, params)
|
let (layout, apply) = nodeLayout(self, params)
|
||||||
|
@ -41,10 +41,10 @@ final class ChatEmptyItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ChatEmptyItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ChatEmptyItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = nodeLayout(self, params)
|
let (layout, apply) = nodeLayout(self, params)
|
||||||
|
@ -24,15 +24,19 @@ class ChatHoleItem: ListViewItem {
|
|||||||
async {
|
async {
|
||||||
let node = ChatHoleItemNode()
|
let node = ChatHoleItemNode()
|
||||||
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
|
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {})
|
completion(node, {
|
||||||
})
|
return (nil, {})
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: node.insets), {
|
Queue.mainQueue().async {
|
||||||
})
|
completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: node().insets), {
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,26 +22,31 @@ class ChatListHoleItem: ListViewItem {
|
|||||||
node.relativePosition = (first: previousItem == nil, last: nextItem == nil)
|
node.relativePosition = (first: previousItem == nil, last: nextItem == nil)
|
||||||
node.insets = ChatListItemNode.insets(first: false, last: false, firstWithHeader: false)
|
node.insets = ChatListItemNode.insets(first: false, last: false, firstWithHeader: false)
|
||||||
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
|
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {})
|
completion(node, {
|
||||||
})
|
return (nil, {})
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
assert(node is ChatListHoleItemNode)
|
Queue.mainQueue().async {
|
||||||
if let node = node as? ChatListHoleItemNode {
|
assert(node() is ChatListHoleItemNode)
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ChatListHoleItemNode {
|
||||||
let layout = node.asyncLayout()
|
|
||||||
|
let layout = nodeValue.asyncLayout()
|
||||||
async {
|
async {
|
||||||
let first = previousItem == nil
|
let first = previousItem == nil
|
||||||
let last = nextItem == nil
|
let last = nextItem == nil
|
||||||
|
|
||||||
let (nodeLayout, apply) = layout(self, params, first, last)
|
let (nodeLayout, apply) = layout(self, params, first, last)
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
completion(nodeLayout, { [weak node] in
|
completion(nodeLayout, {
|
||||||
apply()
|
apply()
|
||||||
node?.updateBackgroundAndSeparatorsLayout()
|
if let nodeValue = node() as? ChatListHoleItemNode {
|
||||||
|
nodeValue.updateBackgroundAndSeparatorsLayout()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,21 +60,23 @@ class ChatListItem: ListViewItem {
|
|||||||
node.insets = nodeLayout.insets
|
node.insets = nodeLayout.insets
|
||||||
node.contentSize = nodeLayout.contentSize
|
node.contentSize = nodeLayout.contentSize
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {
|
completion(node, {
|
||||||
apply(false)
|
return (nil, {
|
||||||
node.updateIsHighlighted(transition: .immediate)
|
apply(false)
|
||||||
|
node.updateIsHighlighted(transition: .immediate)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
assert(node is ChatListItemNode)
|
Queue.mainQueue().async {
|
||||||
if let node = node as? ChatListItemNode {
|
assert(node() is ChatListItemNode)
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ChatListItemNode {
|
||||||
node.setupItem(item: self)
|
nodeValue.setupItem(item: self)
|
||||||
let layout = node.asyncLayout()
|
let layout = nodeValue.asyncLayout()
|
||||||
async {
|
async {
|
||||||
let (first, last, firstWithHeader, nextIsPinned) = ChatListItem.mergeType(item: self, previousItem: previousItem, nextItem: nextItem)
|
let (first, last, firstWithHeader, nextIsPinned) = ChatListItem.mergeType(item: self, previousItem: previousItem, nextItem: nextItem)
|
||||||
var animated = true
|
var animated = true
|
||||||
|
@ -646,7 +646,7 @@ final class ChatListNode: ListView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.reorderItem = { [weak self] fromIndex, toIndex, transactionOpaqueState in
|
self.reorderItem = { [weak self] fromIndex, toIndex, transactionOpaqueState -> Signal<Bool, NoError> in
|
||||||
if let strongSelf = self, let filteredEntries = (transactionOpaqueState as? ChatListOpaqueTransactionState)?.chatListView.filteredEntries {
|
if let strongSelf = self, let filteredEntries = (transactionOpaqueState as? ChatListOpaqueTransactionState)?.chatListView.filteredEntries {
|
||||||
if fromIndex >= 0 && fromIndex < filteredEntries.count && toIndex >= 0 && toIndex < filteredEntries.count {
|
if fromIndex >= 0 && fromIndex < filteredEntries.count && toIndex >= 0 && toIndex < filteredEntries.count {
|
||||||
let fromEntry = filteredEntries[filteredEntries.count - 1 - fromIndex]
|
let fromEntry = filteredEntries[filteredEntries.count - 1 - fromIndex]
|
||||||
@ -670,7 +670,7 @@ final class ChatListNode: ListView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let _ = fromEntry.index.pinningIndex {
|
if let _ = fromEntry.index.pinningIndex {
|
||||||
let _ = (strongSelf.account.postbox.transaction { transaction -> Void in
|
return strongSelf.account.postbox.transaction { transaction -> Bool in
|
||||||
var itemIds = transaction.getPinnedItemIds()
|
var itemIds = transaction.getPinnedItemIds()
|
||||||
|
|
||||||
var itemId: PinnedItemId?
|
var itemId: PinnedItemId?
|
||||||
@ -706,13 +706,15 @@ final class ChatListNode: ListView {
|
|||||||
} else {
|
} else {
|
||||||
itemIds.append(itemId)
|
itemIds.append(itemId)
|
||||||
}
|
}
|
||||||
reorderPinnedItemIds(transaction: transaction, itemIds: itemIds)
|
return reorderPinnedItemIds(transaction: transaction, itemIds: itemIds)
|
||||||
//transaction.setPinnedItemIds(itemIds)
|
} else {
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
}).start()
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return .single(false)
|
||||||
}
|
}
|
||||||
self.didEndScrolling = { [weak self] in
|
self.didEndScrolling = { [weak self] in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
|
@ -38,10 +38,10 @@ class ChatListRecentPeersListItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ChatListRecentPeersListItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ChatListRecentPeersListItemNode {
|
||||||
let layout = node.asyncLayout()
|
let layout = nodeValue.asyncLayout()
|
||||||
async {
|
async {
|
||||||
let (nodeLayout, apply) = layout(self, params, nextItem != nil)
|
let (nodeLayout, apply) = layout(self, params, nextItem != nil)
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
|
@ -36,18 +36,20 @@ class ChatListSearchItem: ListViewItem {
|
|||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
node.activate = self.activate
|
node.activate = self.activate
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {
|
completion(node, {
|
||||||
apply(false)
|
return (nil, {
|
||||||
|
apply(false)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ChatListSearchItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ChatListSearchItemNode {
|
||||||
let layout = node.asyncLayout()
|
let layout = nodeValue.asyncLayout()
|
||||||
async {
|
async {
|
||||||
var nextIsPinned = false
|
var nextIsPinned = false
|
||||||
if let nextItem = nextItem as? ChatListItem, nextItem.index.pinningIndex != nil {
|
if let nextItem = nextItem as? ChatListItem, nextItem.index.pinningIndex != nil {
|
||||||
|
@ -37,19 +37,23 @@ final class ChatMediaInputMetaSectionItem: ListViewItem {
|
|||||||
node.updateTheme(theme: self.theme)
|
node.updateTheme(theme: self.theme)
|
||||||
node.updateIsHighlighted()
|
node.updateIsHighlighted()
|
||||||
node.updateAppearanceTransition(transition: .immediate)
|
node.updateAppearanceTransition(transition: .immediate)
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {
|
completion(node, {
|
||||||
|
return (nil, {
|
||||||
|
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: node.insets), {
|
Queue.mainQueue().async {
|
||||||
(node as? ChatMediaInputMetaSectionItemNode)?.setItem(item: self)
|
completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: node().insets), {
|
||||||
(node as? ChatMediaInputMetaSectionItemNode)?.updateTheme(theme: self.theme)
|
(node() as? ChatMediaInputMetaSectionItemNode)?.setItem(item: self)
|
||||||
})
|
(node() as? ChatMediaInputMetaSectionItemNode)?.updateTheme(theme: self.theme)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func selected(listView: ListView) {
|
func selected(listView: ListView) {
|
||||||
|
@ -32,19 +32,23 @@ final class ChatMediaInputPeerSpecificItem: ListViewItem {
|
|||||||
node.contentSize = boundingSize
|
node.contentSize = boundingSize
|
||||||
node.insets = ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)
|
node.insets = ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)
|
||||||
node.inputNodeInteraction = self.inputNodeInteraction
|
node.inputNodeInteraction = self.inputNodeInteraction
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {
|
completion(node, {
|
||||||
node.updateItem(account: self.account, peer: self.peer, collectionId: self.collectionId, theme: self.theme)
|
return (nil, {
|
||||||
node.updateAppearanceTransition(transition: .immediate)
|
node.updateItem(account: self.account, peer: self.peer, collectionId: self.collectionId, theme: self.theme)
|
||||||
|
node.updateAppearanceTransition(transition: .immediate)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
Queue.mainQueue().async {
|
||||||
(node as? ChatMediaInputPeerSpecificItemNode)?.updateItem(account: self.account, peer: self.peer, collectionId: self.collectionId, theme: self.theme)
|
completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
||||||
})
|
(node() as? ChatMediaInputPeerSpecificItemNode)?.updateItem(account: self.account, peer: self.peer, collectionId: self.collectionId, theme: self.theme)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func selected(listView: ListView) {
|
func selected(listView: ListView) {
|
||||||
|
@ -29,16 +29,20 @@ final class ChatMediaInputRecentGifsItem: ListViewItem {
|
|||||||
node.updateTheme(theme: self.theme)
|
node.updateTheme(theme: self.theme)
|
||||||
node.updateIsHighlighted()
|
node.updateIsHighlighted()
|
||||||
node.updateAppearanceTransition(transition: .immediate)
|
node.updateAppearanceTransition(transition: .immediate)
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {})
|
completion(node, {
|
||||||
})
|
return (nil, {})
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
Queue.mainQueue().async {
|
||||||
(node as? ChatMediaInputRecentGifsItemNode)?.updateTheme(theme: self.theme)
|
completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
||||||
})
|
(node() as? ChatMediaInputRecentGifsItemNode)?.updateTheme(theme: self.theme)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func selected(listView: ListView) {
|
func selected(listView: ListView) {
|
||||||
|
@ -28,16 +28,20 @@ final class ChatMediaInputSettingsItem: ListViewItem {
|
|||||||
node.inputNodeInteraction = self.inputNodeInteraction
|
node.inputNodeInteraction = self.inputNodeInteraction
|
||||||
node.updateTheme(theme: self.theme)
|
node.updateTheme(theme: self.theme)
|
||||||
node.updateAppearanceTransition(transition: .immediate)
|
node.updateAppearanceTransition(transition: .immediate)
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {})
|
completion(node, {
|
||||||
})
|
return (nil, {})
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
Queue.mainQueue().async {
|
||||||
(node as? ChatMediaInputSettingsItemNode)?.updateTheme(theme: self.theme)
|
completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
||||||
})
|
(node() as? ChatMediaInputSettingsItemNode)?.updateTheme(theme: self.theme)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func selected(listView: ListView) {
|
func selected(listView: ListView) {
|
||||||
|
@ -34,19 +34,23 @@ final class ChatMediaInputStickerPackItem: ListViewItem {
|
|||||||
node.contentSize = boundingSize
|
node.contentSize = boundingSize
|
||||||
node.insets = ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)
|
node.insets = ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)
|
||||||
node.inputNodeInteraction = self.inputNodeInteraction
|
node.inputNodeInteraction = self.inputNodeInteraction
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {
|
completion(node, {
|
||||||
node.updateStickerPackItem(account: self.account, item: self.stickerPackItem, collectionId: self.collectionId, theme: self.theme)
|
return (nil, {
|
||||||
node.updateAppearanceTransition(transition: .immediate)
|
node.updateStickerPackItem(account: self.account, item: self.stickerPackItem, collectionId: self.collectionId, theme: self.theme)
|
||||||
|
node.updateAppearanceTransition(transition: .immediate)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
Queue.mainQueue().async {
|
||||||
(node as? ChatMediaInputStickerPackItemNode)?.updateStickerPackItem(account: self.account, item: self.stickerPackItem, collectionId: self.collectionId, theme: self.theme)
|
completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
||||||
})
|
(node() as? ChatMediaInputStickerPackItemNode)?.updateStickerPackItem(account: self.account, item: self.stickerPackItem, collectionId: self.collectionId, theme: self.theme)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func selected(listView: ListView) {
|
func selected(listView: ListView) {
|
||||||
|
@ -29,16 +29,20 @@ final class ChatMediaInputTrendingItem: ListViewItem {
|
|||||||
node.updateTheme(theme: self.theme)
|
node.updateTheme(theme: self.theme)
|
||||||
node.updateIsHighlighted()
|
node.updateIsHighlighted()
|
||||||
node.updateAppearanceTransition(transition: .immediate)
|
node.updateAppearanceTransition(transition: .immediate)
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {})
|
completion(node, {
|
||||||
})
|
return (nil, {})
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
Queue.mainQueue().async {
|
||||||
(node as? ChatMediaInputTrendingItemNode)?.updateTheme(theme: self.theme)
|
completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
|
||||||
})
|
(node() as? ChatMediaInputTrendingItemNode)?.updateTheme(theme: self.theme)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func selected(listView: ListView) {
|
func selected(listView: ListView) {
|
||||||
|
@ -352,7 +352,7 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if let action = media as? TelegramMediaAction {
|
} else if let _ = media as? TelegramMediaAction {
|
||||||
viewClassName = ChatMessageBubbleItemNode.self
|
viewClassName = ChatMessageBubbleItemNode.self
|
||||||
} else if let _ = media as? TelegramMediaExpiredContent {
|
} else if let _ = media as? TelegramMediaExpiredContent {
|
||||||
viewClassName = ChatMessageBubbleItemNode.self
|
viewClassName = ChatMessageBubbleItemNode.self
|
||||||
@ -373,9 +373,11 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -417,12 +419,12 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
|
|||||||
return (mergedTop, mergedBottom, dateAtBottom)
|
return (mergedTop, mergedBottom, dateAtBottom)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ChatMessageItemView {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ChatMessageItemView {
|
||||||
node.setupItem(self)
|
nodeValue.setupItem(self)
|
||||||
|
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom, dateAtBottom) = self.mergedWithItems(top: previousItem, bottom: nextItem)
|
let (top, bottom, dateAtBottom) = self.mergedWithItems(top: previousItem, bottom: nextItem)
|
||||||
@ -431,8 +433,10 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
|
|||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
completion(layout, {
|
completion(layout, {
|
||||||
apply(animation)
|
apply(animation)
|
||||||
node.updateSelectionState(animated: false)
|
if let nodeValue = node() as? ChatMessageItemView {
|
||||||
node.updateHighlightedState(animated: false)
|
nodeValue.updateSelectionState(animated: false)
|
||||||
|
nodeValue.updateHighlightedState(animated: false)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,16 +24,18 @@ class ChatUnreadItem: ListViewItem {
|
|||||||
async {
|
async {
|
||||||
let node = ChatUnreadItemNode()
|
let node = ChatUnreadItemNode()
|
||||||
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
|
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {})
|
completion(node, {
|
||||||
})
|
return (nil, {})
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ChatUnreadItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ChatUnreadItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let dateAtBottom = !chatItemsHaveCommonDateHeader(self, nextItem)
|
let dateAtBottom = !chatItemsHaveCommonDateHeader(self, nextItem)
|
||||||
@ -45,9 +47,9 @@ class ChatUnreadItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,10 @@ public final class DeviceAccess {
|
|||||||
return self.contactsPromise.get()
|
return self.contactsPromise.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func isMicrophoneAccessAuthorized() -> Bool? {
|
||||||
|
return AVAudioSession.sharedInstance().recordPermission() == .granted
|
||||||
|
}
|
||||||
|
|
||||||
public static func authorizeAccess(to subject: DeviceAccessSubject, presentationData: PresentationData, present: @escaping (ViewController, Any?) -> Void, openSettings: @escaping () -> Void, displayNotificatoinFromBackground: @escaping (String) -> Void = { _ in }, _ completion: @escaping (Bool) -> Void) {
|
public static func authorizeAccess(to subject: DeviceAccessSubject, presentationData: PresentationData, present: @escaping (ViewController, Any?) -> Void, openSettings: @escaping () -> Void, displayNotificatoinFromBackground: @escaping (String) -> Void = { _ in }, _ completion: @escaping (Bool) -> Void) {
|
||||||
switch subject {
|
switch subject {
|
||||||
case .camera:
|
case .camera:
|
||||||
|
@ -31,9 +31,11 @@ final class CommandChatInputPanelItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -44,10 +46,10 @@ final class CommandChatInputPanelItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? CommandChatInputPanelItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? CommandChatInputPanelItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
||||||
@ -59,9 +61,9 @@ final class CommandChatInputPanelItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,16 +24,18 @@ class ContactListActionItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ContactListActionItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ContactListActionItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params)
|
let (layout, apply) = makeLayout(self, params)
|
||||||
|
@ -207,19 +207,21 @@ class ContactsPeerItem: ListViewItem {
|
|||||||
node.contentSize = nodeLayout.contentSize
|
node.contentSize = nodeLayout.contentSize
|
||||||
node.insets = nodeLayout.insets
|
node.insets = nodeLayout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
let (signal, apply) = nodeApply()
|
completion(node, {
|
||||||
return (signal, {
|
let (signal, apply) = nodeApply()
|
||||||
apply(false)
|
return (signal, {
|
||||||
|
apply(false)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ContactsPeerItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ContactsPeerItemNode {
|
||||||
let layout = node.asyncLayout()
|
let layout = nodeValue.asyncLayout()
|
||||||
async {
|
async {
|
||||||
let (first, last, firstWithHeader) = ContactsPeerItem.mergeType(item: self, previousItem: previousItem, nextItem: nextItem)
|
let (first, last, firstWithHeader) = ContactsPeerItem.mergeType(item: self, previousItem: previousItem, nextItem: nextItem)
|
||||||
let (nodeLayout, apply) = layout(self, params, first, last, firstWithHeader)
|
let (nodeLayout, apply) = layout(self, params, first, last, firstWithHeader)
|
||||||
|
@ -31,9 +31,11 @@ final class EmojisChatInputPanelItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -44,10 +46,10 @@ final class EmojisChatInputPanelItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? EmojisChatInputPanelItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? EmojisChatInputPanelItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
||||||
@ -59,9 +61,9 @@ final class EmojisChatInputPanelItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,10 +95,11 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa
|
|||||||
} else {
|
} else {
|
||||||
let data = postbox.mediaBox.resourceData(resourceReference.resource, pathExtension: nil, option: .complete(waitUntilFetchStatus: false))
|
let data = postbox.mediaBox.resourceData(resourceReference.resource, pathExtension: nil, option: .complete(waitUntilFetchStatus: false))
|
||||||
let semaphore = DispatchSemaphore(value: 0)
|
let semaphore = DispatchSemaphore(value: 0)
|
||||||
|
let readingOffset = context.readingOffset
|
||||||
let disposable = data.start(next: { next in
|
let disposable = data.start(next: { next in
|
||||||
if next.complete {
|
if next.complete {
|
||||||
let readCount = max(0, min(next.size - context.readingOffset, Int(bufferSize)))
|
let readCount = max(0, min(next.size - readingOffset, Int(bufferSize)))
|
||||||
let range = context.readingOffset ..< (context.readingOffset + readCount)
|
let range = readingOffset ..< (readingOffset + readCount)
|
||||||
|
|
||||||
let fd = open(next.path, O_RDONLY, S_IRUSR)
|
let fd = open(next.path, O_RDONLY, S_IRUSR)
|
||||||
if fd >= 0 {
|
if fd >= 0 {
|
||||||
|
@ -249,7 +249,7 @@ final class GalleryThumbnailContainerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
|
|
||||||
if scrollView.isDragging || scrollView.isDecelerating {
|
if scrollView.isDragging || scrollView.isDecelerating {
|
||||||
let position = scrollView.contentInset.left + scrollView.contentOffset.x
|
let position = scrollView.contentInset.left + scrollView.contentOffset.x
|
||||||
let index = max(0, min(self.items.count, Int(round(position / (itemBaseSize.width + spacing)))))
|
let index = max(0, min(self.items.count - 1, Int(round(position / (itemBaseSize.width + spacing)))))
|
||||||
|
|
||||||
if let (currentCentralIndex, _) = self.centralIndexAndProgress, currentCentralIndex != index {
|
if let (currentCentralIndex, _) = self.centralIndexAndProgress, currentCentralIndex != index {
|
||||||
self.centralIndexAndProgress = (index, nil)
|
self.centralIndexAndProgress = (index, nil)
|
||||||
|
@ -36,16 +36,18 @@ final class GroupStickerPackCurrentItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(false) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(false) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? GroupStickerPackCurrentItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? GroupStickerPackCurrentItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
var animated = true
|
var animated = true
|
||||||
if case .None = animation {
|
if case .None = animation {
|
||||||
|
@ -29,9 +29,11 @@ final class HashtagChatInputPanelItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -42,10 +44,10 @@ final class HashtagChatInputPanelItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? HashtagChatInputPanelItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? HashtagChatInputPanelItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
||||||
@ -57,9 +59,9 @@ final class HashtagChatInputPanelItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,9 +30,11 @@ final class HorizontalListContextResultsChatInputPanelItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -43,10 +45,10 @@ final class HorizontalListContextResultsChatInputPanelItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? HorizontalListContextResultsChatInputPanelItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? HorizontalListContextResultsChatInputPanelItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
||||||
@ -58,9 +60,9 @@ final class HorizontalListContextResultsChatInputPanelItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,19 +45,21 @@ final class HorizontalPeerItem: ListViewItem {
|
|||||||
node.insets = nodeLayout.insets
|
node.insets = nodeLayout.insets
|
||||||
node.contentSize = nodeLayout.contentSize
|
node.contentSize = nodeLayout.contentSize
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, {
|
completion(node, {
|
||||||
apply(false)
|
return (nil, {
|
||||||
|
apply(false)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
assert(node is HorizontalPeerItemNode)
|
Queue.mainQueue().async {
|
||||||
if let node = node as? HorizontalPeerItemNode {
|
assert(node() is HorizontalPeerItemNode)
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? HorizontalPeerItemNode {
|
||||||
let layout = node.asyncLayout()
|
let layout = nodeValue.asyncLayout()
|
||||||
async {
|
async {
|
||||||
let (nodeLayout, apply) = layout(self, params)
|
let (nodeLayout, apply) = layout(self, params)
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
|
@ -44,16 +44,18 @@ class ItemListActionItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListActionItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListActionItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -26,20 +26,22 @@ class ItemListActivityTextItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
guard let node = node as? ItemListActivityTextItemNode else {
|
|
||||||
assertionFailure()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
let makeLayout = node.asyncLayout()
|
guard let nodeValue = node() as? ItemListActivityTextItemNode else {
|
||||||
|
assertionFailure()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -210,14 +210,14 @@ class ItemListAvatarAndNameInfoItem: ListViewItem, ItemListItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListAvatarAndNameInfoItemNode {
|
Queue.mainQueue().async {
|
||||||
var animated = true
|
if let nodeValue = node() as? ItemListAvatarAndNameInfoItemNode {
|
||||||
if case .None = animation {
|
var animated = true
|
||||||
animated = false
|
if case .None = animation {
|
||||||
}
|
animated = false
|
||||||
Queue.mainQueue().async {
|
}
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -42,16 +42,18 @@ class ItemListCheckboxItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListCheckboxItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListCheckboxItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -166,6 +166,7 @@ class ItemListControllerNode<Entry: ItemListNodeEntry>: ViewControllerTracingNod
|
|||||||
reorderEntry(fromIndex, toIndex, mergedEntries)
|
reorderEntry(fromIndex, toIndex, mergedEntries)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return .single(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.listNode.visibleBottomContentOffsetChanged = { [weak self] offset in
|
self.listNode.visibleBottomContentOffsetChanged = { [weak self] offset in
|
||||||
|
@ -59,16 +59,18 @@ class ItemListDisclosureItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListDisclosureItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListDisclosureItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -34,16 +34,18 @@ class ItemListMultilineInputItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListMultilineInputItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListMultilineInputItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -50,16 +50,18 @@ class ItemListMultilineTextItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListMultilineTextItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListMultilineTextItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -28,16 +28,18 @@ class ItemListPeerActionItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(false) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(false) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListPeerActionItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListPeerActionItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
var animated = true
|
var animated = true
|
||||||
if case .None = animation {
|
if case .None = animation {
|
||||||
|
@ -108,16 +108,18 @@ final class ItemListPeerItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (node.avatarNode.ready, { apply(false) })
|
completion(node, {
|
||||||
})
|
return (node.avatarNode.ready, { apply(false) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListPeerItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListPeerItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
var animated = true
|
var animated = true
|
||||||
if case .None = animation {
|
if case .None = animation {
|
||||||
|
@ -63,16 +63,18 @@ final class ItemListRecentSessionItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(false) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(false) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListRecentSessionItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListRecentSessionItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
var animated = true
|
var animated = true
|
||||||
if case .None = animation {
|
if case .None = animation {
|
||||||
|
@ -33,16 +33,18 @@ class ItemListSecretChatKeyItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListSecretChatKeyItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListSecretChatKeyItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -24,20 +24,22 @@ class ItemListSectionHeaderItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
guard let node = node as? ItemListSectionHeaderItemNode else {
|
|
||||||
assertionFailure()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
let makeLayout = node.asyncLayout()
|
guard let nodeValue = node() as? ItemListSectionHeaderItemNode else {
|
||||||
|
assertionFailure()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -48,16 +48,19 @@ class ItemListSingleLineInputItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListSingleLineInputItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListSingleLineInputItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
|
||||||
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -77,16 +77,18 @@ final class ItemListStickerPackItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(false) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(false) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListStickerPackItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListStickerPackItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
var animated = true
|
var animated = true
|
||||||
if case .None = animation {
|
if case .None = animation {
|
||||||
|
@ -39,16 +39,18 @@ class ItemListSwitchItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(false) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(false) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListSwitchItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListSwitchItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -36,20 +36,22 @@ class ItemListTextItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
guard let node = node as? ItemListTextItemNode else {
|
|
||||||
assertionFailure()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
let makeLayout = node.asyncLayout()
|
guard let nodeValue = node() as? ItemListTextItemNode else {
|
||||||
|
assertionFailure()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -49,16 +49,18 @@ final class ItemListTextWithLabelItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListTextWithLabelItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListTextWithLabelItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -53,16 +53,18 @@ final class ItemListWebsiteItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(false) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(false) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ItemListWebsiteItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ItemListWebsiteItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
var animated = true
|
var animated = true
|
||||||
if case .None = animation {
|
if case .None = animation {
|
||||||
|
@ -22,9 +22,11 @@ final class ListMessageHoleItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -35,15 +37,15 @@ final class ListMessageHoleItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ListMessageHoleItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ListMessageHoleItemNode {
|
||||||
node.updateSelectionState(animated: false)
|
nodeValue.updateSelectionState(animated: false)
|
||||||
|
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom, dateAtBottom) = (false, false, false) //self.mergedWithItems(top: previousItem, bottom: nextItem)
|
let (top, bottom, dateAtBottom) = (false, false, false)
|
||||||
|
|
||||||
let (layout, apply) = nodeLayout(self, params, top, bottom, dateAtBottom)
|
let (layout, apply) = nodeLayout(self, params, top, bottom, dateAtBottom)
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
@ -52,9 +54,9 @@ final class ListMessageHoleItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,9 +57,11 @@ final class ListMessageItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -70,14 +72,14 @@ final class ListMessageItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ListMessageNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ListMessageNode {
|
||||||
node.setupItem(self)
|
nodeValue.setupItem(self)
|
||||||
|
|
||||||
node.updateSelectionState(animated: false)
|
nodeValue.updateSelectionState(animated: false)
|
||||||
|
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom, dateAtBottom) = (previousItem != nil, nextItem != nil, self.getDateAtBottom(top: previousItem, bottom: nextItem))
|
let (top, bottom, dateAtBottom) = (previousItem != nil, nextItem != nil, self.getDateAtBottom(top: previousItem, bottom: nextItem))
|
||||||
@ -89,9 +91,9 @@ final class ListMessageItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,16 +34,18 @@ class MediaInputPaneTrendingItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? MediaInputPaneTrendingItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? MediaInputPaneTrendingItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params)
|
let (layout, apply) = makeLayout(self, params)
|
||||||
|
@ -33,9 +33,11 @@ final class MentionChatInputPanelItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -46,10 +48,10 @@ final class MentionChatInputPanelItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? MentionChatInputPanelItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? MentionChatInputPanelItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
||||||
@ -61,9 +63,9 @@ final class MentionChatInputPanelItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,53 +13,6 @@ public enum PresentationCallState: Equatable {
|
|||||||
case active(Double, Data)
|
case active(Double, Data)
|
||||||
case terminating
|
case terminating
|
||||||
case terminated(CallSessionTerminationReason?)
|
case terminated(CallSessionTerminationReason?)
|
||||||
|
|
||||||
public static func ==(lhs: PresentationCallState, rhs: PresentationCallState) -> Bool {
|
|
||||||
switch lhs {
|
|
||||||
case .waiting:
|
|
||||||
if case .waiting = rhs {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
case .ringing:
|
|
||||||
if case .ringing = rhs {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
case let .requesting(ringing):
|
|
||||||
if case .requesting(ringing) = rhs {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
case .connecting:
|
|
||||||
if case .connecting = rhs {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
case let .active(timestamp, keyVisualHash):
|
|
||||||
if case .active(timestamp, keyVisualHash) = rhs {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
case .terminating:
|
|
||||||
if case .terminating = rhs {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
case let .terminated(lhsReason):
|
|
||||||
if case let .terminated(rhsReason) = rhs, lhsReason == rhsReason {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class PresentationCallToneRenderer {
|
private final class PresentationCallToneRenderer {
|
||||||
@ -177,6 +130,10 @@ public final class PresentationCall {
|
|||||||
private let audioSession: ManagedAudioSession
|
private let audioSession: ManagedAudioSession
|
||||||
private let callSessionManager: CallSessionManager
|
private let callSessionManager: CallSessionManager
|
||||||
private let callKitIntegration: CallKitIntegration?
|
private let callKitIntegration: CallKitIntegration?
|
||||||
|
public var isIntegratedWithCallKit: Bool {
|
||||||
|
return self.callKitIntegration != nil
|
||||||
|
}
|
||||||
|
|
||||||
private let getDeviceAccessData: () -> (presentationData: PresentationData, present: (ViewController, Any?) -> Void, openSettings: () -> Void)
|
private let getDeviceAccessData: () -> (presentationData: PresentationData, present: (ViewController, Any?) -> Void, openSettings: () -> Void)
|
||||||
|
|
||||||
public let internalId: CallSessionInternalId
|
public let internalId: CallSessionInternalId
|
||||||
|
@ -112,10 +112,17 @@ public final class PresentationCallManager {
|
|||||||
}
|
}
|
||||||
|> distinctUntilChanged
|
|> distinctUntilChanged
|
||||||
|
|
||||||
self.ringingStatesDisposable = (combineLatest(callSessionManager.ringingStates(), enableCallKit)
|
let enabledMicrophoneAccess = Signal<Bool, NoError> { subscriber in
|
||||||
|> mapToSignal { ringingStates, enableCallKit -> Signal<([(Peer, CallSessionRingingState, Bool)], Bool), NoError> in
|
subscriber.putNext(DeviceAccess.isMicrophoneAccessAuthorized() == true)
|
||||||
|
subscriber.putCompletion()
|
||||||
|
return EmptyDisposable
|
||||||
|
}
|
||||||
|
|> runOn(Queue.mainQueue())
|
||||||
|
|
||||||
|
self.ringingStatesDisposable = (combineLatest(callSessionManager.ringingStates(), enableCallKit, enabledMicrophoneAccess)
|
||||||
|
|> mapToSignal { ringingStates, enableCallKit, enabledMicrophoneAccess -> Signal<([(Peer, CallSessionRingingState, Bool)], Bool), NoError> in
|
||||||
if ringingStates.isEmpty {
|
if ringingStates.isEmpty {
|
||||||
return .single(([], enableCallKit))
|
return .single(([], enableCallKit && enabledMicrophoneAccess))
|
||||||
} else {
|
} else {
|
||||||
return postbox.transaction { transaction -> ([(Peer, CallSessionRingingState, Bool)], Bool) in
|
return postbox.transaction { transaction -> ([(Peer, CallSessionRingingState, Bool)], Bool) in
|
||||||
var result: [(Peer, CallSessionRingingState, Bool)] = []
|
var result: [(Peer, CallSessionRingingState, Bool)] = []
|
||||||
@ -124,7 +131,7 @@ public final class PresentationCallManager {
|
|||||||
result.append((peer, state, transaction.isPeerContact(peerId: state.peerId)))
|
result.append((peer, state, transaction.isPeerContact(peerId: state.peerId)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (result, enableCallKit)
|
return (result, enableCallKit && enabledMicrophoneAccess)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -26,16 +26,18 @@ class ProxySettingsActionItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(false) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(false) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ProxySettingsActionItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ProxySettingsActionItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
var animated = true
|
var animated = true
|
||||||
if case .None = animation {
|
if case .None = animation {
|
||||||
|
@ -54,16 +54,18 @@ final class ProxySettingsServerItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(false) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(false) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ProxySettingsServerItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ProxySettingsServerItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
var animated = true
|
var animated = true
|
||||||
if case .None = animation {
|
if case .None = animation {
|
||||||
|
@ -27,16 +27,18 @@ class ThemeSettingsBrightnessItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ThemeSettingsBrightnessItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ThemeSettingsBrightnessItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -34,16 +34,18 @@ class ThemeSettingsChatPreviewItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ThemeSettingsChatPreviewItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ThemeSettingsChatPreviewItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
@ -155,7 +157,7 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode {
|
|||||||
var node1: ListViewItemNode?
|
var node1: ListViewItemNode?
|
||||||
if let current = currentNode1 {
|
if let current = currentNode1 {
|
||||||
node1 = current
|
node1 = current
|
||||||
item1.updateNode(async: { $0() }, node: current, params: params, previousItem: nil, nextItem: nil, animation: .None, completion: { (layout, apply) in
|
item1.updateNode(async: { $0() }, node: { return current }, params: params, previousItem: nil, nextItem: nil, animation: .None, completion: { (layout, apply) in
|
||||||
let nodeFrame = CGRect(origin: current.frame.origin, size: CGSize(width: layout.size.width, height: layout.size.height))
|
let nodeFrame = CGRect(origin: current.frame.origin, size: CGSize(width: layout.size.width, height: layout.size.height))
|
||||||
|
|
||||||
current.contentSize = layout.contentSize
|
current.contentSize = layout.contentSize
|
||||||
@ -174,7 +176,7 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode {
|
|||||||
var node2: ListViewItemNode?
|
var node2: ListViewItemNode?
|
||||||
if let current = currentNode2 {
|
if let current = currentNode2 {
|
||||||
node2 = current
|
node2 = current
|
||||||
item2.updateNode(async: { $0() }, node: current, params: params, previousItem: nil, nextItem: nil, animation: .None, completion: { (layout, apply) in
|
item2.updateNode(async: { $0() }, node: { return current }, params: params, previousItem: nil, nextItem: nil, animation: .None, completion: { (layout, apply) in
|
||||||
let nodeFrame = CGRect(origin: current.frame.origin, size: CGSize(width: layout.size.width, height: layout.size.height))
|
let nodeFrame = CGRect(origin: current.frame.origin, size: CGSize(width: layout.size.width, height: layout.size.height))
|
||||||
|
|
||||||
current.contentSize = layout.contentSize
|
current.contentSize = layout.contentSize
|
||||||
|
@ -27,16 +27,18 @@ class ThemeSettingsFontSizeItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? ThemeSettingsFontSizeItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? ThemeSettingsFontSizeItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -24,16 +24,18 @@ class UserInfoEditingPhoneActionItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? UserInfoEditingPhoneActionItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? UserInfoEditingPhoneActionItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -45,16 +45,18 @@ class UserInfoEditingPhoneItem: ListViewItem, ItemListItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply() })
|
completion(node, {
|
||||||
})
|
return (nil, { apply() })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? UserInfoEditingPhoneItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? UserInfoEditingPhoneItemNode {
|
||||||
let makeLayout = node.asyncLayout()
|
let makeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))
|
||||||
|
@ -27,9 +27,11 @@ final class VerticalListContextResultsChatInputPanelButtonItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -40,10 +42,10 @@ final class VerticalListContextResultsChatInputPanelButtonItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? VerticalListContextResultsChatInputPanelButtonItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? VerticalListContextResultsChatInputPanelButtonItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
||||||
@ -55,9 +57,9 @@ final class VerticalListContextResultsChatInputPanelButtonItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,9 +31,11 @@ final class VerticalListContextResultsChatInputPanelItem: ListViewItem {
|
|||||||
node.contentSize = layout.contentSize
|
node.contentSize = layout.contentSize
|
||||||
node.insets = layout.insets
|
node.insets = layout.insets
|
||||||
|
|
||||||
completion(node, {
|
Queue.mainQueue().async {
|
||||||
return (nil, { apply(.None) })
|
completion(node, {
|
||||||
})
|
return (nil, { apply(.None) })
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
async {
|
async {
|
||||||
@ -44,10 +46,10 @@ final class VerticalListContextResultsChatInputPanelItem: ListViewItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
|
||||||
if let node = node as? VerticalListContextResultsChatInputPanelItemNode {
|
Queue.mainQueue().async {
|
||||||
Queue.mainQueue().async {
|
if let nodeValue = node() as? VerticalListContextResultsChatInputPanelItemNode {
|
||||||
let nodeLayout = node.asyncLayout()
|
let nodeLayout = nodeValue.asyncLayout()
|
||||||
|
|
||||||
async {
|
async {
|
||||||
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
let (top, bottom) = (previousItem != nil, nextItem != nil)
|
||||||
@ -59,9 +61,9 @@ final class VerticalListContextResultsChatInputPanelItem: ListViewItem {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
assertionFailure()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assertionFailure()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user