diff --git a/submodules/TelegramCore/Sources/State/PendingMessageManager.swift b/submodules/TelegramCore/Sources/State/PendingMessageManager.swift index 620c47927a..e51aaeb91c 100644 --- a/submodules/TelegramCore/Sources/State/PendingMessageManager.swift +++ b/submodules/TelegramCore/Sources/State/PendingMessageManager.swift @@ -56,6 +56,7 @@ public enum PendingMessageFailureReason { case mediaRestricted case slowmodeActive case tooMuchScheduled + case voiceMessagesForbidden } private func reasonForError(_ error: String) -> PendingMessageFailureReason? { @@ -69,6 +70,8 @@ private func reasonForError(_ error: String) -> PendingMessageFailureReason? { return .slowmodeActive } else if error.hasPrefix("SCHEDULE_TOO_MUCH") { return .tooMuchScheduled + } else if error.hasPrefix("VOICE_MESSAGES_FORBIDDEN") { + return .voiceMessagesForbidden } else { return nil } diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index a266da6424..0b352e0e31 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -7374,19 +7374,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.interfaceInteraction?.updateShowWebView { _ in return false } - - if !strongSelf.presentationInterfaceState.voiceMessagesAvailable { - if strongSelf.recordingModeFeedback == nil { - strongSelf.recordingModeFeedback = HapticFeedback() - strongSelf.recordingModeFeedback?.prepareError() - } - - strongSelf.chatDisplayNode.dismissInput() - - strongSelf.interfaceInteraction?.displayRestrictedInfo(.premiumVoiceMessages, .tooltip) - return - } - + let requestId = strongSelf.beginMediaRecordingRequestId let begin: () -> Void = { guard let strongSelf = self, strongSelf.beginMediaRecordingRequestId == requestId else { @@ -7555,29 +7543,34 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } if case .premiumVoiceMessages = subject { - let rect = strongSelf.chatDisplayNode.frameForInputActionButton() - if let rect = rect { - strongSelf.mediaRestrictedTooltipController?.dismiss() - let text: String - if let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer.flatMap({ EnginePeer($0) }) { - text = strongSelf.presentationInterfaceState.strings.Conversation_VoiceMessagesRestricted(peer.compactDisplayTitle).string - } else { - text = "" - } - let tooltipController = TooltipController(content: .text(text), baseFontSize: strongSelf.presentationData.listsFontSize.baseDisplaySize) - strongSelf.mediaRestrictedTooltipController = tooltipController - strongSelf.mediaRestrictedTooltipControllerMode = false - tooltipController.dismissed = { [weak tooltipController] _ in - if let strongSelf = self, let tooltipController = tooltipController, strongSelf.mediaRestrictedTooltipController === tooltipController { - strongSelf.mediaRestrictedTooltipController = nil + let text: String + if let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer.flatMap({ EnginePeer($0) }) { + text = strongSelf.presentationInterfaceState.strings.Conversation_VoiceMessagesRestricted(peer.compactDisplayTitle).string + } else { + text = "" + } + switch displayType { + case .tooltip: + let rect = strongSelf.chatDisplayNode.frameForInputActionButton() + if let rect = rect { + strongSelf.mediaRestrictedTooltipController?.dismiss() + let tooltipController = TooltipController(content: .text(text), baseFontSize: strongSelf.presentationData.listsFontSize.baseDisplaySize) + strongSelf.mediaRestrictedTooltipController = tooltipController + strongSelf.mediaRestrictedTooltipControllerMode = false + tooltipController.dismissed = { [weak tooltipController] _ in + if let strongSelf = self, let tooltipController = tooltipController, strongSelf.mediaRestrictedTooltipController === tooltipController { + strongSelf.mediaRestrictedTooltipController = nil + } + } + strongSelf.present(tooltipController, in: .window(.root), with: TooltipControllerPresentationArguments(sourceNodeAndRect: { + if let strongSelf = self { + return (strongSelf.chatDisplayNode, rect) + } + return nil + })) } - } - strongSelf.present(tooltipController, in: .window(.root), with: TooltipControllerPresentationArguments(sourceNodeAndRect: { - if let strongSelf = self { - return (strongSelf.chatDisplayNode, rect) - } - return nil - })) + case .alert: + strongSelf.present(textAlertController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) } } else if case .mediaRecording = subject, strongSelf.presentationInterfaceState.hasActiveGroupCall { let rect = strongSelf.chatDisplayNode.frameForInputActionButton() @@ -8934,6 +8927,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G case .tooMuchScheduled: text = strongSelf.presentationData.strings.Conversation_SendMessageErrorTooMuchScheduled moreInfo = false + case .voiceMessagesForbidden: + strongSelf.interfaceInteraction?.displayRestrictedInfo(.premiumVoiceMessages, .alert) + return } let actions: [TextAlertAction] if moreInfo { diff --git a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift index 692d82c6a2..132100c56a 100644 --- a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift @@ -694,7 +694,13 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } self.actionButtons.micButton.recordingDisabled = { [weak self] in - self?.interfaceInteraction?.displayRestrictedInfo(.mediaRecording, .tooltip) + if let strongSelf = self { + if strongSelf.presentationInterfaceState?.voiceMessagesAvailable == false { + self?.interfaceInteraction?.displayRestrictedInfo(.premiumVoiceMessages, .tooltip) + } else { + self?.interfaceInteraction?.displayRestrictedInfo(.mediaRecording, .tooltip) + } + } } self.actionButtons.micButton.beginRecording = { [weak self] in @@ -1895,7 +1901,9 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { } let mediaInputDisabled: Bool - if interfaceState.hasActiveGroupCall { + if !interfaceState.voiceMessagesAvailable { + mediaInputDisabled = true + } else if interfaceState.hasActiveGroupCall { mediaInputDisabled = true } else if let channel = interfaceState.renderedPeer?.peer as? TelegramChannel, channel.hasBannedPermission(.banSendMedia) != nil { mediaInputDisabled = true