diff --git a/submodules/TelegramUI/Components/CameraScreen/Sources/CameraScreen.swift b/submodules/TelegramUI/Components/CameraScreen/Sources/CameraScreen.swift index ca84139076..49e27803dc 100644 --- a/submodules/TelegramUI/Components/CameraScreen/Sources/CameraScreen.swift +++ b/submodules/TelegramUI/Components/CameraScreen/Sources/CameraScreen.swift @@ -1171,6 +1171,7 @@ public class CameraScreen: ViewController { } } fileprivate var hasGallery = false + fileprivate var postingAvailable = true private var presentationData: PresentationData private var validLayout: ContainerViewLayout? @@ -2154,7 +2155,7 @@ public class CameraScreen: ViewController { cameraAuthorizationStatus: self.cameraAuthorizationStatus, microphoneAuthorizationStatus: self.microphoneAuthorizationStatus, hasAppeared: self.hasAppeared, - isVisible: self.cameraIsActive && !self.hasGallery, + isVisible: self.cameraIsActive && !self.hasGallery && self.postingAvailable, panelWidth: panelWidth, animateFlipAction: self.animateFlipAction, animateShutter: { [weak self] in @@ -2435,6 +2436,8 @@ public class CameraScreen: ViewController { guard let self, availability != .available else { return } + self.node.postingAvailable = false + let subject: PremiumLimitSubject switch availability { case .expiringLimit: @@ -2462,7 +2465,9 @@ public class CameraScreen: ViewController { return } let isPremium = peer?.isPremium ?? false - if !isPremium { + if isPremium { + self.node.postingAvailable = true + } else { self.requestDismiss(animated: true) } }) diff --git a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift index b136f9e04f..5aa7ee0b44 100644 --- a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift +++ b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift @@ -3231,7 +3231,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate if self.entitiesView.selectedEntityView != nil || self.isDisplayingTool { bottomInputOffset = inputHeight / 2.0 } else { - bottomInputOffset = 0.0 //inputHeight - bottomInset - 17.0 + bottomInputOffset = 0.0 } } } @@ -3479,6 +3479,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate let stateContext = ShareWithPeersScreen.StateContext( context: self.context, subject: .stories(editing: false), + editing: false, initialPeerIds: Set(privacy.privacy.additionallyIncludePeers), closeFriends: self.closeFriends.get(), blockedPeersContext: self.storiesBlockedPeers @@ -3554,11 +3555,12 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate } else if privacy.base == .nobody { subject = .chats(blocked: false) } else { - subject = .contacts(privacy.base) + subject = .contacts(base: privacy.base) } let stateContext = ShareWithPeersScreen.StateContext( context: self.context, subject: subject, + editing: false, initialPeerIds: Set(privacy.additionallyIncludePeers), blockedPeersContext: self.storiesBlockedPeers ) @@ -3684,7 +3686,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate let controller = UndoOverlayController(presentationData: presentationData, content: .autoDelete(isOn: true, title: nil, text: text, customUndoText: nil), elevatedLayout: false, position: .top, animateInAsReplacement: false, action: { [weak self] action in if case .info = action, let self { - let controller = context.sharedContext.makePremiumIntroController(context: context, source: .stories, forceDark: true, dismissed: nil) + let controller = context.sharedContext.makePremiumIntroController(context: context, source: .storiesExpirationDurations, forceDark: true, dismissed: nil) self.push(controller) } return false } @@ -3723,7 +3725,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate let controller = UndoOverlayController(presentationData: presentationData, content: .linkCopied(text: text), elevatedLayout: false, position: .top, animateInAsReplacement: false, action: { [weak self] action in if case .info = action, let self { - let controller = context.sharedContext.makePremiumIntroController(context: context, source: .stories, forceDark: true, dismissed: nil) + let controller = context.sharedContext.makePremiumIntroController(context: context, source: .storiesFormatting, forceDark: true, dismissed: nil) self.push(controller) } return false } diff --git a/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift b/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift index 995f99f511..560d0d3a34 100644 --- a/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift +++ b/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift @@ -1626,7 +1626,7 @@ final class ShareWithPeersScreenComponent: Component { if let searchStateContext = self.searchStateContext, searchStateContext.subject == .search(query: self.navigationTextFieldState.text, onlyContacts: onlyContacts) { } else { self.searchStateDisposable?.dispose() - let searchStateContext = ShareWithPeersScreen.StateContext(context: component.context, subject: .search(query: self.navigationTextFieldState.text, onlyContacts: onlyContacts)) + let searchStateContext = ShareWithPeersScreen.StateContext(context: component.context, subject: .search(query: self.navigationTextFieldState.text, onlyContacts: onlyContacts), editing: false) var applyState = false self.searchStateDisposable = (searchStateContext.ready |> filter { $0 } |> take(1) |> deliverOnMainQueue).start(next: { [weak self] _ in guard let self else { @@ -1977,7 +1977,9 @@ final class ShareWithPeersScreenComponent: Component { let proceed = { var savePeers = true - if base == .closeFriends { + if component.stateContext.editing { + savePeers = false + } else if base == .closeFriends { savePeers = false } else { if case .stories = component.stateContext.subject { @@ -2023,7 +2025,7 @@ final class ShareWithPeersScreenComponent: Component { } if savePeers { - let _ = (updatePeersListStoredStateInteractively(engine: component.context.engine, base: base, peerIds: self.selectedPeers) + let _ = (updatePeersListStoredState(engine: component.context.engine, base: base, peerIds: self.selectedPeers) |> deliverOnMainQueue).start(completed: { complete() }) @@ -2261,13 +2263,14 @@ public class ShareWithPeersScreen: ViewControllerComponentContainer { public enum Subject: Equatable { case stories(editing: Bool) case chats(blocked: Bool) - case contacts(EngineStoryPrivacy.Base) + case contacts(base: EngineStoryPrivacy.Base) case search(query: String, onlyContacts: Bool) } fileprivate var stateValue: State? public let subject: Subject + public let editing: Bool public private(set) var initialPeerIds: Set = Set() fileprivate let blockedPeersContext: BlockedPeersContext? @@ -2284,11 +2287,14 @@ public class ShareWithPeersScreen: ViewControllerComponentContainer { public init( context: AccountContext, subject: Subject = .chats(blocked: false), + editing: Bool, + initialSelectedPeers: [EngineStoryPrivacy.Base: [EnginePeer.Id]] = [:], initialPeerIds: Set = Set(), closeFriends: Signal<[EnginePeer], NoError> = .single([]), blockedPeersContext: BlockedPeersContext? = nil ) { self.subject = subject + self.editing = editing self.initialPeerIds = initialPeerIds self.blockedPeersContext = blockedPeersContext @@ -2313,20 +2319,34 @@ public class ShareWithPeersScreen: ViewControllerComponentContainer { savedContactsExceptionPeers, savedSelectedPeers ) |> mapToSignal { everyone, contacts, selected -> Signal<([EnginePeer.Id: EnginePeer], [EnginePeer.Id], [EnginePeer.Id], [EnginePeer.Id]), NoError> in + var everyone = everyone + if let initialPeerIds = initialSelectedPeers[.everyone] { + everyone = initialPeerIds + } var everyonePeerSignals: [Signal] = [] if everyone.count < 3 { for peerId in everyone { everyonePeerSignals.append(context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId))) } } + + var contacts = contacts + if let initialPeerIds = initialSelectedPeers[.contacts] { + contacts = initialPeerIds + } var contactsPeerSignals: [Signal] = [] if contacts.count < 3 { for peerId in contacts { contactsPeerSignals.append(context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId))) } } + + var selected = selected + if let initialPeerIds = initialSelectedPeers[.nobody] { + selected = initialPeerIds + } var selectedPeerSignals: [Signal] = [] - if contacts.count < 3 { + if selected.count < 3 { for peerId in selected { selectedPeerSignals.append(context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId))) } @@ -2936,7 +2956,7 @@ private func peersListStoredState(engine: TelegramEngine, base: Stories.Item.Pri } } -private func updatePeersListStoredStateInteractively(engine: TelegramEngine, base: Stories.Item.Privacy.Base, peerIds: [EnginePeer.Id]) -> Signal { +private func updatePeersListStoredState(engine: TelegramEngine, base: Stories.Item.Privacy.Base, peerIds: [EnginePeer.Id]) -> Signal { let key = EngineDataBuffer(length: 4) key.setInt32(0, value: base.rawValue) diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift index 079c3b09f4..a555dd1448 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift @@ -4242,22 +4242,31 @@ public final class StoryItemSetContainerComponent: Component { self.component?.presentController(controller, nil) } - private func openItemPrivacySettings(initialPrivacy: EngineStoryPrivacy? = nil) { + private func openItemPrivacySettings(updatedPrivacy: EngineStoryPrivacy? = nil) { guard let component = self.component else { return } let context = component.context - let privacy = initialPrivacy ?? self.component?.slice.item.storyItem.privacy + let currentPrivacy = component.slice.item.storyItem.privacy ?? EngineStoryPrivacy(base: .everyone, additionallyIncludePeers: []) + + let privacy = updatedPrivacy ?? component.slice.item.storyItem.privacy guard let privacy else { return } + var selectedPeers: [EngineStoryPrivacy.Base: [EnginePeer.Id]] = [:] + selectedPeers[currentPrivacy.base] = currentPrivacy.additionallyIncludePeers + if let updatedPrivacy { + selectedPeers[updatedPrivacy.base] = updatedPrivacy.additionallyIncludePeers + } + let stateContext = ShareWithPeersScreen.StateContext( context: context, subject: .stories(editing: true), - initialPeerIds: Set(privacy.additionallyIncludePeers), + editing: true, + initialSelectedPeers: selectedPeers, closeFriends: component.closeFriends.get(), blockedPeersContext: component.blockedPeers ) @@ -4289,7 +4298,7 @@ public final class StoryItemSetContainerComponent: Component { guard let self else { return } - self.openItemPrivacySettings(initialPrivacy: privacy) + self.openItemPrivacySettings(updatedPrivacy: privacy) }) }, editBlockedPeers: { [weak self] privacy, _, _ in @@ -4300,7 +4309,7 @@ public final class StoryItemSetContainerComponent: Component { guard let self else { return } - self.openItemPrivacySettings(initialPrivacy: privacy) + self.openItemPrivacySettings(updatedPrivacy: privacy) }) } ) @@ -4328,11 +4337,12 @@ public final class StoryItemSetContainerComponent: Component { } else if privacy.base == .nobody { subject = .chats(blocked: false) } else { - subject = .contacts(privacy.base) + subject = .contacts(base: privacy.base) } let stateContext = ShareWithPeersScreen.StateContext( context: context, subject: subject, + editing: true, initialPeerIds: Set(privacy.additionallyIncludePeers), blockedPeersContext: component.blockedPeers )