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/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 { diff --git a/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift b/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift index 2acb5d1509..1a8a6c3b85 100644 --- a/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift +++ b/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift @@ -669,7 +669,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 3689e60d60..71fc793f08 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -9861,16 +9861,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,