From 927d6ad0a8d7653a9dc82862e71d9bae288af081 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 19 Aug 2025 12:11:47 +0400 Subject: [PATCH 1/2] Saved music reordering --- .../TelegramEngine/Peers/SavedMusic.swift | 32 ++++++++++++------- .../Peers/TelegramEnginePeers.swift | 4 +-- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/SavedMusic.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/SavedMusic.swift index 7b8190e918..f2fcbd21a9 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/SavedMusic.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/SavedMusic.swift @@ -98,11 +98,15 @@ func managedSavedMusicIdsUpdates(postbox: Postbox, network: Network, accountPeer return (poll |> then(.complete() |> suspendAwareDelay(0.5 * 60.0 * 60.0, queue: Queue.concurrentDefaultQueue()))) |> restart } -func _internal_addSavedMusic(account: Account, file: FileMediaReference) -> Signal { +func _internal_addSavedMusic(account: Account, file: FileMediaReference, afterFile: FileMediaReference?) -> Signal { return account.postbox.transaction { transaction in if let cachedSavedMusic = transaction.retrieveItemCacheEntry(id: entryId(peerId: account.peerId))?.get(CachedProfileSavedMusic.self) { var updatedFiles = cachedSavedMusic.files - updatedFiles.insert(file.media, at: 0) + if let afterFile, let index = updatedFiles.firstIndex(where: { $0.fileId == afterFile.media.fileId }) { + updatedFiles.insert(file.media, at: index + 1) + } else { + updatedFiles.insert(file.media, at: 0) + } let updatedCount = max(0, cachedSavedMusic.count + 1) if let entry = CodableEntry(CachedProfileSavedMusic(files: updatedFiles, count: updatedCount)) { transaction.putItemCacheEntry(id: entryId(peerId: account.peerId), entry: entry) @@ -126,7 +130,13 @@ func _internal_addSavedMusic(account: Account, file: FileMediaReference) -> Sign }) } return revalidatedMusic(account: account, file: file, signal: { resource in - return account.network.request(Api.functions.account.saveMusic(flags: 0, id: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference)), afterId: nil)) + var flags: Int32 = 0 + var afterId: Api.InputDocument? + if let afterFile, let resource = afterFile.media.resource as? CloudDocumentMediaResource { + flags = 1 << 1 + afterId = .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference)) + } + return account.network.request(Api.functions.account.saveMusic(flags: flags, id: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference)), afterId: afterId)) }) |> mapError { _ -> AddSavedMusicError in return .generic @@ -331,18 +341,18 @@ public final class ProfileSavedMusicContext { self.pushState() })) } - - public func reorderMusic(file: FileMediaReference, afterFile: FileMediaReference?) -> Signal { - return .complete() - } - - public func addMusic(file: FileMediaReference) -> Signal { - return _internal_addSavedMusic(account: self.account, file: file) + + public func addMusic(file: FileMediaReference, afterFile: FileMediaReference? = nil) -> Signal { + return _internal_addSavedMusic(account: self.account, file: file, afterFile: nil) |> afterCompleted { [weak self] in guard let self else { return } - self.files.insert(file.media, at: 0) + if let afterFile, let index = self.files.firstIndex(where: { $0.fileId == afterFile.media.fileId }) { + self.files.insert(file.media, at: index + 1) + } else { + self.files.insert(file.media, at: 0) + } if let count = self.count { self.count = count + 1 } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift index cb580e8cb9..048f67206b 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift @@ -916,8 +916,8 @@ public extension TelegramEngine { return _internal_savedMusicIds(postbox: self.account.postbox) } - public func addSavedMusic(file: FileMediaReference) -> Signal { - return _internal_addSavedMusic(account: self.account, file: file) + public func addSavedMusic(file: FileMediaReference, afterFile: FileMediaReference? = nil) -> Signal { + return _internal_addSavedMusic(account: self.account, file: file, afterFile: afterFile) } public func removeSavedMusic(file: FileMediaReference) -> Signal { From dc4b8cf99900325f7bf4f1275d57ec84a9b40b1a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 19 Aug 2025 12:12:22 +0400 Subject: [PATCH 2/2] Various fixes --- Telegram/Telegram-iOS/en.lproj/Localizable.strings | 2 +- .../Sources/Chat/ChatControllerLoadDisplayNode.swift | 6 +++++- submodules/TelegramUI/Sources/ChatController.swift | 10 ---------- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 4fe03ded5e..39c216d423 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -14913,6 +14913,6 @@ Sorry for the inconvenience."; "Gift.View.Unknown.Title" = "Gift"; "Conversation.StopVoiceMessageTitle" = "Audio Recording"; -"Conversation.StopVoiceMessageDescription" = "Are you sure you want to stop recording?"; +"Conversation.StopVoiceMessageDescription" = "Are you sure you want to pause recording?"; "Conversation.StopVoiceMessageDiscardAction" = "Discard"; "Conversation.StopVoiceMessagePauseAction" = "Pause"; diff --git a/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift b/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift index 61b6ddc25c..2f43a57d9d 100644 --- a/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift +++ b/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift @@ -664,7 +664,11 @@ extension ChatControllerImpl { if let channel = self.presentationInterfaceState.renderedPeer?.peer as? TelegramChannel, channel.isForumOrMonoForum, self.presentationInterfaceState.persistentData.topicListPanelLocation == true, self.presentationInterfaceState.chatLocation.threadId != nil { self.updateChatLocationThread(threadId: nil, animationDirection: .left) } else { - self.dismiss() + if self.attemptNavigation({ [weak self] in + self?.dismiss() + }) { + self.dismiss() + } } } diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 5db270e5de..ea0f07154c 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -9826,16 +9826,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } ), - TextAlertAction( - type: .destructiveAction, - title: self.presentationData.strings.Conversation_StopVoiceMessageDiscardAction, - action: { [weak self] in - self?.stopMediaRecorder() - Queue.mainQueue().after(0.1) { - action() - } - } - ), TextAlertAction( type: .genericAction, title: self.presentationData.strings.Common_Cancel,