diff --git a/submodules/TelegramUI/TelegramUI/ChannelInfoController.swift b/submodules/TelegramUI/TelegramUI/ChannelInfoController.swift index e1aa3d8747..97e590f45c 100644 --- a/submodules/TelegramUI/TelegramUI/ChannelInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/ChannelInfoController.swift @@ -881,7 +881,7 @@ public func channelInfoController(context: AccountContext, peerId: PeerId) -> Vi }, reportChannel: { presentControllerImpl?(peerReportOptionsController(context: context, subject: .peer(peerId), present: { c, a in presentControllerImpl?(c, a) - }), nil) + }, completion: { _ in }), nil) }, leaveChannel: { let _ = (context.account.postbox.transaction { transaction -> Peer? in return transaction.getPeer(peerId) diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 532e25a1f4..e1f6ff3bc6 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -2618,14 +2618,14 @@ public final class ChatController: TelegramBaseController, GalleryHiddenMediaTar if let strongSelf = self, let messageIds = strongSelf.presentationInterfaceState.interfaceState.selectionState?.selectedIds, !messageIds.isEmpty { strongSelf.present(peerReportOptionsController(context: strongSelf.context, subject: .messages(Array(messageIds).sorted()), present: { c, a in self?.present(c, in: .window(.root), with: a) - }), in: .window(.root)) + }, completion: { _ in }), in: .window(.root)) } }, reportMessages: { [weak self] messages in if let strongSelf = self, !messages.isEmpty { strongSelf.chatDisplayNode.dismissInput() strongSelf.present(peerReportOptionsController(context: strongSelf.context, subject: .messages(messages.map({ $0.id }).sorted()), present: { c, a in self?.present(c, in: .window(.root), with: a) - }), in: .window(.root)) + }, completion: { _ in }), in: .window(.root)) } }, deleteMessages: { [weak self] messages, contextController, completion in if let strongSelf = self, !messages.isEmpty { @@ -6087,6 +6087,12 @@ public final class ChatController: TelegramBaseController, GalleryHiddenMediaTar if let peer = peer as? TelegramChannel, let username = peer.username, !username.isEmpty { self.present(peerReportOptionsController(context: self.context, subject: .peer(peer.id), present: { [weak self] c, a in self?.present(c, in: .window(.root)) + }, completion: { [weak self] success in + guard let strongSelf = self, success else { + return + } + let _ = removePeerChat(account: strongSelf.context.account, peerId: chatPeer.id, reportChatSpam: false).start() + (strongSelf.navigationController as? NavigationController)?.filterController(strongSelf, animated: true) }), in: .window(.root)) } else if let _ = peer as? TelegramUser { let presentationData = self.presentationData diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index 1c60f92110..3164009fe3 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -294,7 +294,7 @@ public class PeerMediaCollectionController: TelegramBaseController { if let strongSelf = self, let messageIds = strongSelf.interfaceState.selectionState?.selectedIds, !messageIds.isEmpty { strongSelf.present(peerReportOptionsController(context: strongSelf.context, subject: .messages(Array(messageIds).sorted()), present: { c, a in self?.present(c, in: .window(.root), with: a) - }), in: .window(.root)) + }, completion: { _ in }), in: .window(.root)) } }, reportMessages: { _ in }, deleteMessages: { _, _, f in diff --git a/submodules/TelegramUI/TelegramUI/PeerReportController.swift b/submodules/TelegramUI/TelegramUI/PeerReportController.swift index fe0e527b9e..edf4060a39 100644 --- a/submodules/TelegramUI/TelegramUI/PeerReportController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerReportController.swift @@ -22,7 +22,7 @@ private enum PeerReportOption { case other } -func peerReportOptionsController(context: AccountContext, subject: PeerReportSubject, present: @escaping (ViewController, Any?) -> Void) -> ViewController { +func peerReportOptionsController(context: AccountContext, subject: PeerReportSubject, present: @escaping (ViewController, Any?) -> Void, completion: @escaping (Bool) -> Void) -> ViewController { let presentationData = context.sharedContext.currentPresentationData.with { $0 } let controller = ActionSheetController(theme: ActionSheetControllerTheme(presentationTheme: presentationData.theme)) @@ -75,15 +75,17 @@ func peerReportOptionsController(context: AccountContext, subject: PeerReportSub let _ = (reportPeer(account: context.account, peerId: peerId, reason: reportReason) |> deliverOnMainQueue).start(completed: { present(textAlertController(context: context, title: nil, text: presentationData.strings.ReportPeer_AlertSuccess, actions: [TextAlertAction(type: TextAlertActionType.defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + completion(true) }) case let .messages(messageIds): let _ = (reportPeerMessages(account: context.account, messageIds: messageIds, reason: reportReason) |> deliverOnMainQueue).start(completed: { present(textAlertController(context: context, title: nil, text: presentationData.strings.ReportPeer_AlertSuccess, actions: [TextAlertAction.init(type: TextAlertActionType.defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + completion(true) }) } } else { - controller?.present(peerReportController(context: context, subject: subject), in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + controller?.present(peerReportController(context: context, subject: subject, completion: completion), in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) } controller?.dismissAnimated() @@ -95,6 +97,7 @@ func peerReportOptionsController(context: AccountContext, subject: PeerReportSub ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { [weak controller] in controller?.dismissAnimated() + completion(false) }) ]) ]) @@ -187,7 +190,7 @@ private func peerReportControllerEntries(presentationData: PresentationData, sta return entries } -private func peerReportController(context: AccountContext, subject: PeerReportSubject) -> ViewController { +private func peerReportController(context: AccountContext, subject: PeerReportSubject, completion: @escaping (Bool) -> Void) -> ViewController { var dismissImpl: (() -> Void)? var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)? @@ -208,50 +211,52 @@ private func peerReportController(context: AccountContext, subject: PeerReportSu let reportDisposable = MetaDisposable() let signal = combineLatest(context.sharedContext.presentationData, statePromise.get()) - |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, PeerReportControllerEntry.ItemGenerationArguments)) in - let rightButton: ItemListNavigationButton - if state.isReporting { - rightButton = ItemListNavigationButton(content: .none, style: .activity, enabled: true, action: {}) - } else { - rightButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: !state.text.isEmpty, action: { - var text: String = "" - updateState { state in - var state = state - if !state.isReporting && !state.text.isEmpty { - text = state.text - state.isReporting = true - } - return state + |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, PeerReportControllerEntry.ItemGenerationArguments)) in + let rightButton: ItemListNavigationButton + if state.isReporting { + rightButton = ItemListNavigationButton(content: .none, style: .activity, enabled: true, action: {}) + } else { + rightButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: !state.text.isEmpty, action: { + var text: String = "" + updateState { state in + var state = state + if !state.isReporting && !state.text.isEmpty { + text = state.text + state.isReporting = true } - - if !text.isEmpty { - let completed: () -> Void = { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.ReportPeer_AlertSuccess, actions: [TextAlertAction.init(type: TextAlertActionType.defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) - dismissImpl?() - } - switch subject { - case let .peer(peerId): - reportDisposable.set((reportPeer(account: context.account, peerId: peerId, reason: .custom(text)) - |> deliverOnMainQueue).start(completed: { - completed() - })) - case let .messages(messageIds): - reportDisposable.set((reportPeerMessages(account: context.account, messageIds: messageIds, reason: .custom(text)) - |> deliverOnMainQueue).start(completed: { - completed() - })) - } + return state + } + + if !text.isEmpty { + let completed: () -> Void = { + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.ReportPeer_AlertSuccess, actions: [TextAlertAction.init(type: TextAlertActionType.defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + completion(true) + dismissImpl?() } - }) - } - - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.ReportPeer_ReasonOther_Title), leftNavigationButton: ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { - dismissImpl?() - }), rightNavigationButton: rightButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) - let listState = ItemListNodeState(entries: peerReportControllerEntries(presentationData: presentationData, state: state), style: .blocks, focusItemTag: PeerReportControllerEntryTag.text) - - return (controllerState, (listState, arguments)) + switch subject { + case let .peer(peerId): + reportDisposable.set((reportPeer(account: context.account, peerId: peerId, reason: .custom(text)) + |> deliverOnMainQueue).start(completed: { + completed() + })) + case let .messages(messageIds): + reportDisposable.set((reportPeerMessages(account: context.account, messageIds: messageIds, reason: .custom(text)) + |> deliverOnMainQueue).start(completed: { + completed() + })) + } + } + }) + } + + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.ReportPeer_ReasonOther_Title), leftNavigationButton: ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { + dismissImpl?() + completion(false) + }), rightNavigationButton: rightButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) + let listState = ItemListNodeState(entries: peerReportControllerEntries(presentationData: presentationData, state: state), style: .blocks, focusItemTag: PeerReportControllerEntryTag.text) + + return (controllerState, (listState, arguments)) } |> afterDisposed { reportDisposable.dispose() diff --git a/submodules/TelegramUI/TelegramUI/UserInfoController.swift b/submodules/TelegramUI/TelegramUI/UserInfoController.swift index 127d7d29c7..2fabcdb9de 100644 --- a/submodules/TelegramUI/TelegramUI/UserInfoController.swift +++ b/submodules/TelegramUI/TelegramUI/UserInfoController.swift @@ -1164,7 +1164,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Us }, report: { presentControllerImpl?(peerReportOptionsController(context: context, subject: .peer(peerId), present: { c, a in presentControllerImpl?(c, a) - }), nil) + }, completion: { _ in }), nil) }) let deviceContacts: Signal<[(DeviceContactStableId, DeviceContactBasicData)], NoError> = peerView.get()