diff --git a/submodules/TelegramUI/Components/AdminUserActionsSheet/Sources/AdminUserActionsSheet.swift b/submodules/TelegramUI/Components/AdminUserActionsSheet/Sources/AdminUserActionsSheet.swift index e7d811f8f4..cb84bca837 100644 --- a/submodules/TelegramUI/Components/AdminUserActionsSheet/Sources/AdminUserActionsSheet.swift +++ b/submodules/TelegramUI/Components/AdminUserActionsSheet/Sources/AdminUserActionsSheet.swift @@ -529,12 +529,10 @@ private final class AdminUserActionsSheetComponent: Component { selectAll = true } else if case let .known(peerId) = cachedData.linkedDiscussionPeerId, let _ = peerId { selectAll = true - } else if case let .channel(channel) = component.chatPeer, let _ = channel.addressName { - selectAll = true } } - if selectAll { + if selectAll && !"".isEmpty { var selectedPeers = Set() for peer in component.peers { selectedPeers.insert(peer.peer.id) diff --git a/submodules/TelegramUI/Components/ForumSettingsScreen/Sources/ForumSettingsScreen.swift b/submodules/TelegramUI/Components/ForumSettingsScreen/Sources/ForumSettingsScreen.swift index 26bf968fc7..05194370d6 100644 --- a/submodules/TelegramUI/Components/ForumSettingsScreen/Sources/ForumSettingsScreen.swift +++ b/submodules/TelegramUI/Components/ForumSettingsScreen/Sources/ForumSettingsScreen.swift @@ -68,6 +68,7 @@ final class ForumSettingsScreenComponent: Component { private var peer: EnginePeer? private var peerDisposable: Disposable? + private var peerIdPromise = ValuePromise() private var isOn = false private var mode: ForumModeComponent.Mode = .tabs @@ -140,6 +141,65 @@ final class ForumSettingsScreenComponent: Component { transition.setAlpha(view: navigationTitleView, alpha: 1.0) } } + + func toggleTopicsEnabled(_ enabled: Bool) { + guard let component = self.component, let peer = self.peer else { + return + } + self.isOn = enabled + let displayForumAsTabs = self.mode == .tabs + + if self.isOn { + if case .legacyGroup = peer { + let context = component.context + let signal: Signal = context.engine.peers.convertGroupToSupergroup(peerId: peer.id, additionalProcessing: { upgradedPeerId -> Signal in + return context.engine.peers.setChannelForumMode(id: upgradedPeerId, isForum: true, displayForumAsTabs: false) + }) + |> map(Optional.init) + |> `catch` { [weak self] error -> Signal in + guard let self, let controller = self.environment?.controller() else { + return .single(nil) + } + switch error { + case .tooManyChannels: + Queue.mainQueue().async { + let oldChannelsController = context.sharedContext.makeOldChannelsController(context: context, updatedPresentationData: nil, intent: .upgrade, completed: { result in + + }) + controller.push(oldChannelsController) + } + default: + break + } + return .single(nil) + } + |> mapToSignal { upgradedPeerId -> Signal in + guard let upgradedPeerId = upgradedPeerId else { + return .single(nil) + } + return .single(upgradedPeerId) + } + |> deliverOnMainQueue + + let _ = signal.startStandalone(next: { [weak self] resultPeerId in + guard let self else { + return + } + if let resultPeerId { + self.peerIdPromise.set(resultPeerId) + } else { + self.isOn = false + self.state?.updated(transition: .easeInOut(duration: 0.2)) + } + }) + } else { + let _ = component.context.engine.peers.setChannelForumMode(id: peer.id, isForum: true, displayForumAsTabs: displayForumAsTabs).startStandalone() + } + } else { + let _ = component.context.engine.peers.setChannelForumMode(id: peer.id, isForum: false, displayForumAsTabs: displayForumAsTabs).startStandalone() + } + self.state?.updated(transition: .spring(duration: 0.4)) + } func update(component: ForumSettingsScreenComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment, transition: ComponentTransition) -> CGSize { self.isUpdating = true @@ -148,7 +208,12 @@ final class ForumSettingsScreenComponent: Component { } if self.component == nil { - self.peerDisposable = (component.context.engine.data.subscribe(TelegramEngine.EngineData.Item.Peer.Peer(id: component.peerId)) + self.peerIdPromise.set(component.peerId) + + self.peerDisposable = (self.peerIdPromise.get() + |> mapToSignal { peerId in + component.context.engine.data.subscribe(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)) + } |> deliverOnMainQueue).start(next: { [weak self] peer in guard let self else { return @@ -156,7 +221,9 @@ final class ForumSettingsScreenComponent: Component { self.peer = peer if case let .channel(channel) = peer { self.isOn = channel.flags.contains(.isForum) - self.mode = channel.flags.contains(.displayForumAsTabs) ? .tabs : .list + if self.isOn { + self.mode = channel.flags.contains(.displayForumAsTabs) ? .tabs : .list + } } self.state?.updated() }) @@ -285,13 +352,10 @@ final class ForumSettingsScreenComponent: Component { ))), ], alignment: .left, spacing: 2.0)), accessory: .toggle(ListActionItemComponent.Toggle(style: .regular, isOn: self.isOn, action: { [weak self] value in - guard let self, let component = self.component else { + guard let self else { return } - self.isOn = !self.isOn - let displayForumAsTabs = self.mode == .tabs - let _ = component.context.engine.peers.setChannelForumMode(id: component.peerId, isForum: self.isOn, displayForumAsTabs: displayForumAsTabs).startStandalone() - self.state?.updated(transition: .spring(duration: 0.4)) + self.toggleTopicsEnabled(value) })), action: nil ))))