From 400a67e240b259d0d33c3f407574780bd9106b98 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 22 Sep 2025 18:56:39 +0400 Subject: [PATCH] Various improvements --- .../Telegram-iOS/en.lproj/Localizable.strings | 10 ++-- .../Sources/PresentationGroupCall.swift | 7 ++- .../Sources/VideoChatScreen.swift | 8 ++- .../TelegramEngine/Calls/GroupCalls.swift | 15 +++--- .../Messages/TelegramEngineMessages.swift | 4 +- .../TelegramEngine/Peers/Birthdays.swift | 7 +-- .../PeerInfoScreenNoteListItem.swift | 4 +- .../PeerInfoScreen/Sources/PeerInfoData.swift | 7 ++- .../Sources/PeerInfoScreen.swift | 52 ++++++++++++------- .../TelegramUI/Sources/ChatController.swift | 2 +- .../Sources/SharedAccountContext.swift | 26 ++++++---- 11 files changed, 88 insertions(+), 54 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 35b52f42f3..5d4ace6a55 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -15070,7 +15070,7 @@ Error: %8$@"; "SuggestBirthdate.Accept.Title" = "Date of Birth"; "SuggestBirthdate.Accept.HideYear" = "Hide the Year"; "SuggestBirthdate.Accept.Action" = "Add to My Profile"; -"SuggestBirthdate.Accept.Added" = "Date of birth added."; +"SuggestBirthdate.Accept.Added" = "Date of birth added. You can change it in **Settings**."; "Notification.SuggestBirthdate" = "Suggested Date of Birth"; @@ -15085,7 +15085,9 @@ Error: %8$@"; "PeerInfo.Notes" = "notes"; "PeerInfo.NotesInfo" = "only visible to you"; +"PeerInfo.AddNotesPlaceholder" = "Add Notes"; +"PeerInfo.AddNotesInfo" = "Notes are only visible to you."; -"UserInfo.NoteActionCopy" = "Copy Note"; -"UserInfo.NoteActionEdit" = "Edit Note"; -"UserInfo.ToastNoteCopied" = "Note copied to clipboard."; +"PeerInfo.NoteActionCopy" = "Copy Note"; +"PeerInfo.NoteActionEdit" = "Edit Note"; +"PeerInfo.ToastNoteCopied" = "Note copied to clipboard."; diff --git a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift index 1548f895e0..2abe1cf67d 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationGroupCall.swift @@ -924,10 +924,15 @@ public final class PresentationGroupCallImpl: PresentationGroupCall { } if let initialCall { + var messageLifetime: Int32 = 10 + if let data = accountContext.currentAppConfiguration.with({ $0 }).data, let value = data["group_call_message_ttl"] as? Double { + messageLifetime = Int32(value) + } self.messagesContext = accountContext.engine.messages.groupCallMessages( callId: initialCall.description.id, reference: .id(id: initialCall.description.id, accessHash: initialCall.description.accessHash), - e2eContext: self.e2eContext + e2eContext: self.e2eContext, + messageLifetime: messageLifetime ) self.messagesStatePromise.set(self.messagesContext!.state) } diff --git a/submodules/TelegramCallsUI/Sources/VideoChatScreen.swift b/submodules/TelegramCallsUI/Sources/VideoChatScreen.swift index 0bcc243751..8343007c16 100644 --- a/submodules/TelegramCallsUI/Sources/VideoChatScreen.swift +++ b/submodules/TelegramCallsUI/Sources/VideoChatScreen.swift @@ -3442,6 +3442,12 @@ final class VideoChatScreenComponent: Component { nextInputMode = .emoji } + var characterLimit: Int = 128 + if let data = call.accountContext.currentAppConfiguration.with({ $0 }).data, let value = data["group_call_message_length_limit"] as? Double { + characterLimit = Int(value) + } + + //TODO:localize self.inputPanel.parentState = state inputPanelSize = self.inputPanel.update( transition: transition, @@ -3453,7 +3459,7 @@ final class VideoChatScreenComponent: Component { style: .glass, placeholder: .plain("Message"), sendPaidMessageStars: nil, - maxLength: 128, + maxLength: characterLimit, queryTypes: [.mention, .hashtag], alwaysDarkWhenHasText: false, useGrayBackground: false, diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Calls/GroupCalls.swift b/submodules/TelegramCore/Sources/TelegramEngine/Calls/GroupCalls.swift index 0f3448db00..1f2a90d176 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Calls/GroupCalls.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Calls/GroupCalls.swift @@ -3442,7 +3442,7 @@ public final class GroupCallMessagesContext { } private final class Impl { - private let defaultMessageLifetime: Int32 = 10 + private let messageLifetime: Int32 let queue: Queue let account: Account @@ -3464,12 +3464,13 @@ public final class GroupCallMessagesContext { private var messageLifeTimer: SwiftSignalKit.Timer? - init(queue: Queue, account: Account, callId: Int64, reference: InternalGroupCallReference, e2eContext: ConferenceCallE2EContext?) { + init(queue: Queue, account: Account, callId: Int64, reference: InternalGroupCallReference, e2eContext: ConferenceCallE2EContext?, messageLifetime: Int32) { self.queue = queue self.account = account self.callId = callId self.reference = reference self.e2eContext = e2eContext + self.messageLifetime = messageLifetime self.state = State(messages: []) self.stateValue.set(self.state) @@ -3535,7 +3536,7 @@ public final class GroupCallMessagesContext { text: text, entities: messageTextEntitiesFromApiEntities(entities), date: currentTime, - lifetime: self.defaultMessageLifetime + lifetime: self.messageLifetime )) } } @@ -3554,7 +3555,7 @@ public final class GroupCallMessagesContext { text: addedMessage.text, entities: addedMessage.entities, date: currentTime, - lifetime: self.defaultMessageLifetime + lifetime: self.messageLifetime )) } } @@ -3615,7 +3616,7 @@ public final class GroupCallMessagesContext { text: text, entities: entities, date: currentTime, - lifetime: self.defaultMessageLifetime + lifetime: self.messageLifetime )) self.state = state @@ -3657,11 +3658,11 @@ public final class GroupCallMessagesContext { } } - init(account: Account, callId: Int64, reference: InternalGroupCallReference, e2eContext: ConferenceCallE2EContext?) { + init(account: Account, callId: Int64, reference: InternalGroupCallReference, e2eContext: ConferenceCallE2EContext?, messageLifetime: Int32) { let queue = Queue(name: "GroupCallMessagesContext") self.queue = queue self.impl = QueueLocalObject(queue: queue, generate: { - return Impl(queue: queue, account: account, callId: callId, reference: reference, e2eContext: e2eContext) + return Impl(queue: queue, account: account, callId: callId, reference: reference, e2eContext: e2eContext, messageLifetime: messageLifetime) }) } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift index b8e432e461..325c7542d6 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift @@ -1632,8 +1632,8 @@ public extension TelegramEngine { return _internal_refreshGlobalPostSearchState(account: self.account) } - public func groupCallMessages(callId: Int64, reference: InternalGroupCallReference, e2eContext: ConferenceCallE2EContext?) -> GroupCallMessagesContext { - return GroupCallMessagesContext(account: self.account, callId: callId, reference: reference, e2eContext: e2eContext) + public func groupCallMessages(callId: Int64, reference: InternalGroupCallReference, e2eContext: ConferenceCallE2EContext?, messageLifetime: Int32) -> GroupCallMessagesContext { + return GroupCallMessagesContext(account: self.account, callId: callId, reference: reference, e2eContext: e2eContext, messageLifetime: messageLifetime) } } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/Birthdays.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/Birthdays.swift index 3984904512..31253d0ed9 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/Birthdays.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/Birthdays.swift @@ -99,11 +99,8 @@ func _internal_updateBirthday(account: Account, birthday: TelegramBirthday?) -> return account.postbox.transaction { transaction -> Void in if case .boolTrue = result { transaction.updatePeerCachedData(peerIds: Set([account.peerId]), update: { _, current in - if let current = current as? CachedUserData { - return current.withUpdatedBirthday(birthday) - } else { - return current - } + let current = current as? CachedUserData ?? CachedUserData() + return current.withUpdatedBirthday(birthday) }) } } diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/ListItems/PeerInfoScreenNoteListItem.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/ListItems/PeerInfoScreenNoteListItem.swift index c60a9be48d..f9231856cf 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/ListItems/PeerInfoScreenNoteListItem.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/ListItems/PeerInfoScreenNoteListItem.swift @@ -70,7 +70,7 @@ final class PeerInfoScreenNoteListItemNode: PeerInfoScreenItemNode { } var resetText: NSAttributedString? - if self.item == nil { + if self.item?.initialValue != item.initialValue { resetText = item.initialValue } @@ -97,7 +97,7 @@ final class PeerInfoScreenNoteListItemNode: PeerInfoScreenItemNode { self.textField.parentState = self.state let textFieldSize = self.textField.update( transition: .immediate, - component: AnyComponent(TextFieldComponent(context: context, theme: presentationData.theme, strings: presentationData.strings, externalState: self.textFieldExternalState, fontSize: 17.0, textColor: presentationData.theme.list.itemPrimaryTextColor, accentColor: presentationData.theme.list.itemAccentColor, insets: UIEdgeInsets(top: 9.0, left: 8.0, bottom: 10.0, right: 8.0), hideKeyboard: false, customInputView: nil, placeholder: NSAttributedString(string: "Add notes", font: Font.regular(17.0), textColor: presentationData.theme.list.itemPlaceholderTextColor), resetText: resetText, isOneLineWhenUnfocused: false, characterLimit: characterLimit, formatMenuAvailability: .available([.bold, .italic, .underline, .strikethrough, .spoiler]), lockedFormatAction: {}, present: { c in }, paste: { _ in })), + component: AnyComponent(TextFieldComponent(context: context, theme: presentationData.theme, strings: presentationData.strings, externalState: self.textFieldExternalState, fontSize: 17.0, textColor: presentationData.theme.list.itemPrimaryTextColor, accentColor: presentationData.theme.list.itemAccentColor, insets: UIEdgeInsets(top: 9.0, left: 8.0, bottom: 10.0, right: 8.0), hideKeyboard: false, customInputView: nil, placeholder: NSAttributedString(string: presentationData.strings.PeerInfo_AddNotesPlaceholder, font: Font.regular(17.0), textColor: presentationData.theme.list.itemPlaceholderTextColor), resetText: resetText, isOneLineWhenUnfocused: false, characterLimit: characterLimit, formatMenuAvailability: .available([.bold, .italic, .underline, .strikethrough, .spoiler]), lockedFormatAction: {}, present: { c in }, paste: { _ in })), environment: {}, containerSize: CGSize(width: width - sideInset * 2.0, height: .greatestFiniteMagnitude) ) diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoData.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoData.swift index 6ef23eda0c..3f92596c95 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoData.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoData.swift @@ -1064,7 +1064,8 @@ func peerInfoScreenData( chatLocationContextHolder: Atomic, sharedMediaFromForumTopic: (EnginePeer.Id, Int64)?, privacySettings: Signal, - forceHasGifts: Bool + forceHasGifts: Bool, + switchToUpgradableGifts: Bool ) -> Signal { return peerInfoScreenInputData(context: context, peerId: peerId, isSettings: isSettings) |> mapToSignal { inputData -> Signal in @@ -1140,6 +1141,10 @@ func peerInfoScreenData( if isMyProfile || userPeerId != context.account.peerId { profileGiftsContext = existingProfileGiftsContext ?? ProfileGiftsContext(account: context.account, peerId: userPeerId) profileGiftsCollectionsContext = existingProfileGiftsCollectionsContext ?? ProfileGiftsCollectionsContext(account: context.account, peerId: userPeerId, allGiftsContext: profileGiftsContext) + + if switchToUpgradableGifts { + profileGiftsContext?.updateFilter([.displayed, .hidden, .limitedUpgradable]) + } } else { profileGiftsContext = nil profileGiftsCollectionsContext = nil diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift index ab9e1ec9ad..2c664fd544 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift @@ -2181,7 +2181,6 @@ private func editingItems(data: PeerInfoScreenData?, boostStatus: ChannelBoostSt let compactName = EnginePeer(user).compactDisplayTitle if let cachedData = data.cachedData as? CachedUserData { - //TODO:localize items[.peerNote]!.append(PeerInfoScreenNoteListItem( id: ItemNote, initialValue: chatInputStateStringWithAppliedEntities(cachedData.note?.text ?? "", entities: cachedData.note?.entities ?? []), @@ -2193,7 +2192,7 @@ private func editingItems(data: PeerInfoScreenData?, boostStatus: ChannelBoostSt } )) - items[.peerNote]!.append(PeerInfoScreenCommentItem(id: ItemNoteInfo, text: "Notes are only visible to you.")) + items[.peerNote]!.append(PeerInfoScreenCommentItem(id: ItemNoteInfo, text: presentationData.strings.PeerInfo_AddNotesInfo)) if let _ = cachedData.sendPaidMessageStars { @@ -2973,7 +2972,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro private let chatLocation: ChatLocation private let chatLocationContextHolder: Atomic private let switchToStoryFolder: Int64? - private let switchToGiftCollection: Int64? + private let switchToGiftsTarget: PeerInfoSwitchToGiftsTarget? private let sharedMediaFromForumTopic: (EnginePeer.Id, Int64)? let isSettings: Bool @@ -3100,7 +3099,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } private var didSetReady = false - init(controller: PeerInfoScreenImpl, context: AccountContext, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, reactionSourceMessageId: MessageId?, callMessages: [Message], isSettings: Bool, isMyProfile: Bool, hintGroupInCommon: PeerId?, requestsContext: PeerInvitationImportersContext?, profileGiftsContext: ProfileGiftsContext?, starsContext: StarsContext?, tonContext: StarsContext?, chatLocation: ChatLocation, chatLocationContextHolder: Atomic, switchToStoryFolder: Int64?, switchToGiftCollection: Int64?, initialPaneKey: PeerInfoPaneKey?, sharedMediaFromForumTopic: (EnginePeer.Id, Int64)?) { + init(controller: PeerInfoScreenImpl, context: AccountContext, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, reactionSourceMessageId: MessageId?, callMessages: [Message], isSettings: Bool, isMyProfile: Bool, hintGroupInCommon: PeerId?, requestsContext: PeerInvitationImportersContext?, profileGiftsContext: ProfileGiftsContext?, starsContext: StarsContext?, tonContext: StarsContext?, chatLocation: ChatLocation, chatLocationContextHolder: Atomic, switchToGiftsTarget: PeerInfoSwitchToGiftsTarget?, switchToStoryFolder: Int64?, initialPaneKey: PeerInfoPaneKey?, sharedMediaFromForumTopic: (EnginePeer.Id, Int64)?) { self.controller = controller self.context = context self.peerId = peerId @@ -3117,7 +3116,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro self.isMediaOnly = context.account.peerId == peerId && !isSettings && !isMyProfile self.initialExpandPanes = initialPaneKey != nil self.switchToStoryFolder = switchToStoryFolder - self.switchToGiftCollection = switchToGiftCollection + self.switchToGiftsTarget = switchToGiftsTarget self.sharedMediaFromForumTopic = sharedMediaFromForumTopic self.scrollNode = ASScrollNode() @@ -3131,6 +3130,15 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro forumTopicThreadId = message.threadId } self.headerNode = PeerInfoHeaderNode(context: context, controller: controller, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, isMediaOnly: self.isMediaOnly, isSettings: isSettings, isMyProfile: isMyProfile, forumTopicThreadId: forumTopicThreadId, chatLocation: self.chatLocation) + + var switchToGiftCollection: Int64? + switch switchToGiftsTarget { + case let .collection(id): + switchToGiftCollection = id + default: + break + } + self.paneContainerNode = PeerInfoPaneContainerNode(context: context, updatedPresentationData: controller.updatedPresentationData, peerId: peerId, chatLocation: chatLocation, sharedMediaFromForumTopic: sharedMediaFromForumTopic, chatLocationContextHolder: chatLocationContextHolder, isMediaOnly: self.isMediaOnly, initialPaneKey: initialPaneKey, initialStoryFolderId: switchToStoryFolder, initialGiftCollectionId: switchToGiftCollection) super.init() @@ -4940,7 +4948,12 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro self.privacySettings.set(.single(nil)) } - screenData = peerInfoScreenData(context: context, peerId: peerId, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, isSettings: self.isSettings, isMyProfile: self.isMyProfile, hintGroupInCommon: hintGroupInCommon, existingRequestsContext: requestsContext, existingProfileGiftsContext: profileGiftsContext, existingProfileGiftsCollectionsContext: nil, chatLocation: self.chatLocation, chatLocationContextHolder: self.chatLocationContextHolder, sharedMediaFromForumTopic: self.sharedMediaFromForumTopic, privacySettings: self.privacySettings.get(), forceHasGifts: initialPaneKey == .gifts) + var switchToUpgradableGifts = false + if let switchToGiftsTarget, case .upgradable = switchToGiftsTarget { + switchToUpgradableGifts = true + } + + screenData = peerInfoScreenData(context: context, peerId: peerId, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, isSettings: self.isSettings, isMyProfile: self.isMyProfile, hintGroupInCommon: hintGroupInCommon, existingRequestsContext: requestsContext, existingProfileGiftsContext: profileGiftsContext, existingProfileGiftsCollectionsContext: nil, chatLocation: self.chatLocation, chatLocationContextHolder: self.chatLocationContextHolder, sharedMediaFromForumTopic: self.sharedMediaFromForumTopic, privacySettings: self.privacySettings.get(), forceHasGifts: initialPaneKey == .gifts, switchToUpgradableGifts: switchToUpgradableGifts) var previousTimestamp: Double? self.headerNode.displayPremiumIntro = { [weak self] sourceView, peerStatus, emojiStatusFileAndPack, white in @@ -8268,12 +8281,12 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } UIPasteboard.general.string = noteText - let toastText = self.presentationData.strings.UserInfo_ToastNoteCopied + let toastText = self.presentationData.strings.PeerInfo_ToastNoteCopied self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: toastText), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } var items: [ContextMenuItem] = [] - items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.UserInfo_NoteActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.PeerInfo_NoteActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c?.dismiss { guard let self else { return @@ -8293,7 +8306,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } }))) - let copyText = self.presentationData.strings.UserInfo_NoteActionCopy + let copyText = self.presentationData.strings.PeerInfo_NoteActionCopy items.append(.action(ContextMenuActionItem(text: copyText, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c?.dismiss { copyAction() @@ -13398,6 +13411,12 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } } +public enum PeerInfoSwitchToGiftsTarget { + case generic + case upgradable + case collection(Int64) +} + public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen, KeyShortcutResponder { let context: AccountContext fileprivate let updatedPresentationData: (initial: PresentationData, signal: Signal)? @@ -13415,10 +13434,9 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen, KeyShortc fileprivate let starsContext: StarsContext? fileprivate let tonContext: StarsContext? private let switchToRecommendedChannels: Bool - private let switchToGifts: Bool + private let switchToGiftsTarget: PeerInfoSwitchToGiftsTarget? private let switchToGroupsInCommon: Bool private let switchToStoryFolder: Int64? - private let switchToGiftCollection: Int64? private let sharedMediaFromForumTopic: (EnginePeer.Id, Int64)? let chatLocation: ChatLocation private let chatLocationContextHolder = Atomic(value: nil) @@ -13493,10 +13511,9 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen, KeyShortc forumTopicThread: ChatReplyThreadMessage? = nil, sharedMediaFromForumTopic: (EnginePeer.Id, Int64)? = nil, switchToRecommendedChannels: Bool = false, - switchToGifts: Bool = false, + switchToGiftsTarget: PeerInfoSwitchToGiftsTarget? = nil, switchToGroupsInCommon: Bool = false, switchToStoryFolder: Int64? = nil, - switchToGiftCollection: Int64? = nil ) { self.context = context self.updatedPresentationData = updatedPresentationData @@ -13512,10 +13529,9 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen, KeyShortc self.requestsContext = requestsContext self.profileGiftsContext = profileGiftsContext self.switchToRecommendedChannels = switchToRecommendedChannels - self.switchToGifts = switchToGifts + self.switchToGiftsTarget = switchToGiftsTarget self.switchToGroupsInCommon = switchToGroupsInCommon self.switchToStoryFolder = switchToStoryFolder - self.switchToGiftCollection = switchToGiftCollection self.sharedMediaFromForumTopic = sharedMediaFromForumTopic if let forumTopicThread = forumTopicThread { @@ -13889,16 +13905,14 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen, KeyShortc var initialPaneKey: PeerInfoPaneKey? if self.switchToRecommendedChannels { initialPaneKey = .similarChannels - } else if self.switchToGifts { + } else if let _ = self.switchToGiftsTarget { initialPaneKey = .gifts } else if self.switchToGroupsInCommon { initialPaneKey = .groupsInCommon } else if self.switchToStoryFolder != nil { initialPaneKey = .stories - } else if self .switchToGiftCollection != nil { - initialPaneKey = .gifts } - self.displayNode = PeerInfoScreenNode(controller: self, context: self.context, peerId: self.peerId, avatarInitiallyExpanded: self.avatarInitiallyExpanded, isOpenedFromChat: self.isOpenedFromChat, nearbyPeerDistance: self.nearbyPeerDistance, reactionSourceMessageId: self.reactionSourceMessageId, callMessages: self.callMessages, isSettings: self.isSettings, isMyProfile: self.isMyProfile, hintGroupInCommon: self.hintGroupInCommon, requestsContext: self.requestsContext, profileGiftsContext: self.profileGiftsContext, starsContext: self.starsContext, tonContext: self.tonContext, chatLocation: self.chatLocation, chatLocationContextHolder: self.chatLocationContextHolder, switchToStoryFolder: self.switchToStoryFolder, switchToGiftCollection: self.switchToGiftCollection, initialPaneKey: initialPaneKey, sharedMediaFromForumTopic: self.sharedMediaFromForumTopic) + self.displayNode = PeerInfoScreenNode(controller: self, context: self.context, peerId: self.peerId, avatarInitiallyExpanded: self.avatarInitiallyExpanded, isOpenedFromChat: self.isOpenedFromChat, nearbyPeerDistance: self.nearbyPeerDistance, reactionSourceMessageId: self.reactionSourceMessageId, callMessages: self.callMessages, isSettings: self.isSettings, isMyProfile: self.isMyProfile, hintGroupInCommon: self.hintGroupInCommon, requestsContext: self.requestsContext, profileGiftsContext: self.profileGiftsContext, starsContext: self.starsContext, tonContext: self.tonContext, chatLocation: self.chatLocation, chatLocationContextHolder: self.chatLocationContextHolder, switchToGiftsTarget: self.switchToGiftsTarget, switchToStoryFolder: self.switchToStoryFolder, initialPaneKey: initialPaneKey, sharedMediaFromForumTopic: self.sharedMediaFromForumTopic) self.controllerNode.accountsAndPeers.set(self.accountsAndPeers.get() |> map { $0.1 }) self.controllerNode.activeSessionsContextAndCount.set(self.activeSessionsContextAndCount.get()) self.cachedDataPromise.set(self.controllerNode.cachedDataPromise.get()) diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 7f5082fe31..1648950bdb 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -1253,7 +1253,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } let _ = self.context.engine.accountData.updateBirthday(birthday: value).startStandalone() - self.present(UndoOverlayController(presentationData: self.presentationData, content: .actionSucceeded(title: nil, text: self.presentationData.strings.SuggestBirthdate_Accept_Added, cancel: nil, destructive: false), elevatedLayout: false, action: { _ in + self.present(UndoOverlayController(presentationData: self.presentationData, content: .universal(animation: "anim_gift", scale: 0.058, colors: ["__allcolors__": UIColor.white], title: nil, text: self.presentationData.strings.SuggestBirthdate_Accept_Added, customUndoText: nil, timeout: 5.0), elevatedLayout: false, action: { _ in return true }), in: .current) }) diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index 2715308315..13f65ed3ee 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -3970,7 +3970,7 @@ private func peerInfoControllerImpl(context: AccountContext, updatedPresentation } else if let _ = peer as? TelegramChannel { var forumTopicThread: ChatReplyThreadMessage? var switchToRecommendedChannels = false - var switchToGifts = false + var switchToGiftsTarget: PeerInfoSwitchToGiftsTarget? var switchToGroupsInCommon = false var switchToStoryFolder: Int64? switch mode { @@ -3978,8 +3978,10 @@ private func peerInfoControllerImpl(context: AccountContext, updatedPresentation forumTopicThread = thread case .recommendedChannels: switchToRecommendedChannels = true - case .gifts, .upgradableGifts: - switchToGifts = true + case .gifts: + switchToGiftsTarget = .generic + case .upgradableGifts: + switchToGiftsTarget = .upgradable case .groupsInCommon: switchToGroupsInCommon = true case let .storyAlbum(id): @@ -3987,7 +3989,7 @@ private func peerInfoControllerImpl(context: AccountContext, updatedPresentation default: break } - return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nil, reactionSourceMessageId: nil, callMessages: [], forumTopicThread: forumTopicThread, switchToRecommendedChannels: switchToRecommendedChannels, switchToGifts: switchToGifts, switchToGroupsInCommon: switchToGroupsInCommon, switchToStoryFolder: switchToStoryFolder) + return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nil, reactionSourceMessageId: nil, callMessages: [], forumTopicThread: forumTopicThread, switchToRecommendedChannels: switchToRecommendedChannels, switchToGiftsTarget: switchToGiftsTarget, switchToGroupsInCommon: switchToGroupsInCommon, switchToStoryFolder: switchToStoryFolder) } else if peer is TelegramUser { var nearbyPeerDistance: Int32? var reactionSourceMessageId: MessageId? @@ -3996,10 +3998,9 @@ private func peerInfoControllerImpl(context: AccountContext, updatedPresentation var forumTopicThread: ChatReplyThreadMessage? var sharedMediaFromForumTopic: (EnginePeer.Id, Int64)? var isMyProfile = false - var switchToGifts = false + var switchToGiftsTarget: PeerInfoSwitchToGiftsTarget? var switchToGroupsInCommon = false var switchToStoryFolder: Int64? - var switchToGiftCollection: Int64? switch mode { case let .nearbyPeer(distance): @@ -4016,11 +4017,14 @@ private func peerInfoControllerImpl(context: AccountContext, updatedPresentation forumTopicThread = thread case .myProfile: isMyProfile = true - case .gifts, .upgradableGifts: - switchToGifts = true + case .gifts: + switchToGiftsTarget = .generic + case .upgradableGifts: + isMyProfile = true + switchToGiftsTarget = .upgradable case .myProfileGifts: isMyProfile = true - switchToGifts = true + switchToGiftsTarget = .generic case .groupsInCommon: switchToGroupsInCommon = true case let .monoforum(peerId): @@ -4031,14 +4035,14 @@ private func peerInfoControllerImpl(context: AccountContext, updatedPresentation isMyProfile = true } case let .giftCollection(id): - switchToGiftCollection = id + switchToGiftsTarget = .collection(id) if peer.id == context.account.peerId { isMyProfile = true } default: break } - return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nearbyPeerDistance, reactionSourceMessageId: reactionSourceMessageId, callMessages: callMessages, isMyProfile: isMyProfile, hintGroupInCommon: hintGroupInCommon, forumTopicThread: forumTopicThread, sharedMediaFromForumTopic: sharedMediaFromForumTopic, switchToGifts: switchToGifts, switchToGroupsInCommon: switchToGroupsInCommon, switchToStoryFolder: switchToStoryFolder, switchToGiftCollection: switchToGiftCollection) + return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nearbyPeerDistance, reactionSourceMessageId: reactionSourceMessageId, callMessages: callMessages, isMyProfile: isMyProfile, hintGroupInCommon: hintGroupInCommon, forumTopicThread: forumTopicThread, sharedMediaFromForumTopic: sharedMediaFromForumTopic, switchToGiftsTarget: switchToGiftsTarget, switchToGroupsInCommon: switchToGroupsInCommon, switchToStoryFolder: switchToStoryFolder) } else if peer is TelegramSecretChat { return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nil, reactionSourceMessageId: nil, callMessages: []) }