Skip to content

Commit

Permalink
1.9.9 (455)
Browse files Browse the repository at this point in the history
  • Loading branch information
denis15yo committed Feb 25, 2025
1 parent b52c830 commit 742c6c6
Show file tree
Hide file tree
Showing 9 changed files with 666 additions and 485 deletions.
8 changes: 4 additions & 4 deletions MODULE.bazel.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@
"location" : "git@bitbucket.org:mobyrix/nicegram-assistant-ios.git",
"state" : {
"branch" : "fix/spy_on_friends",
"revision" : "928c810bc05355a39b1fd18cdffd5abaaffc5ace"
"revision" : "9a03d3c4b97508fc4aad0ec3b155af2c5379bbb2"
}
},
{
Expand All @@ -123,7 +123,7 @@
"location" : "git@bitbucket.org:mobyrix/nicegram-wallet-ios.git",
"state" : {
"branch" : "develop",
"revision" : "63ea2a8342b31467d251a406cf4e72f02fc842eb"
"revision" : "466e4a1b29809f301818b5670345089e91a5adaa"
}
},
{
Expand Down
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ let package = Package(
name: "nicegram-package",
dependencies: [
.package(url: "git@bitbucket.org:mobyrix/nicegram-assistant-ios.git", branch: "fix/spy_on_friends"),
.package(url: "git@bitbucket.org:mobyrix/nicegram-wallet-ios.git", branch: "develop")
.package(url: "git@bitbucket.org:mobyrix/nicegram-wallet-ios.git", branch: "develop")
]
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import AsyncDisplayKit
import Display
import TelegramCore
import SwiftSignalKit
import Postbox
import TelegramPresentationData
import ItemListUI
import FeatSpyOnFriends

@available(iOS 15.0, *)
public final class SpyOnFriendsEmptyDataItem: ListViewItem, ItemListItem {
public let sectionId: ItemListSectionId
public let theme: PresentationTheme

public init(
sectionId: ItemListSectionId,
theme: PresentationTheme
) {
self.sectionId = sectionId
self.theme = theme
}

public func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal<Void, NoError>?, (ListViewItemApply) -> Void)) -> Void) {
let configure = { () -> Void in
let node = SpyOnFriendsEmptyDataNode()
node.setupItem(self)

let (layout, apply) = node.asyncLayout()(self, params, false, false, false)

node.contentSize = layout.contentSize
node.insets = layout.insets

completion(node, {
return (nil, { _ in apply(.None) })
})
}
if Thread.isMainThread {
configure()
} else {
Queue.mainQueue().async(configure)
}
}

public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? SpyOnFriendsEmptyDataNode {
let nodeLayout = nodeValue.asyncLayout()

let (layout, apply) = nodeLayout(self, params, false, false, false)

completion(layout, { _ in
apply(animation)
})
} else {
assertionFailure()
}
}
}
}

@available(iOS 15.0, *)
class SpyOnFriendsEmptyDataNode: ListViewItemNode {
var item: SpyOnFriendsEmptyDataItem?

private let emptyDataView: SpyOnFriendsEmptyDataView
private let emptyDataNode: ASDisplayNode

required init() {
let emptyDataView = SpyOnFriendsEmptyDataView()
self.emptyDataView = emptyDataView
self.emptyDataNode = ASDisplayNode {
emptyDataView
}

super.init(layerBacked: false, dynamicBounce: false, rotated: false)

self.addSubnode(emptyDataNode)
}

func setupItem(_ item: SpyOnFriendsEmptyDataItem) {
self.item = item
}

func asyncLayout() -> (_ item: SpyOnFriendsEmptyDataItem, _ params: ListViewItemLayoutParams, _ mergedTop: Bool, _ mergedBottom: Bool, _ dateAtBottom: Bool) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation) -> Void) {
return { [weak self] item, params, mergedTop, mergedBottom, dateHeaderAtBottom -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation) -> Void) in
guard let self else {
return (
ListViewItemNodeLayout(
contentSize: .zero,
insets: .zero
),
{ _ in }
)
}

emptyDataView.updateConstraintsIfNeeded()

let emptyDataInsets: UIEdgeInsets = isPortrait ? .vertical(20).horizontal(16) : .vertical(20).horizontal(59)

let size = CGSize(
width: params.width - (emptyDataInsets.left + emptyDataInsets.right),
height: 300
)

let layout = ListViewItemNodeLayout(
contentSize: size,
insets: emptyDataInsets
)

let apply: (ListViewItemUpdateAnimation) -> Void = { [weak self] _ in
guard let self else { return }
emptyDataNode.frame = CGRect(origin: .init(x: emptyDataInsets.left, y: 0), size: size)
}

return (layout, apply)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
import AsyncDisplayKit
import Display
import TelegramCore
import SwiftSignalKit
import Postbox
import TelegramPresentationData
import ItemListUI
import FeatSpyOnFriends

@available(iOS 15.0, *)
public final class SpyOnFriendsHeaderItem: ListViewItem, ItemListItem {
public let sectionId: ItemListSectionId
public let context: SpyOnFriendsContext
public let theme: PresentationTheme
public let locale: Locale
public let peerId: Int64
public let isRefreshing: Bool

public init(
sectionId: ItemListSectionId,
context: SpyOnFriendsContext,
theme: PresentationTheme,
locale: Locale,
peerId: Int64,
isRefreshing: Bool
) {
self.sectionId = sectionId
self.context = context
self.theme = theme
self.locale = locale
self.peerId = peerId
self.isRefreshing = isRefreshing
}

public func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal<Void, NoError>?, (ListViewItemApply) -> Void)) -> Void) {
let configure = { () -> Void in
let node = SpyOnFriendsHeaderNode(peerId: self.peerId)
node.setupItem(self)

let (layout, apply) = node.asyncLayout()(self, params, false, false, false)

node.contentSize = layout.contentSize
node.insets = layout.insets

completion(node, {
return (nil, { _ in apply(.None) })
})
}
if Thread.isMainThread {
configure()
} else {
Queue.mainQueue().async(configure)
}
}

public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) {
Queue.mainQueue().async {
if let nodeValue = node() as? SpyOnFriendsHeaderNode {
nodeValue.setupItem(self)

let nodeLayout = nodeValue.asyncLayout()

let (layout, apply) = nodeLayout(self, params, false, false, false)

completion(layout, { _ in
apply(animation)
})
} else {
assertionFailure()
}
}
}
}

@available(iOS 15.0, *)
class SpyOnFriendsHeaderNode: ListViewItemNode {
var item: SpyOnFriendsHeaderItem?

private let headerView: SpyOnFriendsHeaderView
private let headerNode: ASDisplayNode

required init(peerId: Int64) {
let headerView = SpyOnFriendsHeaderView(peerId: peerId)
self.headerView = headerView
self.headerNode = ASDisplayNode {
headerView
}

super.init(layerBacked: false, dynamicBounce: false, rotated: false)

self.addSubnode(headerNode)
}

func setupItem(_ item: SpyOnFriendsHeaderItem) {
self.item = item

headerView.setup(
with: item.theme.list.itemAccentColor,
backgroundColor: item.theme.list.itemBlocksBackgroundColor,
locale: item.locale,
isRefreshing: item.isRefreshing
) {
item.context.load()
}
}

func asyncLayout() -> (_ item: SpyOnFriendsHeaderItem, _ params: ListViewItemLayoutParams, _ mergedTop: Bool, _ mergedBottom: Bool, _ dateAtBottom: Bool) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation) -> Void) {
return { [weak self] item, params, mergedTop, mergedBottom, dateHeaderAtBottom -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation) -> Void) in
guard let self else {
return (
ListViewItemNodeLayout(
contentSize: .zero,
insets: .zero
),
{ _ in }
)
}

headerView.setup(
with: item.theme.list.itemAccentColor,
backgroundColor: item.theme.list.itemBlocksBackgroundColor,
locale: item.locale,
isRefreshing: item.isRefreshing
) {
item.context.load()
}
headerView.updateConstraintsIfNeeded()

let headerInsets: UIEdgeInsets = isPortrait ? .vertical(12).horizontal(16) : .vertical(12).horizontal(59)
let headerSize = headerView.systemLayoutSizeFitting(
UIView.layoutFittingExpandedSize
)
let size = CGSize(
width: params.width - (headerInsets.left + headerInsets.right),
height: headerSize.height
)

let layout = ListViewItemNodeLayout(
contentSize: size,
insets: headerInsets
)

let apply: (ListViewItemUpdateAnimation) -> Void = { [weak self] _ in
guard let self else { return }
headerNode.frame = CGRect(origin: .init(x: headerInsets.left, y: 0), size: size)
}

return (layout, apply)
}
}
}
Loading

0 comments on commit 742c6c6

Please sign in to comment.