diff --git a/TelegramUI/ChannelMembersController.swift b/TelegramUI/ChannelMembersController.swift index 57d286f5e2..0f7533300e 100644 --- a/TelegramUI/ChannelMembersController.swift +++ b/TelegramUI/ChannelMembersController.swift @@ -320,11 +320,13 @@ public func channelMembersController(account: Account, peerId: PeerId) -> ViewCo let arguments = ChannelMembersControllerArguments(account: account, addMember: { + let presentationData = account.telegramApplicationContext.currentPresentationData.with {$0} + actionsDisposable.add((peersPromise.get() |> take(1) |> deliverOnMainQueue).start(next: { members in let disabledIds = members?.compactMap({$0.peer.id}) ?? [] let contactsController = ContactMultiselectionController(account: account, mode: .peerSelection, options: [], filters: [.excludeSelf, .disable(disabledIds)]) - let addMembers: ([ContactListPeerId]) -> Signal = { members -> Signal in + let addMembers: ([ContactListPeerId]) -> Signal = { members -> Signal in let peerIds = members.compactMap { contact -> PeerId? in switch contact { case let .peer(peerId): @@ -340,7 +342,9 @@ public func channelMembersController(account: Account, peerId: PeerId) -> ViewCo |> deliverOnMainQueue |> mapToSignal { [weak contactsController] contacts in contactsController?.displayProgress = true - return addMembers(contacts) |> mapToSignal { _ in + return addMembers(contacts) |> `catch` { error -> Signal in + return .single(Void()) + } |> mapToSignal { _ in return channelMembers(postbox: account.postbox, network: account.network, peerId: peerId) } |> deliverOnMainQueue |> afterNext { _ in contactsController?.dismiss() diff --git a/TelegramUI/GroupInfoController.swift b/TelegramUI/GroupInfoController.swift index 33778c842b..e00107d472 100644 --- a/TelegramUI/GroupInfoController.swift +++ b/TelegramUI/GroupInfoController.swift @@ -1456,7 +1456,7 @@ public func groupInfoController(account: Account, peerId: PeerId) -> ViewControl } } - let addMembers: ([ContactListPeerId]) -> Signal = { members -> Signal in + let addMembers: ([ContactListPeerId]) -> Signal = { members -> Signal in let memberIds = members.compactMap { contact -> PeerId? in switch contact { case let .peer(peerId): @@ -1468,29 +1468,31 @@ public func groupInfoController(account: Account, peerId: PeerId) -> ViewControl return account.postbox.multiplePeersView(memberIds) |> take(1) |> deliverOnMainQueue - |> mapToSignal { view -> Signal in - updateState { state in - var state = state - for (memberId, peer) in view.peers { - var found = false - for participant in state.temporaryParticipants { - if participant.peer.id == memberId { - found = true - break + |> mapError { _ in return .generic} + |> mapToSignal { view -> Signal in + return account.telegramApplicationContext.peerChannelMemberCategoriesContextsManager.addMembers(account: account, peerId: peerId, memberIds: memberIds) |> map { _ in + updateState { state in + var state = state + for (memberId, peer) in view.peers { + var found = false + for participant in state.temporaryParticipants { + if participant.peer.id == memberId { + found = true + break + } + } + if !found { + let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) + var temporaryParticipants = state.temporaryParticipants + temporaryParticipants.append(TemporaryParticipant(peer: peer, presence: view.presences[memberId], timestamp: timestamp)) + state = state.withUpdatedTemporaryParticipants(temporaryParticipants) } } - if !found { - let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) - var temporaryParticipants = state.temporaryParticipants - temporaryParticipants.append(TemporaryParticipant(peer: peer, presence: view.presences[memberId], timestamp: timestamp)) - state = state.withUpdatedTemporaryParticipants(temporaryParticipants) - } + + return state + } - - return state - } - return account.telegramApplicationContext.peerChannelMemberCategoriesContextsManager.addMembers(account: account, peerId: peerId, memberIds: memberIds) } } @@ -1525,7 +1527,21 @@ public func groupInfoController(account: Account, peerId: PeerId) -> ViewControl contactsController?.displayProgress = true addMemberDisposable.set((addMembers(peers) - |> deliverOnMainQueue).start(completed: { + |> deliverOnMainQueue).start(error: { error in + if peers.count == 1, error == .restricted { + switch peers[0] { + case let .peer(peerId): + _ = (account.postbox.loadedPeerWithId(peerId) |> deliverOnMainQueue).start(next: { peer in + let alert = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: nil, text: presentationData.strings.Privacy_GroupsAndChannels_InviteToGroupError(peer.compactDisplayTitle, peer.compactDisplayTitle).0, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: {})]) + presentControllerImpl?(alert, nil) + }) + default: + break + } + } + + contactsController?.dismiss() + },completed: { contactsController?.dismiss() })) })) diff --git a/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift b/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift index 20361d2895..e57a10e3fc 100644 --- a/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift +++ b/TelegramUI/PeerChannelMemberCategoriesContextsManager.swift @@ -175,7 +175,7 @@ final class PeerChannelMemberCategoriesContextsManager { } } - func addMembers(account: Account, peerId: PeerId, memberIds: [PeerId]) -> Signal { + func addMembers(account: Account, peerId: PeerId, memberIds: [PeerId]) -> Signal { return addChannelMembers(account: account, peerId: peerId, memberIds: memberIds) |> deliverOnMainQueue |> beforeNext { [weak self] result in if let strongSelf = self { @@ -188,7 +188,7 @@ final class PeerChannelMemberCategoriesContextsManager { } } } - |> mapToSignal { _ -> Signal in + |> mapToSignal { _ -> Signal in return .single(Void()) } }