Merge commit 'b33d7888b82c4a1300044a3566ebb37f3a9edfc5'

This commit is contained in:
Ali 2021-10-27 20:41:58 +04:00
commit eef25b4070
31 changed files with 145 additions and 84 deletions

View File

@ -593,7 +593,7 @@ public protocol SharedAccountContext: AnyObject {
func openChatMessage(_ params: OpenChatMessageParams) -> Bool func openChatMessage(_ params: OpenChatMessageParams) -> Bool
func messageFromPreloadedChatHistoryViewForLocation(id: MessageId, location: ChatHistoryLocationInput, context: AccountContext, chatLocation: ChatLocation, subject: ChatControllerSubject?, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, tagMask: MessageTags?) -> Signal<(MessageIndex?, Bool), NoError> func messageFromPreloadedChatHistoryViewForLocation(id: MessageId, location: ChatHistoryLocationInput, context: AccountContext, chatLocation: ChatLocation, subject: ChatControllerSubject?, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, tagMask: MessageTags?) -> Signal<(MessageIndex?, Bool), NoError>
func makeOverlayAudioPlayerController(context: AccountContext, peerId: PeerId, type: MediaManagerPlayerType, initialMessageId: MessageId, initialOrder: MusicPlaybackSettingsOrder, playlistLocation: SharedMediaPlaylistLocation?, parentNavigationController: NavigationController?) -> ViewController & OverlayAudioPlayerController func makeOverlayAudioPlayerController(context: AccountContext, peerId: PeerId, type: MediaManagerPlayerType, initialMessageId: MessageId, initialOrder: MusicPlaybackSettingsOrder, playlistLocation: SharedMediaPlaylistLocation?, parentNavigationController: NavigationController?) -> ViewController & OverlayAudioPlayerController
func makePeerInfoController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peer: Peer, mode: PeerInfoControllerMode, avatarInitiallyExpanded: Bool, fromChat: Bool) -> ViewController? func makePeerInfoController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peer: Peer, mode: PeerInfoControllerMode, avatarInitiallyExpanded: Bool, fromChat: Bool, requestsContext: PeerInvitationImportersContext?) -> ViewController?
func makeChannelAdminController(context: AccountContext, peerId: PeerId, adminId: PeerId, initialParticipant: ChannelParticipant) -> ViewController? func makeChannelAdminController(context: AccountContext, peerId: PeerId, adminId: PeerId, initialParticipant: ChannelParticipant) -> ViewController?
func makeDeviceContactInfoController(context: AccountContext, subject: DeviceContactInfoSubject, completed: (() -> Void)?, cancelled: (() -> Void)?) -> ViewController func makeDeviceContactInfoController(context: AccountContext, subject: DeviceContactInfoSubject, completed: (() -> Void)?, cancelled: (() -> Void)?) -> ViewController
func makePeersNearbyController(context: AccountContext) -> ViewController func makePeersNearbyController(context: AccountContext) -> ViewController

View File

@ -208,7 +208,7 @@ public final class CallListController: TelegramBaseController {
TelegramEngine.EngineData.Item.Peer.Peer(id: peerId) TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)
) )
|> deliverOnMainQueue).start(next: { peer in |> deliverOnMainQueue).start(next: { peer in
if let strongSelf = self, let peer = peer, let controller = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .calls(messages: messages.map({ $0._asMessage() })), avatarInitiallyExpanded: false, fromChat: false) { if let strongSelf = self, let peer = peer, let controller = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .calls(messages: messages.map({ $0._asMessage() })), avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
(strongSelf.navigationController as? NavigationController)?.pushViewController(controller) (strongSelf.navigationController as? NavigationController)?.pushViewController(controller)
} }
}) })

View File

@ -486,7 +486,7 @@ public class ContactsController: ViewController {
} }
if let peer = peer { if let peer = peer {
DispatchQueue.main.async { DispatchQueue.main.async {
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
(strongSelf.navigationController as? NavigationController)?.pushViewController(infoController) (strongSelf.navigationController as? NavigationController)?.pushViewController(infoController)
} }
} }

View File

@ -1221,7 +1221,7 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate {
let _ = (strongSelf.context.account.postbox.loadedPeerWithId(peerId) let _ = (strongSelf.context.account.postbox.loadedPeerWithId(peerId)
|> deliverOnMainQueue).start(next: { peer in |> deliverOnMainQueue).start(next: { peer in
if let strongSelf = self { if let strongSelf = self {
if let controller = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let controller = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
strongSelf.getNavigationController()?.pushViewController(controller) strongSelf.getNavigationController()?.pushViewController(controller)
} }
} }

View File

@ -20,12 +20,14 @@ import UndoUI
private final class InviteLinkEditControllerArguments { private final class InviteLinkEditControllerArguments {
let context: AccountContext let context: AccountContext
let updateState: ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void let updateState: ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void
let scrollToUsage: () -> Void
let dismissInput: () -> Void let dismissInput: () -> Void
let revoke: () -> Void let revoke: () -> Void
init(context: AccountContext, updateState: @escaping ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void, dismissInput: @escaping () -> Void, revoke: @escaping () -> Void) { init(context: AccountContext, updateState: @escaping ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void, scrollToUsage: @escaping () -> Void, dismissInput: @escaping () -> Void, revoke: @escaping () -> Void) {
self.context = context self.context = context
self.updateState = updateState self.updateState = updateState
self.scrollToUsage = scrollToUsage
self.dismissInput = dismissInput self.dismissInput = dismissInput
self.revoke = revoke self.revoke = revoke
} }
@ -39,6 +41,18 @@ private enum InviteLinksEditSection: Int32 {
case revoke case revoke
} }
private enum InviteLinksEditEntryTag: ItemListItemTag {
case usage
func isEqual(to other: ItemListItemTag) -> Bool {
if let other = other as? InviteLinksEditEntryTag, self == other {
return true
} else {
return false
}
}
}
private let invalidAmountCharacters = CharacterSet(charactersIn: "01234567890.,").inverted private let invalidAmountCharacters = CharacterSet(charactersIn: "01234567890.,").inverted
func isValidNumberOfUsers(_ number: String) -> Bool { func isValidNumberOfUsers(_ number: String) -> Bool {
if number.isEmpty { if number.isEmpty {
@ -298,7 +312,7 @@ private enum InviteLinksEditEntry: ItemListNodeEntry {
} else { } else {
text = focused ? "" : presentationData.strings.InviteLink_Create_UsersLimitNumberOfUsersUnlimited text = focused ? "" : presentationData.strings.InviteLink_Create_UsersLimitNumberOfUsersUnlimited
} }
return ItemListSingleLineInputItem(presentationData: presentationData, title: NSAttributedString(string: presentationData.strings.InviteLink_Create_UsersLimitNumberOfUsers, textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "", type: .number, alignment: .right, selectAllOnFocus: true, secondaryStyle: !customValue, tag: nil, sectionId: self.section, textUpdated: { updatedText in return ItemListSingleLineInputItem(presentationData: presentationData, title: NSAttributedString(string: presentationData.strings.InviteLink_Create_UsersLimitNumberOfUsers, textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "", type: .number, alignment: .right, selectAllOnFocus: true, secondaryStyle: !customValue, tag: InviteLinksEditEntryTag.usage, sectionId: self.section, textUpdated: { updatedText in
arguments.updateState { state in arguments.updateState { state in
var updatedState = state var updatedState = state
if updatedText.isEmpty { if updatedText.isEmpty {
@ -318,6 +332,7 @@ private enum InviteLinksEditEntry: ItemListNodeEntry {
updatedState.pickingUsageLimit = true updatedState.pickingUsageLimit = true
return updatedState return updatedState
} }
arguments.scrollToUsage()
} else { } else {
arguments.updateState { state in arguments.updateState { state in
var updatedState = state var updatedState = state
@ -344,14 +359,16 @@ private func inviteLinkEditControllerEntries(invite: ExportedInvitation?, state:
entries.append(.title(presentationData.theme, presentationData.strings.InviteLink_Create_LinkName, state.title)) entries.append(.title(presentationData.theme, presentationData.strings.InviteLink_Create_LinkName, state.title))
entries.append(.titleInfo(presentationData.theme, presentationData.strings.InviteLink_Create_LinkNameInfo)) entries.append(.titleInfo(presentationData.theme, presentationData.strings.InviteLink_Create_LinkNameInfo))
entries.append(.requestApproval(presentationData.theme, presentationData.strings.InviteLink_Create_RequestApproval, state.requestApproval)) if !isPublic {
var requestApprovalInfoText = presentationData.strings.InviteLink_Create_RequestApprovalOffInfoChannel entries.append(.requestApproval(presentationData.theme, presentationData.strings.InviteLink_Create_RequestApproval, state.requestApproval))
if state.requestApproval { var requestApprovalInfoText = presentationData.strings.InviteLink_Create_RequestApprovalOffInfoChannel
requestApprovalInfoText = isGroup ? presentationData.strings.InviteLink_Create_RequestApprovalOnInfoGroup : presentationData.strings.InviteLink_Create_RequestApprovalOnInfoChannel if state.requestApproval {
} else { requestApprovalInfoText = isGroup ? presentationData.strings.InviteLink_Create_RequestApprovalOnInfoGroup : presentationData.strings.InviteLink_Create_RequestApprovalOnInfoChannel
requestApprovalInfoText = isGroup ? presentationData.strings.InviteLink_Create_RequestApprovalOnInfoGroup : presentationData.strings.InviteLink_Create_RequestApprovalOffInfoChannel } else {
requestApprovalInfoText = isGroup ? presentationData.strings.InviteLink_Create_RequestApprovalOnInfoGroup : presentationData.strings.InviteLink_Create_RequestApprovalOffInfoChannel
}
entries.append(.requestApprovalInfo(presentationData.theme, requestApprovalInfoText))
} }
entries.append(.requestApprovalInfo(presentationData.theme, requestApprovalInfoText))
entries.append(.timeHeader(presentationData.theme, presentationData.strings.InviteLink_Create_TimeLimit.uppercased())) entries.append(.timeHeader(presentationData.theme, presentationData.strings.InviteLink_Create_TimeLimit.uppercased()))
entries.append(.timePicker(presentationData.theme, state.time)) entries.append(.timePicker(presentationData.theme, state.time))
@ -434,9 +451,12 @@ public func inviteLinkEditController(context: AccountContext, updatedPresentatio
var dismissImpl: (() -> Void)? var dismissImpl: (() -> Void)?
var dismissInputImpl: (() -> Void)? var dismissInputImpl: (() -> Void)?
var scrollToUsageImpl: (() -> Void)?
let arguments = InviteLinkEditControllerArguments(context: context, updateState: { f in let arguments = InviteLinkEditControllerArguments(context: context, updateState: { f in
updateState(f) updateState(f)
}, scrollToUsage: {
scrollToUsageImpl?()
}, dismissInput: { }, dismissInput: {
dismissInputImpl?() dismissInputImpl?()
}, revoke: { }, revoke: {
@ -597,6 +617,27 @@ public func inviteLinkEditController(context: AccountContext, updatedPresentatio
controller.present(c, in: .window(.root), with: p) controller.present(c, in: .window(.root), with: p)
} }
} }
scrollToUsageImpl = { [weak controller] in
controller?.afterLayout({
guard let controller = controller else {
return
}
var resultItemNode: ListViewItemNode?
let _ = controller.frameForItemNode({ itemNode in
if let itemNode = itemNode as? ItemListSingleLineInputItemNode {
if let tag = itemNode.tag as? InviteLinksEditEntryTag, tag == .usage {
resultItemNode = itemNode
return true
}
}
return false
})
if let resultItemNode = resultItemNode {
controller.ensureItemNodeVisible(resultItemNode)
}
})
}
dismissInputImpl = { [weak controller] in dismissInputImpl = { [weak controller] in
controller?.view.endEditing(true) controller?.view.endEditing(true)
} }

View File

@ -375,7 +375,7 @@ public final class InviteLinkViewController: ViewController {
private let context: AccountContext private let context: AccountContext
private let peerId: EnginePeer.Id private let peerId: EnginePeer.Id
private let invite: ExportedInvitation private var invite: ExportedInvitation
private let importersContext: PeerInvitationImportersContext private let importersContext: PeerInvitationImportersContext
private let requestsContext: PeerInvitationImportersContext? private let requestsContext: PeerInvitationImportersContext?
@ -823,6 +823,11 @@ public final class InviteLinkViewController: ViewController {
self?.controller?.dismiss() self?.controller?.dismiss()
} else { } else {
invitationsContext?.update(invite) invitationsContext?.update(invite)
if let strongSelf = self, let layout = strongSelf.validLayout {
strongSelf.invite = invite
strongSelf.containerLayoutUpdated(layout, transition: .immediate)
}
} }
} }
}) })
@ -936,7 +941,6 @@ public final class InviteLinkViewController: ViewController {
var titleText = self.presentationData.strings.InviteLink_InviteLink var titleText = self.presentationData.strings.InviteLink_InviteLink
var subtitleText = "" var subtitleText = ""
var subtitleColor = self.presentationData.theme.list.itemSecondaryTextColor var subtitleColor = self.presentationData.theme.list.itemSecondaryTextColor
if self.invite.isRevoked { if self.invite.isRevoked {

View File

@ -183,13 +183,13 @@ public func inviteRequestsController(context: AccountContext, updatedPresentatio
let _ = (context.engine.data.get( let _ = (context.engine.data.get(
TelegramEngine.EngineData.Item.Peer.Peer(id: peerId) TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)
) )
|> deliverOnMainQueue).start(next: { peer in |> deliverOnMainQueue).start(next: { chatPeer in
guard let peer = peer else { guard let chatPeer = chatPeer else {
return return
} }
let presentationData = context.sharedContext.currentPresentationData.with { $0 } let presentationData = context.sharedContext.currentPresentationData.with { $0 }
let string: String let string: String
if case let .channel(channel) = peer, case .broadcast = channel.info { if case let .channel(channel) = chatPeer, case .broadcast = channel.info {
string = presentationData.strings.MemberRequests_UserAddedToChannel(peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)).string string = presentationData.strings.MemberRequests_UserAddedToChannel(peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)).string
} else { } else {
string = presentationData.strings.MemberRequests_UserAddedToGroup(peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)).string string = presentationData.strings.MemberRequests_UserAddedToGroup(peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)).string
@ -371,7 +371,7 @@ public func inviteRequestsController(context: AccountContext, updatedPresentatio
} }
} }
navigateToProfileImpl = { [weak controller] peer in navigateToProfileImpl = { [weak controller] peer in
if let navigationController = controller?.navigationController as? NavigationController, let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .generic, avatarInitiallyExpanded: peer.largeProfileImage != nil, fromChat: false) { if let navigationController = controller?.navigationController as? NavigationController, let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .generic, avatarInitiallyExpanded: peer.largeProfileImage != nil, fromChat: false, requestsContext: nil) {
navigationController.pushViewController(controller) navigationController.pushViewController(controller)
} }
} }

View File

@ -477,12 +477,12 @@ open class ItemListControllerNode: ASDisplayNode {
insets.right += inset insets.right += inset
addedInsets = UIEdgeInsets(top: 0.0, left: inset, bottom: 0.0, right: inset) addedInsets = UIEdgeInsets(top: 0.0, left: inset, bottom: 0.0, right: inset)
if self.leftOverlayNode.supernode == nil {
self.insertSubnode(self.leftOverlayNode, aboveSubnode: self.listNode)
}
if self.rightOverlayNode.supernode == nil { if self.rightOverlayNode.supernode == nil {
self.insertSubnode(self.rightOverlayNode, aboveSubnode: self.listNode) self.insertSubnode(self.rightOverlayNode, aboveSubnode: self.listNode)
} }
if self.leftOverlayNode.supernode == nil {
self.insertSubnode(self.leftOverlayNode, aboveSubnode: self.listNode)
}
if let toolbarItem = self.toolbarItem { if let toolbarItem = self.toolbarItem {
var tabBarHeight: CGFloat var tabBarHeight: CGFloat

View File

@ -1080,14 +1080,16 @@ static UIImageOrientation TGSnapshotOrientationForVideoOrientation(bool mirrored
[[SQueue concurrentDefaultQueue] dispatch:^ [[SQueue concurrentDefaultQueue] dispatch:^
{ {
TGDispatchOnMainThread(^{ TGDispatchOnMainThread(^{
bool mirrored = self.requestPreviewIsMirrored(); if (self.requestPreviewIsMirrored != nil) {
UIImageOrientation orientation = TGSnapshotOrientationForVideoOrientation(mirrored); bool mirrored = self.requestPreviewIsMirrored();
[[SQueue concurrentDefaultQueue] dispatch:^ UIImageOrientation orientation = TGSnapshotOrientationForVideoOrientation(mirrored);
{ [[SQueue concurrentDefaultQueue] dispatch:^
UIImage *image = [self imageFromSampleBuffer:sampleBuffer orientation:orientation]; {
CFRelease(sampleBuffer); UIImage *image = [self imageFromSampleBuffer:sampleBuffer orientation:orientation];
capturedFrameCompletion(image); CFRelease(sampleBuffer);
}]; capturedFrameCompletion(image);
}];
}
}); });
}]; }];
} }

View File

@ -329,7 +329,7 @@ public final class SecureIdAuthController: ViewController, StandalonePresentable
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
(strongSelf.navigationController as? NavigationController)?.pushViewController(infoController) (strongSelf.navigationController as? NavigationController)?.pushViewController(infoController)
} }
}) })

View File

@ -371,7 +371,7 @@ public func channelBlacklistController(context: AccountContext, updatedPresentat
if let navigationController = getNavigationControllerImpl?() { if let navigationController = getNavigationControllerImpl?() {
context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(participant.peer.id))) context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(participant.peer.id)))
} }
} else if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: participant.peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { } else if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: participant.peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
pushControllerImpl?(infoController) pushControllerImpl?(infoController)
} }
})) }))

View File

@ -423,7 +423,7 @@ public func channelMembersController(context: AccountContext, updatedPresentatio
} }
})) }))
}, openPeer: { peer in }, openPeer: { peer in
if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
pushControllerImpl?(controller) pushControllerImpl?(controller)
} }
}, inviteViaLink: { }, inviteViaLink: {
@ -484,7 +484,7 @@ public func channelMembersController(context: AccountContext, updatedPresentatio
return state.withUpdatedSearchingMembers(false) return state.withUpdatedSearchingMembers(false)
} }
}, openPeer: { peer, _ in }, openPeer: { peer, _ in
if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
pushControllerImpl?(infoController) pushControllerImpl?(infoController)
} }
}, pushController: { c in }, pushController: { c in

View File

@ -698,7 +698,7 @@ public func channelPermissionsController(context: AccountContext, updatedPresent
}), ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) }), ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
}) })
}, openPeerInfo: { peer in }, openPeerInfo: { peer in
if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
pushControllerImpl?(controller) pushControllerImpl?(controller)
} }
}, openKicked: { }, openKicked: {

View File

@ -598,7 +598,7 @@ public func peersNearbyController(context: AccountContext) -> ViewController {
controller?.clearItemNodesHighlight(animated: true) controller?.clearItemNodesHighlight(animated: true)
} }
navigateToProfileImpl = { [weak controller] peer, distance in navigateToProfileImpl = { [weak controller] peer, distance in
if let navigationController = controller?.navigationController as? NavigationController, let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .nearbyPeer(distance: distance), avatarInitiallyExpanded: peer.largeProfileImage != nil, fromChat: false) { if let navigationController = controller?.navigationController as? NavigationController, let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .nearbyPeer(distance: distance), avatarInitiallyExpanded: peer.largeProfileImage != nil, fromChat: false, requestsContext: nil) {
navigationController.pushViewController(controller) navigationController.pushViewController(controller)
} }
} }

View File

@ -494,7 +494,7 @@ private final class BubbleSettingsToolbarNode: ASDisplayNode {
let switchItem = ItemListSwitchItem(presentationData: ItemListPresentationData(self.presentationData), title: self.presentationData.strings.Appearance_BubbleCorners_AdjustAdjacent, value: self.presentationThemeSettings.chatBubbleSettings.mergeBubbleCorners, disableLeadingInset: true, sectionId: 0, style: .blocks, updated: { [weak self] value in let switchItem = ItemListSwitchItem(presentationData: ItemListPresentationData(self.presentationData), title: self.presentationData.strings.Appearance_BubbleCorners_AdjustAdjacent, value: self.presentationThemeSettings.chatBubbleSettings.mergeBubbleCorners, disableLeadingInset: true, sectionId: 0, style: .blocks, updated: { [weak self] value in
self?.updateMergeBubbleCorners?(value) self?.updateMergeBubbleCorners?(value)
}) })
let cornerRadiusItem = BubbleSettingsRadiusItem(theme: self.presentationData.theme, value: Int(self.presentationData.chatBubbleCorners.mainRadius), enabled: true, disableLeadingInset: false, displayIcons: false, force: false, sectionId: 0, updated: { [weak self] value in let cornerRadiusItem = BubbleSettingsRadiusItem(theme: self.presentationData.theme, value: Int(self.presentationData.chatBubbleCorners.mainRadius), enabled: true, disableLeadingInset: false, displayIcons: false, disableDecorations: true, force: false, sectionId: 0, updated: { [weak self] value in
self?.updateCornerRadius?(Int32(max(8, min(16, value)))) self?.updateCornerRadius?(Int32(max(8, min(16, value))))
}) })

View File

@ -261,7 +261,7 @@ public func blockedPeersController(context: AccountContext, blockedPeersContext:
} }
})) }))
}, openPeer: { peer in }, openPeer: { peer in
if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
pushControllerImpl?(controller) pushControllerImpl?(controller)
} }
}) })

View File

@ -319,7 +319,7 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
return transaction.getPeer(peerId) return transaction.getPeer(peerId)
} }
|> deliverOnMainQueue).start(next: { peer in |> deliverOnMainQueue).start(next: { peer in
guard let peer = peer, let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) else { guard let peer = peer, let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) else {
return return
} }
pushControllerImpl?(controller) pushControllerImpl?(controller)

View File

@ -766,7 +766,7 @@ private final class TextSelectionToolbarNode: ASDisplayNode {
let switchItem = ItemListSwitchItem(presentationData: ItemListPresentationData(self.presentationData), title: self.presentationData.strings.Appearance_TextSize_UseSystem, value: self.presentationThemeSettings.useSystemFont, disableLeadingInset: true, sectionId: 0, style: .blocks, updated: { [weak self] value in let switchItem = ItemListSwitchItem(presentationData: ItemListPresentationData(self.presentationData), title: self.presentationData.strings.Appearance_TextSize_UseSystem, value: self.presentationThemeSettings.useSystemFont, disableLeadingInset: true, sectionId: 0, style: .blocks, updated: { [weak self] value in
self?.updateUseSystemFont?(value) self?.updateUseSystemFont?(value)
}) })
let fontSizeItem = ThemeSettingsFontSizeItem(theme: self.presentationData.theme, fontSize: self.customMode == .chat ? self.presentationThemeSettings.fontSize : self.presentationThemeSettings.listsFontSize, enabled: !self.presentationThemeSettings.useSystemFont, disableLeadingInset: true, force: true, sectionId: 0, updated: { [weak self] value in let fontSizeItem = ThemeSettingsFontSizeItem(theme: self.presentationData.theme, fontSize: self.customMode == .chat ? self.presentationThemeSettings.fontSize : self.presentationThemeSettings.listsFontSize, enabled: !self.presentationThemeSettings.useSystemFont, disableLeadingInset: true, disableDecorations: true, force: true, sectionId: 0, updated: { [weak self] value in
self?.updateCustomFontSize?(value) self?.updateCustomFontSize?(value)
}) })

View File

@ -16,18 +16,20 @@ class BubbleSettingsRadiusItem: ListViewItem, ItemListItem {
let value: Int let value: Int
let disableLeadingInset: Bool let disableLeadingInset: Bool
let displayIcons: Bool let displayIcons: Bool
let disableDecorations: Bool
let force: Bool let force: Bool
let enabled: Bool let enabled: Bool
let sectionId: ItemListSectionId let sectionId: ItemListSectionId
let updated: (Int) -> Void let updated: (Int) -> Void
let tag: ItemListItemTag? let tag: ItemListItemTag?
init(theme: PresentationTheme, value: Int, enabled: Bool = true, disableLeadingInset: Bool = false, displayIcons: Bool = true, force: Bool = false, sectionId: ItemListSectionId, updated: @escaping (Int) -> Void, tag: ItemListItemTag? = nil) { init(theme: PresentationTheme, value: Int, enabled: Bool = true, disableLeadingInset: Bool = false, displayIcons: Bool = true, disableDecorations: Bool = false, force: Bool = false, sectionId: ItemListSectionId, updated: @escaping (Int) -> Void, tag: ItemListItemTag? = nil) {
self.theme = theme self.theme = theme
self.value = value self.value = value
self.enabled = enabled self.enabled = enabled
self.disableLeadingInset = disableLeadingInset self.disableLeadingInset = disableLeadingInset
self.displayIcons = displayIcons self.displayIcons = displayIcons
self.disableDecorations = disableDecorations
self.force = force self.force = force
self.sectionId = sectionId self.sectionId = sectionId
self.updated = updated self.updated = updated
@ -213,7 +215,7 @@ class BubbleSettingsRadiusItemNode: ListViewItemNode, ItemListItemNode {
strongSelf.insertSubnode(strongSelf.maskNode, at: 3) strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
} }
let hasCorners = itemListHasRoundedBlockLayout(params) let hasCorners = itemListHasRoundedBlockLayout(params) && !item.disableDecorations
var hasTopCorners = false var hasTopCorners = false
var hasBottomCorners = false var hasBottomCorners = false
switch neighbors.top { switch neighbors.top {

View File

@ -114,7 +114,7 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry {
case themes(PresentationTheme, PresentationStrings, [PresentationThemeReference], PresentationThemeReference, Bool, [String: [StickerPackItem]]) case themes(PresentationTheme, PresentationStrings, [PresentationThemeReference], PresentationThemeReference, Bool, [String: [StickerPackItem]])
case chatTheme(PresentationTheme, String) case chatTheme(PresentationTheme, String)
case wallpaper(PresentationTheme, String) case wallpaper(PresentationTheme, String)
case autoNight(PresentationTheme, String, Bool) case autoNight(PresentationTheme, String, Bool, Bool)
case autoNightTheme(PresentationTheme, String, String) case autoNightTheme(PresentationTheme, String, String)
case textSize(PresentationTheme, String, String) case textSize(PresentationTheme, String, String)
case bubbleSettings(PresentationTheme, String, String) case bubbleSettings(PresentationTheme, String, String)
@ -201,8 +201,8 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry {
} else { } else {
return false return false
} }
case let .autoNight(lhsTheme, lhsText, lhsValue): case let .autoNight(lhsTheme, lhsText, lhsValue, lhsEnabled):
if case let .autoNight(rhsTheme, rhsText, rhsValue) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsValue == rhsValue { if case let .autoNight(rhsTheme, rhsText, rhsValue, rhsEnabled) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsValue == rhsValue, lhsEnabled == rhsEnabled {
return true return true
} else { } else {
return false return false
@ -293,8 +293,8 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry {
return ItemListDisclosureItem(presentationData: presentationData, title: text, label: "", sectionId: self.section, style: .blocks, action: { return ItemListDisclosureItem(presentationData: presentationData, title: text, label: "", sectionId: self.section, style: .blocks, action: {
arguments.openWallpaperSettings() arguments.openWallpaperSettings()
}) })
case let .autoNight(_, title, value): case let .autoNight(_, title, value, enabled):
return ItemListSwitchItem(presentationData: presentationData, title: title, value: value, sectionId: self.section, style: .blocks, updated: { value in return ItemListSwitchItem(presentationData: presentationData, title: title, value: value, enabled: enabled, sectionId: self.section, style: .blocks, updated: { value in
arguments.toggleNightTheme(value) arguments.toggleNightTheme(value)
}, tag: nil) }, tag: nil)
case let .autoNightTheme(_, text, value): case let .autoNightTheme(_, text, value):
@ -380,7 +380,7 @@ private func themeSettingsControllerEntries(presentationData: PresentationData,
entries.append(.chatTheme(presentationData.theme, "Chat Themes")) entries.append(.chatTheme(presentationData.theme, "Chat Themes"))
entries.append(.wallpaper(presentationData.theme, strings.Settings_ChatBackground)) entries.append(.wallpaper(presentationData.theme, strings.Settings_ChatBackground))
entries.append(.autoNight(presentationData.theme, strings.Appearance_NightTheme, presentationThemeSettings.automaticThemeSwitchSetting.force)) entries.append(.autoNight(presentationData.theme, strings.Appearance_NightTheme, presentationThemeSettings.automaticThemeSwitchSetting.force, !presentationData.autoNightModeTriggered || presentationThemeSettings.automaticThemeSwitchSetting.force))
let autoNightMode: String let autoNightMode: String
switch presentationThemeSettings.automaticThemeSwitchSetting.trigger { switch presentationThemeSettings.automaticThemeSwitchSetting.trigger {
case .system: case .system:

View File

@ -16,19 +16,21 @@ class ThemeSettingsFontSizeItem: ListViewItem, ItemListItem {
let fontSize: PresentationFontSize let fontSize: PresentationFontSize
let disableLeadingInset: Bool let disableLeadingInset: Bool
let displayIcons: Bool let displayIcons: Bool
let disableDecorations: Bool
let force: Bool let force: Bool
let enabled: Bool let enabled: Bool
let sectionId: ItemListSectionId let sectionId: ItemListSectionId
let updated: (PresentationFontSize) -> Void let updated: (PresentationFontSize) -> Void
let tag: ItemListItemTag? let tag: ItemListItemTag?
init(theme: PresentationTheme, fontSize: PresentationFontSize, enabled: Bool = true, disableLeadingInset: Bool = false, displayIcons: Bool = true, force: Bool = false, sectionId: ItemListSectionId, updated: @escaping (PresentationFontSize) -> Void, tag: ItemListItemTag? = nil) { init(theme: PresentationTheme, fontSize: PresentationFontSize, enabled: Bool = true, disableLeadingInset: Bool = false, displayIcons: Bool = true, disableDecorations: Bool = false, force: Bool = false, sectionId: ItemListSectionId, updated: @escaping (PresentationFontSize) -> Void, tag: ItemListItemTag? = nil) {
self.theme = theme self.theme = theme
self.fontSize = fontSize self.fontSize = fontSize
self.enabled = enabled self.enabled = enabled
self.disableLeadingInset = disableLeadingInset self.disableLeadingInset = disableLeadingInset
self.displayIcons = displayIcons self.displayIcons = displayIcons
self.force = force self.force = force
self.disableDecorations = disableDecorations
self.sectionId = sectionId self.sectionId = sectionId
self.updated = updated self.updated = updated
self.tag = tag self.tag = tag
@ -222,7 +224,7 @@ class ThemeSettingsFontSizeItemNode: ListViewItemNode, ItemListItemNode {
strongSelf.insertSubnode(strongSelf.maskNode, at: 3) strongSelf.insertSubnode(strongSelf.maskNode, at: 3)
} }
let hasCorners = itemListHasRoundedBlockLayout(params) let hasCorners = itemListHasRoundedBlockLayout(params) && !item.disableDecorations
var hasTopCorners = false var hasTopCorners = false
var hasBottomCorners = false var hasBottomCorners = false
switch neighbors.top { switch neighbors.top {

View File

@ -873,7 +873,7 @@ public func groupStatsController(context: AccountContext, updatedPresentationDat
let _ = (context.account.postbox.loadedPeerWithId(peerId) let _ = (context.account.postbox.loadedPeerWithId(peerId)
|> take(1) |> take(1)
|> deliverOnMainQueue).start(next: { peer in |> deliverOnMainQueue).start(next: { peer in
if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
navigationController.pushViewController(controller) navigationController.pushViewController(controller)
} }
}) })

View File

@ -2850,7 +2850,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
self.chatTitleView?.pressed = { [weak self] in self.chatTitleView?.pressed = { [weak self] in
if let strongSelf = self { if let strongSelf = self {
if strongSelf.chatLocation == .peer(strongSelf.context.account.peerId) { if strongSelf.chatLocation == .peer(strongSelf.context.account.peerId) {
if let peer = strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer, let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: true) { if let peer = strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer, let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: true, requestsContext: nil) {
strongSelf.effectiveNavigationController?.pushViewController(infoController) strongSelf.effectiveNavigationController?.pushViewController(infoController)
} }
} else { } else {
@ -9027,7 +9027,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|> deliverOnMainQueue).start(next: { [weak self] peerView in |> deliverOnMainQueue).start(next: { [weak self] peerView in
if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil && !strongSelf.presentationInterfaceState.isNotAccessible { if let strongSelf = self, let peer = peerView.peers[peerView.peerId], peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil && !strongSelf.presentationInterfaceState.isNotAccessible {
if peer.id == strongSelf.context.account.peerId { if peer.id == strongSelf.context.account.peerId {
if let peer = strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer, let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: true) { if let peer = strongSelf.presentationInterfaceState.renderedPeer?.chatMainPeer, let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: true, requestsContext: nil) {
strongSelf.effectiveNavigationController?.pushViewController(infoController) strongSelf.effectiveNavigationController?.pushViewController(infoController)
} }
} else { } else {
@ -9038,7 +9038,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if let validLayout = strongSelf.validLayout, validLayout.deviceMetrics.type == .tablet { if let validLayout = strongSelf.validLayout, validLayout.deviceMetrics.type == .tablet {
expandAvatar = false expandAvatar = false
} }
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: .generic, avatarInitiallyExpanded: expandAvatar, fromChat: true) { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: .generic, avatarInitiallyExpanded: expandAvatar, fromChat: true, requestsContext: strongSelf.inviteRequestsContext) {
strongSelf.effectiveNavigationController?.pushViewController(infoController) strongSelf.effectiveNavigationController?.pushViewController(infoController)
} }
} }
@ -11948,7 +11948,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if let validLayout = strongSelf.validLayout, validLayout.deviceMetrics.type == .tablet { if let validLayout = strongSelf.validLayout, validLayout.deviceMetrics.type == .tablet {
expandAvatar = false expandAvatar = false
} }
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: mode, avatarInitiallyExpanded: expandAvatar, fromChat: false) { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: mode, avatarInitiallyExpanded: expandAvatar, fromChat: false, requestsContext: nil) {
strongSelf.effectiveNavigationController?.pushViewController(infoController) strongSelf.effectiveNavigationController?.pushViewController(infoController)
} }
} }
@ -12407,7 +12407,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|> take(1) |> take(1)
|> deliverOnMainQueue).start(next: { [weak self] peer in |> deliverOnMainQueue).start(next: { [weak self] peer in
if let strongSelf = self, peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil { if let strongSelf = self, peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil {
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
strongSelf.effectiveNavigationController?.pushViewController(infoController) strongSelf.effectiveNavigationController?.pushViewController(infoController)
} }
} }

View File

@ -764,7 +764,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
if peer is TelegramChannel, let navigationController = strongSelf.getNavigationController() { if peer is TelegramChannel, let navigationController = strongSelf.getNavigationController() {
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer.id), peekData: peekData, animated: true)) strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer.id), peekData: peekData, animated: true))
} else { } else {
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
strongSelf.pushController(infoController) strongSelf.pushController(infoController)
} }
} }
@ -778,7 +778,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
|> deliverOnMainQueue).start(next: { [weak self] peer in |> deliverOnMainQueue).start(next: { [weak self] peer in
if let strongSelf = self { if let strongSelf = self {
if let peer = peer { if let peer = peer {
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
strongSelf.pushController(infoController) strongSelf.pushController(infoController)
} }
} }

View File

@ -17,7 +17,7 @@ func openAddContactImpl(context: AccountContext, firstName: String = "", lastNam
let contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: firstName, lastName: lastName, phoneNumbers: [DeviceContactPhoneNumberData(label: label, value: phoneNumber)]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: [], note: "") let contactData = DeviceContactExtendedData(basicData: DeviceContactBasicData(firstName: firstName, lastName: lastName, phoneNumbers: [DeviceContactPhoneNumberData(label: label, value: phoneNumber)]), middleName: "", prefix: "", suffix: "", organization: "", jobTitle: "", department: "", emailAddresses: [], urls: [], addresses: [], birthdayDate: nil, socialProfiles: [], instantMessagingProfiles: [], note: "")
present(deviceContactInfoController(context: context, subject: .create(peer: nil, contactData: contactData, isSharing: false, shareViaException: false, completion: { peer, stableId, contactData in present(deviceContactInfoController(context: context, subject: .create(peer: nil, contactData: contactData, isSharing: false, shareViaException: false, completion: { peer, stableId, contactData in
if let peer = peer { if let peer = peer {
if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
pushController(infoController) pushController(infoController)
} }
} else { } else {

View File

@ -192,7 +192,7 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
case .info: case .info:
let _ = (context.account.postbox.loadedPeerWithId(peerId) let _ = (context.account.postbox.loadedPeerWithId(peerId)
|> deliverOnMainQueue).start(next: { peer in |> deliverOnMainQueue).start(next: { peer in
if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
context.sharedContext.applicationBindings.dismissNativeController() context.sharedContext.applicationBindings.dismissNativeController()
navigationController?.pushViewController(infoController) navigationController?.pushViewController(infoController)
} }
@ -480,7 +480,7 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
return transaction.getPeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(idValue))) return transaction.getPeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(idValue)))
} }
|> deliverOnMainQueue).start(next: { peer in |> deliverOnMainQueue).start(next: { peer in
if let peer = peer, let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let peer = peer, let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
navigationController?.pushViewController(controller) navigationController?.pushViewController(controller)
} }
}) })

View File

@ -182,6 +182,7 @@ final class PeerInfoScreenData {
let globalSettings: TelegramGlobalSettings? let globalSettings: TelegramGlobalSettings?
let invitations: PeerExportedInvitationsState? let invitations: PeerExportedInvitationsState?
let requests: PeerInvitationImportersState? let requests: PeerInvitationImportersState?
let requestsContext: PeerInvitationImportersContext?
init( init(
peer: Peer?, peer: Peer?,
@ -197,7 +198,8 @@ final class PeerInfoScreenData {
encryptionKeyFingerprint: SecretChatKeyFingerprint?, encryptionKeyFingerprint: SecretChatKeyFingerprint?,
globalSettings: TelegramGlobalSettings?, globalSettings: TelegramGlobalSettings?,
invitations: PeerExportedInvitationsState?, invitations: PeerExportedInvitationsState?,
requests: PeerInvitationImportersState? requests: PeerInvitationImportersState?,
requestsContext: PeerInvitationImportersContext?
) { ) {
self.peer = peer self.peer = peer
self.cachedData = cachedData self.cachedData = cachedData
@ -213,6 +215,7 @@ final class PeerInfoScreenData {
self.globalSettings = globalSettings self.globalSettings = globalSettings
self.invitations = invitations self.invitations = invitations
self.requests = requests self.requests = requests
self.requestsContext = requestsContext
} }
} }
@ -437,12 +440,13 @@ func peerInfoScreenSettingsData(context: AccountContext, peerId: EnginePeer.Id,
encryptionKeyFingerprint: nil, encryptionKeyFingerprint: nil,
globalSettings: globalSettings, globalSettings: globalSettings,
invitations: nil, invitations: nil,
requests: nil requests: nil,
requestsContext: nil
) )
} }
} }
func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, isSettings: Bool, ignoreGroupInCommon: PeerId?) -> Signal<PeerInfoScreenData, NoError> { func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, isSettings: Bool, ignoreGroupInCommon: PeerId?, existingRequestsContext: PeerInvitationImportersContext?) -> Signal<PeerInfoScreenData, NoError> {
return peerInfoScreenInputData(context: context, peerId: peerId, isSettings: isSettings) return peerInfoScreenInputData(context: context, peerId: peerId, isSettings: isSettings)
|> mapToSignal { inputData -> Signal<PeerInfoScreenData, NoError> in |> mapToSignal { inputData -> Signal<PeerInfoScreenData, NoError> in
switch inputData { switch inputData {
@ -461,7 +465,8 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
encryptionKeyFingerprint: nil, encryptionKeyFingerprint: nil,
globalSettings: nil, globalSettings: nil,
invitations: nil, invitations: nil,
requests: nil requests: nil,
requestsContext: nil
)) ))
case let .user(userPeerId, secretChatId, kind): case let .user(userPeerId, secretChatId, kind):
let groupsInCommon: GroupsInCommonContext? let groupsInCommon: GroupsInCommonContext?
@ -602,7 +607,8 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
encryptionKeyFingerprint: encryptionKeyFingerprint, encryptionKeyFingerprint: encryptionKeyFingerprint,
globalSettings: nil, globalSettings: nil,
invitations: nil, invitations: nil,
requests: nil requests: nil,
requestsContext: nil
) )
} }
case .channel: case .channel:
@ -666,7 +672,7 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
if currentRequestsContext == nil { if currentRequestsContext == nil {
if canManageInvitations { if canManageInvitations {
let requestsContext = context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests(query: nil)) let requestsContext = existingRequestsContext ?? context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests(query: nil))
requestsContextPromise.set(.single(requestsContext)) requestsContextPromise.set(.single(requestsContext))
requestsStatePromise.set(requestsContext.state |> map(Optional.init)) requestsStatePromise.set(requestsContext.state |> map(Optional.init))
} }
@ -686,7 +692,8 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
encryptionKeyFingerprint: nil, encryptionKeyFingerprint: nil,
globalSettings: nil, globalSettings: nil,
invitations: invitations, invitations: invitations,
requests: requests requests: requests,
requestsContext: currentRequestsContext
) )
} }
case let .group(groupId): case let .group(groupId):
@ -843,7 +850,7 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
if currentRequestsContext == nil { if currentRequestsContext == nil {
if canManageInvitations { if canManageInvitations {
let requestsContext = context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests(query: nil)) let requestsContext = existingRequestsContext ?? context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests(query: nil))
requestsContextPromise.set(.single(requestsContext)) requestsContextPromise.set(.single(requestsContext))
requestsStatePromise.set(requestsContext.state |> map(Optional.init)) requestsStatePromise.set(requestsContext.state |> map(Optional.init))
} }
@ -863,7 +870,8 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
encryptionKeyFingerprint: nil, encryptionKeyFingerprint: nil,
globalSettings: nil, globalSettings: nil,
invitations: invitations, invitations: invitations,
requests: requests requests: requests,
requestsContext: currentRequestsContext
) )
} }
} }

View File

@ -1612,7 +1612,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
} }
private var didSetReady = false private var didSetReady = false
init(controller: PeerInfoScreenImpl, context: AccountContext, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, callMessages: [Message], isSettings: Bool, ignoreGroupInCommon: PeerId?) { init(controller: PeerInfoScreenImpl, context: AccountContext, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, callMessages: [Message], isSettings: Bool, ignoreGroupInCommon: PeerId?, requestsContext: PeerInvitationImportersContext?) {
self.controller = controller self.controller = controller
self.context = context self.context = context
self.peerId = peerId self.peerId = peerId
@ -2883,7 +2883,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
})) }))
} }
} else { } else {
screenData = peerInfoScreenData(context: context, peerId: peerId, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, isSettings: self.isSettings, ignoreGroupInCommon: ignoreGroupInCommon) screenData = peerInfoScreenData(context: context, peerId: peerId, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, isSettings: self.isSettings, ignoreGroupInCommon: ignoreGroupInCommon, existingRequestsContext: requestsContext)
self.headerNode.displayAvatarContextMenu = { [weak self] node, gesture in self.headerNode.displayAvatarContextMenu = { [weak self] node, gesture in
guard let strongSelf = self, let peer = strongSelf.data?.peer else { guard let strongSelf = self, let peer = strongSelf.data?.peer else {
@ -3255,7 +3255,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|> take(1) |> take(1)
|> deliverOnMainQueue).start(next: { [weak self] peer in |> deliverOnMainQueue).start(next: { [weak self] peer in
if let strongSelf = self, peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil { if let strongSelf = self, peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil {
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
strongSelf.controller?.push(infoController) strongSelf.controller?.push(infoController)
} }
} }
@ -3329,7 +3329,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|> take(1) |> take(1)
|> deliverOnMainQueue).start(next: { [weak self] peer in |> deliverOnMainQueue).start(next: { [weak self] peer in
if let strongSelf = self, peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil { if let strongSelf = self, peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil {
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
(strongSelf.controller?.navigationController as? NavigationController)?.pushViewController(infoController) (strongSelf.controller?.navigationController as? NavigationController)?.pushViewController(infoController)
} }
} }
@ -4824,7 +4824,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
case .banned: case .banned:
self.controller?.push(channelBlacklistController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: self.peerId)) self.controller?.push(channelBlacklistController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: self.peerId))
case .memberRequests: case .memberRequests:
self.controller?.push(inviteRequestsController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: self.peerId)) self.controller?.push(inviteRequestsController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: self.peerId, existingContext: self.data?.requestsContext))
} }
} }
@ -4928,7 +4928,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
if isMember { if isMember {
mode = .group(self.peerId) mode = .group(self.peerId)
} }
if let infoController = self.context.sharedContext.makePeerInfoController(context: self.context, updatedPresentationData: nil, peer: peer, mode: mode, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = self.context.sharedContext.makePeerInfoController(context: self.context, updatedPresentationData: nil, peer: peer, mode: mode, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
(self.controller?.navigationController as? NavigationController)?.pushViewController(infoController) (self.controller?.navigationController as? NavigationController)?.pushViewController(infoController)
} }
} }
@ -6585,8 +6585,8 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
} }
let relativeHeaderFrame = self.headerNode.view.convert(self.headerNode.bounds, to: self.view) let relativeHeaderFrame = self.headerNode.view.convert(self.headerNode.bounds, to: self.view)
self.leftOverlayNode.frame = CGRect(x: 0.0, y: relativeHeaderFrame.maxY + UIScreenPixel - self.scrollNode.view.contentOffset.y, width: currentInsets.left, height: layout.size.height * 2.0) self.leftOverlayNode.frame = CGRect(x: 0.0, y: relativeHeaderFrame.maxY + UIScreenPixel - self.scrollNode.view.contentOffset.y, width: currentInsets.left, height: layout.size.height * 10.0)
self.rightOverlayNode.frame = CGRect(x: layout.size.width - currentInsets.right, y: relativeHeaderFrame.maxY + UIScreenPixel - self.scrollNode.view.contentOffset.y, width: currentInsets.right, height: layout.size.height * 2.0) self.rightOverlayNode.frame = CGRect(x: layout.size.width - currentInsets.right, y: relativeHeaderFrame.maxY + UIScreenPixel - self.scrollNode.view.contentOffset.y, width: currentInsets.right, height: layout.size.height * 10.0)
if additive { if additive {
transition.updateFrameAdditive(node: self.paneContainerNode, frame: paneContainerFrame) transition.updateFrameAdditive(node: self.paneContainerNode, frame: paneContainerFrame)
@ -6934,6 +6934,7 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen {
private let callMessages: [Message] private let callMessages: [Message]
private let isSettings: Bool private let isSettings: Bool
private let ignoreGroupInCommon: PeerId? private let ignoreGroupInCommon: PeerId?
private weak var requestsContext: PeerInvitationImportersContext?
fileprivate var presentationData: PresentationData fileprivate var presentationData: PresentationData
private var presentationDataDisposable: Disposable? private var presentationDataDisposable: Disposable?
@ -6958,7 +6959,7 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen {
private var validLayout: (layout: ContainerViewLayout, navigationHeight: CGFloat)? private var validLayout: (layout: ContainerViewLayout, navigationHeight: CGFloat)?
public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, callMessages: [Message], isSettings: Bool = false, ignoreGroupInCommon: PeerId? = nil) { public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, callMessages: [Message], isSettings: Bool = false, ignoreGroupInCommon: PeerId? = nil, requestsContext: PeerInvitationImportersContext? = nil) {
self.context = context self.context = context
self.updatedPresentationData = updatedPresentationData self.updatedPresentationData = updatedPresentationData
self.peerId = peerId self.peerId = peerId
@ -6968,6 +6969,7 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen {
self.callMessages = callMessages self.callMessages = callMessages
self.isSettings = isSettings self.isSettings = isSettings
self.ignoreGroupInCommon = ignoreGroupInCommon self.ignoreGroupInCommon = ignoreGroupInCommon
self.requestsContext = requestsContext
self.presentationData = updatedPresentationData?.0 ?? context.sharedContext.currentPresentationData.with { $0 } self.presentationData = updatedPresentationData?.0 ?? context.sharedContext.currentPresentationData.with { $0 }
@ -7253,7 +7255,7 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen {
} }
override public func loadDisplayNode() { override public func loadDisplayNode() {
self.displayNode = PeerInfoScreenNode(controller: self, context: self.context, peerId: self.peerId, avatarInitiallyExpanded: self.avatarInitiallyExpanded, isOpenedFromChat: self.isOpenedFromChat, nearbyPeerDistance: self.nearbyPeerDistance, callMessages: self.callMessages, isSettings: self.isSettings, ignoreGroupInCommon: self.ignoreGroupInCommon) self.displayNode = PeerInfoScreenNode(controller: self, context: self.context, peerId: self.peerId, avatarInitiallyExpanded: self.avatarInitiallyExpanded, isOpenedFromChat: self.isOpenedFromChat, nearbyPeerDistance: self.nearbyPeerDistance, callMessages: self.callMessages, isSettings: self.isSettings, ignoreGroupInCommon: self.ignoreGroupInCommon, requestsContext: requestsContext)
self.controllerNode.accountsAndPeers.set(self.accountsAndPeers.get() |> map { $0.1 }) self.controllerNode.accountsAndPeers.set(self.accountsAndPeers.get() |> map { $0.1 })
self.controllerNode.activeSessionsContextAndCount.set(self.activeSessionsContextAndCount.get()) self.controllerNode.activeSessionsContextAndCount.set(self.activeSessionsContextAndCount.get())
self.cachedDataPromise.set(self.controllerNode.cachedDataPromise.get()) self.cachedDataPromise.set(self.controllerNode.cachedDataPromise.get())

View File

@ -349,7 +349,7 @@ public func pollResultsController(context: AccountContext, messageId: MessageId,
}) })
}, openPeer: { peer in }, openPeer: { peer in
if let peer = peer.peers[peer.peerId] { if let peer = peer.peers[peer.peerId] {
if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
pushControllerImpl?(controller) pushControllerImpl?(controller)
} }
} }

View File

@ -1101,7 +1101,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
handleTextLinkActionImpl(context: context, peerId: peerId, navigateDisposable: navigateDisposable, controller: controller, action: action, itemLink: itemLink) handleTextLinkActionImpl(context: context, peerId: peerId, navigateDisposable: navigateDisposable, controller: controller, action: action, itemLink: itemLink)
} }
public func makePeerInfoController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peer: Peer, mode: PeerInfoControllerMode, avatarInitiallyExpanded: Bool, fromChat: Bool) -> ViewController? { public func makePeerInfoController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peer: Peer, mode: PeerInfoControllerMode, avatarInitiallyExpanded: Bool, fromChat: Bool, requestsContext: PeerInvitationImportersContext?) -> ViewController? {
let controller = peerInfoControllerImpl(context: context, updatedPresentationData: updatedPresentationData, peer: peer, mode: mode, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: fromChat) let controller = peerInfoControllerImpl(context: context, updatedPresentationData: updatedPresentationData, peer: peer, mode: mode, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: fromChat)
controller?.navigationPresentation = .modalInLargeLayout controller?.navigationPresentation = .modalInLargeLayout
return controller return controller
@ -1417,7 +1417,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
private let defaultChatControllerInteraction = ChatControllerInteraction.default private let defaultChatControllerInteraction = ChatControllerInteraction.default
private func peerInfoControllerImpl(context: AccountContext, updatedPresentationData: (PresentationData, Signal<PresentationData, NoError>)?, peer: Peer, mode: PeerInfoControllerMode, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool) -> ViewController? { private func peerInfoControllerImpl(context: AccountContext, updatedPresentationData: (PresentationData, Signal<PresentationData, NoError>)?, peer: Peer, mode: PeerInfoControllerMode, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, requestsContext: PeerInvitationImportersContext? = nil) -> ViewController? {
if let _ = peer as? TelegramGroup { if let _ = peer as? TelegramGroup {
return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nil, callMessages: []) return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nil, callMessages: [])
} else if let _ = peer as? TelegramChannel { } else if let _ = peer as? TelegramChannel {

View File

@ -34,7 +34,7 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigate
peerSignal = context.account.postbox.loadedPeerWithId(peerId) |> map(Optional.init) peerSignal = context.account.postbox.loadedPeerWithId(peerId) |> map(Optional.init)
navigateDisposable.set((peerSignal |> take(1) |> deliverOnMainQueue).start(next: { peer in navigateDisposable.set((peerSignal |> take(1) |> deliverOnMainQueue).start(next: { peer in
if let controller = controller, let peer = peer { if let controller = controller, let peer = peer {
if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false) { if let infoController = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer, mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
(controller.navigationController as? NavigationController)?.pushViewController(infoController) (controller.navigationController as? NavigationController)?.pushViewController(infoController)
} }
} }