diff --git a/submodules/TelegramCore/Sources/Utils/PeerUtils.swift b/submodules/TelegramCore/Sources/Utils/PeerUtils.swift index e967e561ae..a2a3cc0197 100644 --- a/submodules/TelegramCore/Sources/Utils/PeerUtils.swift +++ b/submodules/TelegramCore/Sources/Utils/PeerUtils.swift @@ -142,7 +142,7 @@ public extension Peer { var largeProfileImage: TelegramMediaImageRepresentation? { return largestImageRepresentation(self.profileImageRepresentations) } - + var isDeleted: Bool { switch self { case let user as TelegramUser: @@ -152,6 +152,27 @@ public extension Peer { } } + var isGenericUser: Bool { + switch self { + case let user as TelegramUser: + if user.isDeleted { + return false + } + if user.botInfo != nil { + return false + } + if user.id.isRepliesOrVerificationCodes { + return false + } + if user.id.isTelegramNotifications { + return false + } + return true + default: + return false + } + } + var isScam: Bool { switch self { case let user as TelegramUser: diff --git a/submodules/TelegramUI/Components/Chat/QuickShareScreen/Sources/QuickShareScreen.swift b/submodules/TelegramUI/Components/Chat/QuickShareScreen/Sources/QuickShareScreen.swift index 02024baeb3..d9043f109f 100644 --- a/submodules/TelegramUI/Components/Chat/QuickShareScreen/Sources/QuickShareScreen.swift +++ b/submodules/TelegramUI/Components/Chat/QuickShareScreen/Sources/QuickShareScreen.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import ComponentFlow import SwiftSignalKit +import Postbox import TelegramCore import TextFormat import TelegramPresentationData @@ -211,27 +212,46 @@ private final class QuickShareScreenComponent: Component { self.state = state if self.component == nil { + let peers = component.context.engine.peers.recentPeers() + |> take(1) + |> mapToSignal { recentPeers -> Signal<[EnginePeer], NoError> in + if case let .peers(peers) = recentPeers, !peers.isEmpty { + return .single(peers.map(EnginePeer.init)) + } else { + return component.context.account.stateManager.postbox.tailChatListView( + groupId: .root, + count: 20, + summaryComponents: ChatListEntrySummaryComponents() + ) + |> take(1) + |> map { view -> [EnginePeer] in + var peers: [EnginePeer] = [] + for entry in view.0.entries.reversed() { + if case let .MessageEntry(entryData) = entry { + if let user = entryData.renderedPeer.chatMainPeer as? TelegramUser, user.isGenericUser && user.id != component.context.account.peerId && !user.id.isSecretChat { + peers.append(EnginePeer(user)) + } + } + } + return peers + } + } + } + self.disposable = combineLatest(queue: Queue.mainQueue(), - component.context.engine.peers.recentPeers() |> take(1), + peers, component.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: component.context.account.peerId)) - ).start(next: { [weak self] recentPeers, accountPeer in + ).start(next: { [weak self] peers, accountPeer in guard let self else { return } - var result: [EnginePeer] = [] - switch recentPeers { - case let .peers(peers): - result = peers.map(EnginePeer.init) - case .disabled: - break - } - if !result.isEmpty, let accountPeer { - self.peers = Array([accountPeer] + result.prefix(4)) + if !peers.isEmpty, let accountPeer { + self.peers = Array([accountPeer] + peers.prefix(4)) self.state?.updated() + component.ready.set(.single(true)) } else { self.environment?.controller()?.dismiss() } - component.ready.set(.single(true)) }) component.gesture.externalUpdated = { [weak self] view, point in diff --git a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift index 924c0aa70a..b1ed83e615 100644 --- a/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift +++ b/submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift @@ -2462,13 +2462,23 @@ private final class GiftViewSheetContent: CombinedComponent { if let uniqueGift { if isMyUniqueGift, case let .peerId(peerId) = uniqueGift.owner { var canTransfer = true - if let peer = state.peerMap[peerId], case let .channel(channel) = peer, !channel.flags.contains(.isCreator) { - canTransfer = false + var canResell = true + if let peer = state.peerMap[peerId], case let .channel(channel) = peer { + if !channel.flags.contains(.isCreator) { + canTransfer = false + } + canResell = false } else if subject.arguments?.transferStars == nil { canTransfer = false } - let buttonsCount = canTransfer ? 3 : 2 + var buttonsCount = 1 + if canTransfer { + buttonsCount += 1 + } + if canResell { + buttonsCount += 1 + } let buttonSpacing: CGFloat = 10.0 let buttonWidth = floor(context.availableSize.width - sideInset * 2.0 - buttonSpacing * CGFloat(buttonsCount - 1)) / CGFloat(buttonsCount) @@ -2560,28 +2570,30 @@ private final class GiftViewSheetContent: CombinedComponent { ) buttonOriginX += buttonWidth + buttonSpacing - let resellButton = resellButton.update( - component: PlainButtonComponent( - content: AnyComponent( - HeaderButtonComponent( - title: uniqueGift.resellStars == nil ? strings.Gift_View_Sell : strings.Gift_View_Unlist, - iconName: uniqueGift.resellStars == nil ? "Premium/Collectible/Sell" : "Premium/Collectible/Unlist" - ) + if canResell { + let resellButton = resellButton.update( + component: PlainButtonComponent( + content: AnyComponent( + HeaderButtonComponent( + title: uniqueGift.resellStars == nil ? strings.Gift_View_Sell : strings.Gift_View_Unlist, + iconName: uniqueGift.resellStars == nil ? "Premium/Collectible/Sell" : "Premium/Collectible/Unlist" + ) + ), + effectAlignment: .center, + action: { [weak state] in + state?.resellGift() + } ), - effectAlignment: .center, - action: { [weak state] in - state?.resellGift() - } - ), - environment: {}, - availableSize: CGSize(width: buttonWidth, height: buttonHeight), - transition: context.transition - ) - context.add(resellButton - .position(CGPoint(x: buttonOriginX + buttonWidth / 2.0, y: headerHeight - buttonHeight / 2.0 - 16.0)) - .appear(.default(scale: true, alpha: true)) - .disappear(.default(scale: true, alpha: true)) - ) + environment: {}, + availableSize: CGSize(width: buttonWidth, height: buttonHeight), + transition: context.transition + ) + context.add(resellButton + .position(CGPoint(x: buttonOriginX + buttonWidth / 2.0, y: headerHeight - buttonHeight / 2.0 - 16.0)) + .appear(.default(scale: true, alpha: true)) + .disappear(.default(scale: true, alpha: true)) + ) + } } let order: [StarGift.UniqueGift.Attribute.AttributeType] = [ diff --git a/submodules/TelegramUI/Sources/OpenResolvedUrl.swift b/submodules/TelegramUI/Sources/OpenResolvedUrl.swift index 25c781c4d2..c2a4eaa898 100644 --- a/submodules/TelegramUI/Sources/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/Sources/OpenResolvedUrl.swift @@ -827,9 +827,12 @@ func openResolvedUrlImpl( } case .stars: dismissInput() - let controller = context.sharedContext.makeStarsIntroScreen(context: context) - if let navigationController = navigationController { - navigationController.pushViewController(controller, animated: true) + if let starsContext = context.starsContext { + let controller = context.sharedContext.makeStarsTransactionsScreen(context: context, starsContext: starsContext) + controller.navigationPresentation = .modal + if let navigationController { + navigationController.pushViewController(controller, animated: true) + } } case let .joinVoiceChat(peerId, invite): let _ = (context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId))