no message

This commit is contained in:
Peter 2018-09-17 19:16:39 +01:00
parent e2fc5ace75
commit dd4ed9c23d
68 changed files with 2731 additions and 2626 deletions

View File

@ -26,7 +26,8 @@ func authorizationNextOptionText(_ type: AuthorizationCodeNextType?, timeout: In
if timeout <= 0 {
return (NSAttributedString(string: strings.Login_CodeSentSms, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false)
} 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:
if timeout <= 0 {

View File

@ -49,16 +49,18 @@ class AutodownloadSizeLimitItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? AutodownloadSizeLimitItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? AutodownloadSizeLimitItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -27,16 +27,18 @@ class BotCheckoutHeaderItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? BotCheckoutHeaderItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? BotCheckoutHeaderItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -28,16 +28,18 @@ class BotCheckoutPriceItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? BotCheckoutPriceItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? BotCheckoutPriceItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -24,16 +24,18 @@ class CalculatingCacheSizeItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? CalculatingCacheSizeItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? CalculatingCacheSizeItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -99,18 +99,20 @@ class CallListCallItem: ListViewItem {
node.contentSize = nodeLayout.contentSize
node.insets = nodeLayout.insets
completion(node, {
return (nil, {
nodeApply().1(false)
Queue.mainQueue().async {
completion(node, {
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) {
if let node = node as? CallListCallItemNode {
Queue.mainQueue().async {
let layout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? CallListCallItemNode {
let layout = nodeValue.asyncLayout()
async {
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))

View File

@ -33,9 +33,11 @@ final class ChatBotInfoItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? ChatBotInfoItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ChatBotInfoItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = nodeLayout(self, params)

View File

@ -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) {
if let node = node as? ChatEmptyItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ChatEmptyItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = nodeLayout(self, params)

View File

@ -24,15 +24,19 @@ class ChatHoleItem: ListViewItem {
async {
let node = ChatHoleItemNode()
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
completion(node, {
return (nil, {})
})
Queue.mainQueue().async {
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) {
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: node.insets), {
})
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: node().insets), {
})
}
}
}

View File

@ -22,26 +22,31 @@ class ChatListHoleItem: ListViewItem {
node.relativePosition = (first: previousItem == nil, last: nextItem == nil)
node.insets = ChatListItemNode.insets(first: false, last: false, firstWithHeader: false)
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
completion(node, {
return (nil, {})
})
Queue.mainQueue().async {
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) {
assert(node is ChatListHoleItemNode)
if let node = node as? ChatListHoleItemNode {
Queue.mainQueue().async {
let layout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
assert(node() is ChatListHoleItemNode)
if let nodeValue = node() as? ChatListHoleItemNode {
let layout = nodeValue.asyncLayout()
async {
let first = previousItem == nil
let last = nextItem == nil
let (nodeLayout, apply) = layout(self, params, first, last)
Queue.mainQueue().async {
completion(nodeLayout, { [weak node] in
completion(nodeLayout, {
apply()
node?.updateBackgroundAndSeparatorsLayout()
if let nodeValue = node() as? ChatListHoleItemNode {
nodeValue.updateBackgroundAndSeparatorsLayout()
}
})
}
}

View File

@ -60,21 +60,23 @@ class ChatListItem: ListViewItem {
node.insets = nodeLayout.insets
node.contentSize = nodeLayout.contentSize
completion(node, {
return (nil, {
apply(false)
node.updateIsHighlighted(transition: .immediate)
Queue.mainQueue().async {
completion(node, {
return (nil, {
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) {
assert(node is ChatListItemNode)
if let node = node as? ChatListItemNode {
Queue.mainQueue().async {
node.setupItem(item: self)
let layout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
assert(node() is ChatListItemNode)
if let nodeValue = node() as? ChatListItemNode {
nodeValue.setupItem(item: self)
let layout = nodeValue.asyncLayout()
async {
let (first, last, firstWithHeader, nextIsPinned) = ChatListItem.mergeType(item: self, previousItem: previousItem, nextItem: nextItem)
var animated = true

View File

@ -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 fromIndex >= 0 && fromIndex < filteredEntries.count && toIndex >= 0 && toIndex < filteredEntries.count {
let fromEntry = filteredEntries[filteredEntries.count - 1 - fromIndex]
@ -670,7 +670,7 @@ final class ChatListNode: ListView {
}
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 itemId: PinnedItemId?
@ -706,13 +706,15 @@ final class ChatListNode: ListView {
} else {
itemIds.append(itemId)
}
reorderPinnedItemIds(transaction: transaction, itemIds: itemIds)
//transaction.setPinnedItemIds(itemIds)
return reorderPinnedItemIds(transaction: transaction, itemIds: itemIds)
} else {
return false
}
}).start()
}
}
}
}
return .single(false)
}
self.didEndScrolling = { [weak self] in
guard let strongSelf = self else {

View File

@ -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) {
if let node = node as? ChatListRecentPeersListItemNode {
Queue.mainQueue().async {
let layout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ChatListRecentPeersListItemNode {
let layout = nodeValue.asyncLayout()
async {
let (nodeLayout, apply) = layout(self, params, nextItem != nil)
Queue.mainQueue().async {

View File

@ -36,18 +36,20 @@ class ChatListSearchItem: ListViewItem {
node.insets = layout.insets
node.activate = self.activate
completion(node, {
return (nil, {
apply(false)
Queue.mainQueue().async {
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) {
if let node = node as? ChatListSearchItemNode {
Queue.mainQueue().async {
let layout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ChatListSearchItemNode {
let layout = nodeValue.asyncLayout()
async {
var nextIsPinned = false
if let nextItem = nextItem as? ChatListItem, nextItem.index.pinningIndex != nil {

View File

@ -37,19 +37,23 @@ final class ChatMediaInputMetaSectionItem: ListViewItem {
node.updateTheme(theme: self.theme)
node.updateIsHighlighted()
node.updateAppearanceTransition(transition: .immediate)
completion(node, {
return (nil, {
Queue.mainQueue().async {
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) {
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: node.insets), {
(node as? ChatMediaInputMetaSectionItemNode)?.setItem(item: self)
(node as? ChatMediaInputMetaSectionItemNode)?.updateTheme(theme: self.theme)
})
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) {
Queue.mainQueue().async {
completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: node().insets), {
(node() as? ChatMediaInputMetaSectionItemNode)?.setItem(item: self)
(node() as? ChatMediaInputMetaSectionItemNode)?.updateTheme(theme: self.theme)
})
}
}
func selected(listView: ListView) {

View File

@ -32,19 +32,23 @@ final class ChatMediaInputPeerSpecificItem: ListViewItem {
node.contentSize = boundingSize
node.insets = ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)
node.inputNodeInteraction = self.inputNodeInteraction
completion(node, {
return (nil, {
node.updateItem(account: self.account, peer: self.peer, collectionId: self.collectionId, theme: self.theme)
node.updateAppearanceTransition(transition: .immediate)
Queue.mainQueue().async {
completion(node, {
return (nil, {
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) {
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)
})
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) {
Queue.mainQueue().async {
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) {

View File

@ -29,16 +29,20 @@ final class ChatMediaInputRecentGifsItem: ListViewItem {
node.updateTheme(theme: self.theme)
node.updateIsHighlighted()
node.updateAppearanceTransition(transition: .immediate)
completion(node, {
return (nil, {})
})
Queue.mainQueue().async {
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) {
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
(node as? ChatMediaInputRecentGifsItemNode)?.updateTheme(theme: self.theme)
})
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) {
Queue.mainQueue().async {
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) {

View File

@ -28,16 +28,20 @@ final class ChatMediaInputSettingsItem: ListViewItem {
node.inputNodeInteraction = self.inputNodeInteraction
node.updateTheme(theme: self.theme)
node.updateAppearanceTransition(transition: .immediate)
completion(node, {
return (nil, {})
})
Queue.mainQueue().async {
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) {
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
(node as? ChatMediaInputSettingsItemNode)?.updateTheme(theme: self.theme)
})
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) {
Queue.mainQueue().async {
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) {

View File

@ -34,19 +34,23 @@ final class ChatMediaInputStickerPackItem: ListViewItem {
node.contentSize = boundingSize
node.insets = ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)
node.inputNodeInteraction = self.inputNodeInteraction
completion(node, {
return (nil, {
node.updateStickerPackItem(account: self.account, item: self.stickerPackItem, collectionId: self.collectionId, theme: self.theme)
node.updateAppearanceTransition(transition: .immediate)
Queue.mainQueue().async {
completion(node, {
return (nil, {
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) {
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)
})
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) {
Queue.mainQueue().async {
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) {

View File

@ -29,16 +29,20 @@ final class ChatMediaInputTrendingItem: ListViewItem {
node.updateTheme(theme: self.theme)
node.updateIsHighlighted()
node.updateAppearanceTransition(transition: .immediate)
completion(node, {
return (nil, {})
})
Queue.mainQueue().async {
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) {
completion(ListViewItemNodeLayout(contentSize: node.contentSize, insets: ChatMediaInputNode.setupPanelIconInsets(item: self, previousItem: previousItem, nextItem: nextItem)), {
(node as? ChatMediaInputTrendingItemNode)?.updateTheme(theme: self.theme)
})
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) {
Queue.mainQueue().async {
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) {

View File

@ -352,7 +352,7 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
break
}
}
} else if let action = media as? TelegramMediaAction {
} else if let _ = media as? TelegramMediaAction {
viewClassName = ChatMessageBubbleItemNode.self
} else if let _ = media as? TelegramMediaExpiredContent {
viewClassName = ChatMessageBubbleItemNode.self
@ -373,9 +373,11 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
async {
@ -417,12 +419,12 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
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) {
if let node = node as? ChatMessageItemView {
Queue.mainQueue().async {
node.setupItem(self)
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? ChatMessageItemView {
nodeValue.setupItem(self)
let nodeLayout = node.asyncLayout()
let nodeLayout = nodeValue.asyncLayout()
async {
let (top, bottom, dateAtBottom) = self.mergedWithItems(top: previousItem, bottom: nextItem)
@ -431,8 +433,10 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
Queue.mainQueue().async {
completion(layout, {
apply(animation)
node.updateSelectionState(animated: false)
node.updateHighlightedState(animated: false)
if let nodeValue = node() as? ChatMessageItemView {
nodeValue.updateSelectionState(animated: false)
nodeValue.updateHighlightedState(animated: false)
}
})
}
}

View File

@ -24,16 +24,18 @@ class ChatUnreadItem: ListViewItem {
async {
let node = ChatUnreadItemNode()
node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem)
completion(node, {
return (nil, {})
})
Queue.mainQueue().async {
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) {
if let node = node as? ChatUnreadItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? ChatUnreadItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let dateAtBottom = !chatItemsHaveCommonDateHeader(self, nextItem)
@ -45,9 +47,9 @@ class ChatUnreadItem: ListViewItem {
})
}
}
} else {
assertionFailure()
}
} else {
assertionFailure()
}
}
}

View File

@ -49,6 +49,10 @@ public final class DeviceAccess {
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) {
switch subject {
case .camera:

View File

@ -31,9 +31,11 @@ final class CommandChatInputPanelItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? CommandChatInputPanelItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? CommandChatInputPanelItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let (top, bottom) = (previousItem != nil, nextItem != nil)
@ -59,9 +61,9 @@ final class CommandChatInputPanelItem: ListViewItem {
})
}
}
} else {
assertionFailure()
}
} else {
assertionFailure()
}
}

View File

@ -24,16 +24,18 @@ class ContactListActionItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ContactListActionItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ContactListActionItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params)

View File

@ -207,19 +207,21 @@ class ContactsPeerItem: ListViewItem {
node.contentSize = nodeLayout.contentSize
node.insets = nodeLayout.insets
completion(node, {
let (signal, apply) = nodeApply()
return (signal, {
apply(false)
Queue.mainQueue().async {
completion(node, {
let (signal, apply) = nodeApply()
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) {
if let node = node as? ContactsPeerItemNode {
Queue.mainQueue().async {
let layout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ContactsPeerItemNode {
let layout = nodeValue.asyncLayout()
async {
let (first, last, firstWithHeader) = ContactsPeerItem.mergeType(item: self, previousItem: previousItem, nextItem: nextItem)
let (nodeLayout, apply) = layout(self, params, first, last, firstWithHeader)

View File

@ -31,9 +31,11 @@ final class EmojisChatInputPanelItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? EmojisChatInputPanelItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? EmojisChatInputPanelItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let (top, bottom) = (previousItem != nil, nextItem != nil)
@ -59,9 +61,9 @@ final class EmojisChatInputPanelItem: ListViewItem {
})
}
}
} else {
assertionFailure()
}
} else {
assertionFailure()
}
}

View File

@ -95,10 +95,11 @@ private func readPacketCallback(userData: UnsafeMutableRawPointer?, buffer: Unsa
} else {
let data = postbox.mediaBox.resourceData(resourceReference.resource, pathExtension: nil, option: .complete(waitUntilFetchStatus: false))
let semaphore = DispatchSemaphore(value: 0)
let readingOffset = context.readingOffset
let disposable = data.start(next: { next in
if next.complete {
let readCount = max(0, min(next.size - context.readingOffset, Int(bufferSize)))
let range = context.readingOffset ..< (context.readingOffset + readCount)
let readCount = max(0, min(next.size - readingOffset, Int(bufferSize)))
let range = readingOffset ..< (readingOffset + readCount)
let fd = open(next.path, O_RDONLY, S_IRUSR)
if fd >= 0 {

View File

@ -249,7 +249,7 @@ final class GalleryThumbnailContainerNode: ASDisplayNode, UIScrollViewDelegate {
if scrollView.isDragging || scrollView.isDecelerating {
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 {
self.centralIndexAndProgress = (index, nil)

View File

@ -36,16 +36,18 @@ final class GroupStickerPackCurrentItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(false) })
})
Queue.mainQueue().async {
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) {
if let node = node as? GroupStickerPackCurrentItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? GroupStickerPackCurrentItemNode {
let makeLayout = nodeValue.asyncLayout()
var animated = true
if case .None = animation {

View File

@ -29,9 +29,11 @@ final class HashtagChatInputPanelItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? HashtagChatInputPanelItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? HashtagChatInputPanelItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let (top, bottom) = (previousItem != nil, nextItem != nil)
@ -57,9 +59,9 @@ final class HashtagChatInputPanelItem: ListViewItem {
})
}
}
} else {
assertionFailure()
}
} else {
assertionFailure()
}
}

View File

@ -30,9 +30,11 @@ final class HorizontalListContextResultsChatInputPanelItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? HorizontalListContextResultsChatInputPanelItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? HorizontalListContextResultsChatInputPanelItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let (top, bottom) = (previousItem != nil, nextItem != nil)
@ -58,9 +60,9 @@ final class HorizontalListContextResultsChatInputPanelItem: ListViewItem {
})
}
}
} else {
assertionFailure()
}
} else {
assertionFailure()
}
}

View File

@ -45,19 +45,21 @@ final class HorizontalPeerItem: ListViewItem {
node.insets = nodeLayout.insets
node.contentSize = nodeLayout.contentSize
completion(node, {
return (nil, {
apply(false)
Queue.mainQueue().async {
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) {
assert(node is HorizontalPeerItemNode)
if let node = node as? HorizontalPeerItemNode {
Queue.mainQueue().async {
let layout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
assert(node() is HorizontalPeerItemNode)
if let nodeValue = node() as? HorizontalPeerItemNode {
let layout = nodeValue.asyncLayout()
async {
let (nodeLayout, apply) = layout(self, params)
Queue.mainQueue().async {

View File

@ -44,16 +44,18 @@ class ItemListActionItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListActionItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListActionItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -26,20 +26,22 @@ class ItemListActivityTextItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
guard let node = node as? ItemListActivityTextItemNode else {
assertionFailure()
return
}
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
guard let nodeValue = node() as? ItemListActivityTextItemNode else {
assertionFailure()
return
}
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -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) {
if let node = node as? ItemListAvatarAndNameInfoItemNode {
var animated = true
if case .None = animation {
animated = false
}
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListAvatarAndNameInfoItemNode {
var animated = true
if case .None = animation {
animated = false
}
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -42,16 +42,18 @@ class ItemListCheckboxItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListCheckboxItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListCheckboxItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -166,6 +166,7 @@ class ItemListControllerNode<Entry: ItemListNodeEntry>: ViewControllerTracingNod
reorderEntry(fromIndex, toIndex, mergedEntries)
}
}
return .single(false)
}
self.listNode.visibleBottomContentOffsetChanged = { [weak self] offset in

View File

@ -59,16 +59,18 @@ class ItemListDisclosureItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListDisclosureItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListDisclosureItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -34,16 +34,18 @@ class ItemListMultilineInputItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListMultilineInputItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListMultilineInputItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -50,16 +50,18 @@ class ItemListMultilineTextItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListMultilineTextItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListMultilineTextItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -28,16 +28,18 @@ class ItemListPeerActionItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(false) })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListPeerActionItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListPeerActionItemNode {
let makeLayout = nodeValue.asyncLayout()
var animated = true
if case .None = animation {

View File

@ -108,16 +108,18 @@ final class ItemListPeerItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (node.avatarNode.ready, { apply(false) })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListPeerItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListPeerItemNode {
let makeLayout = nodeValue.asyncLayout()
var animated = true
if case .None = animation {

View File

@ -63,16 +63,18 @@ final class ItemListRecentSessionItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(false) })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListRecentSessionItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListRecentSessionItemNode {
let makeLayout = nodeValue.asyncLayout()
var animated = true
if case .None = animation {

View File

@ -33,16 +33,18 @@ class ItemListSecretChatKeyItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListSecretChatKeyItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListSecretChatKeyItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -24,20 +24,22 @@ class ItemListSectionHeaderItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
guard let node = node as? ItemListSectionHeaderItemNode else {
assertionFailure()
return
}
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
guard let nodeValue = node() as? ItemListSectionHeaderItemNode else {
assertionFailure()
return
}
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -48,16 +48,19 @@ class ItemListSingleLineInputItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListSingleLineInputItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListSingleLineInputItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -77,16 +77,18 @@ final class ItemListStickerPackItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(false) })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListStickerPackItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListStickerPackItemNode {
let makeLayout = nodeValue.asyncLayout()
var animated = true
if case .None = animation {

View File

@ -39,16 +39,18 @@ class ItemListSwitchItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(false) })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListSwitchItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListSwitchItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -36,20 +36,22 @@ class ItemListTextItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
guard let node = node as? ItemListTextItemNode else {
assertionFailure()
return
}
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
guard let nodeValue = node() as? ItemListTextItemNode else {
assertionFailure()
return
}
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -49,16 +49,18 @@ final class ItemListTextWithLabelItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListTextWithLabelItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListTextWithLabelItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -53,16 +53,18 @@ final class ItemListWebsiteItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(false) })
})
Queue.mainQueue().async {
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) {
if let node = node as? ItemListWebsiteItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ItemListWebsiteItemNode {
let makeLayout = nodeValue.asyncLayout()
var animated = true
if case .None = animation {

View File

@ -22,9 +22,11 @@ final class ListMessageHoleItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? ListMessageHoleItemNode {
Queue.mainQueue().async {
node.updateSelectionState(animated: false)
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? ListMessageHoleItemNode {
nodeValue.updateSelectionState(animated: false)
let nodeLayout = node.asyncLayout()
let nodeLayout = nodeValue.asyncLayout()
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)
Queue.mainQueue().async {
@ -52,9 +54,9 @@ final class ListMessageHoleItem: ListViewItem {
})
}
}
} else {
assertionFailure()
}
} else {
assertionFailure()
}
}
}

View File

@ -57,9 +57,11 @@ final class ListMessageItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? ListMessageNode {
Queue.mainQueue().async {
node.setupItem(self)
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? ListMessageNode {
nodeValue.setupItem(self)
node.updateSelectionState(animated: false)
nodeValue.updateSelectionState(animated: false)
let nodeLayout = node.asyncLayout()
let nodeLayout = nodeValue.asyncLayout()
async {
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()
}
}

View File

@ -34,16 +34,18 @@ class MediaInputPaneTrendingItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? MediaInputPaneTrendingItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? MediaInputPaneTrendingItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params)

View File

@ -33,9 +33,11 @@ final class MentionChatInputPanelItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? MentionChatInputPanelItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? MentionChatInputPanelItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let (top, bottom) = (previousItem != nil, nextItem != nil)
@ -61,9 +63,9 @@ final class MentionChatInputPanelItem: ListViewItem {
})
}
}
} else {
assertionFailure()
}
} else {
assertionFailure()
}
}

View File

@ -13,53 +13,6 @@ public enum PresentationCallState: Equatable {
case active(Double, Data)
case terminating
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 {
@ -177,6 +130,10 @@ public final class PresentationCall {
private let audioSession: ManagedAudioSession
private let callSessionManager: CallSessionManager
private let callKitIntegration: CallKitIntegration?
public var isIntegratedWithCallKit: Bool {
return self.callKitIntegration != nil
}
private let getDeviceAccessData: () -> (presentationData: PresentationData, present: (ViewController, Any?) -> Void, openSettings: () -> Void)
public let internalId: CallSessionInternalId

View File

@ -112,10 +112,17 @@ public final class PresentationCallManager {
}
|> distinctUntilChanged
self.ringingStatesDisposable = (combineLatest(callSessionManager.ringingStates(), enableCallKit)
|> mapToSignal { ringingStates, enableCallKit -> Signal<([(Peer, CallSessionRingingState, Bool)], Bool), NoError> in
let enabledMicrophoneAccess = Signal<Bool, NoError> { subscriber 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 {
return .single(([], enableCallKit))
return .single(([], enableCallKit && enabledMicrophoneAccess))
} else {
return postbox.transaction { transaction -> ([(Peer, CallSessionRingingState, Bool)], Bool) in
var result: [(Peer, CallSessionRingingState, Bool)] = []
@ -124,7 +131,7 @@ public final class PresentationCallManager {
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

View File

@ -26,16 +26,18 @@ class ProxySettingsActionItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(false) })
})
Queue.mainQueue().async {
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) {
if let node = node as? ProxySettingsActionItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ProxySettingsActionItemNode {
let makeLayout = nodeValue.asyncLayout()
var animated = true
if case .None = animation {

View File

@ -54,16 +54,18 @@ final class ProxySettingsServerItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(false) })
})
Queue.mainQueue().async {
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) {
if let node = node as? ProxySettingsServerItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ProxySettingsServerItemNode {
let makeLayout = nodeValue.asyncLayout()
var animated = true
if case .None = animation {

View File

@ -27,16 +27,18 @@ class ThemeSettingsBrightnessItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ThemeSettingsBrightnessItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ThemeSettingsBrightnessItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -34,16 +34,18 @@ class ThemeSettingsChatPreviewItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ThemeSettingsChatPreviewItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ThemeSettingsChatPreviewItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
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?
if let current = currentNode1 {
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))
current.contentSize = layout.contentSize
@ -174,7 +176,7 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode {
var node2: ListViewItemNode?
if let current = currentNode2 {
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))
current.contentSize = layout.contentSize

View File

@ -27,16 +27,18 @@ class ThemeSettingsFontSizeItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? ThemeSettingsFontSizeItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? ThemeSettingsFontSizeItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -24,16 +24,18 @@ class UserInfoEditingPhoneActionItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? UserInfoEditingPhoneActionItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? UserInfoEditingPhoneActionItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -45,16 +45,18 @@ class UserInfoEditingPhoneItem: ListViewItem, ItemListItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply() })
})
Queue.mainQueue().async {
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) {
if let node = node as? UserInfoEditingPhoneItemNode {
Queue.mainQueue().async {
let makeLayout = node.asyncLayout()
func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping () -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? UserInfoEditingPhoneItemNode {
let makeLayout = nodeValue.asyncLayout()
async {
let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem))

View File

@ -27,9 +27,11 @@ final class VerticalListContextResultsChatInputPanelButtonItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? VerticalListContextResultsChatInputPanelButtonItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? VerticalListContextResultsChatInputPanelButtonItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let (top, bottom) = (previousItem != nil, nextItem != nil)
@ -55,9 +57,9 @@ final class VerticalListContextResultsChatInputPanelButtonItem: ListViewItem {
})
}
}
} else {
assertionFailure()
}
} else {
assertionFailure()
}
}
}

View File

@ -31,9 +31,11 @@ final class VerticalListContextResultsChatInputPanelItem: ListViewItem {
node.contentSize = layout.contentSize
node.insets = layout.insets
completion(node, {
return (nil, { apply(.None) })
})
Queue.mainQueue().async {
completion(node, {
return (nil, { apply(.None) })
})
}
}
if Thread.isMainThread {
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) {
if let node = node as? VerticalListContextResultsChatInputPanelItemNode {
Queue.mainQueue().async {
let nodeLayout = node.asyncLayout()
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) {
Queue.mainQueue().async {
if let nodeValue = node() as? VerticalListContextResultsChatInputPanelItemNode {
let nodeLayout = nodeValue.asyncLayout()
async {
let (top, bottom) = (previousItem != nil, nextItem != nil)
@ -59,9 +61,9 @@ final class VerticalListContextResultsChatInputPanelItem: ListViewItem {
})
}
}
} else {
assertionFailure()
}
} else {
assertionFailure()
}
}