mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 11:23:48 +00:00
UI improvements
This commit is contained in:
parent
9525b92aac
commit
0102433f8b
@ -604,11 +604,11 @@ public final class ReactionListContextMenuContent: ContextControllerItemsContent
|
|||||||
},
|
},
|
||||||
tomorrowFormatString: { value in
|
tomorrowFormatString: { value in
|
||||||
//TODO:localize
|
//TODO:localize
|
||||||
return PresentationStrings.FormattedString(string: "at \(value)", ranges: [])
|
return PresentationStrings.FormattedString(string: "today at \(value)", ranges: [])
|
||||||
},
|
},
|
||||||
todayFormatString: { value in
|
todayFormatString: { value in
|
||||||
//TODO:localize
|
//TODO:localize
|
||||||
return PresentationStrings.FormattedString(string: "at \(value)", ranges: [])
|
return PresentationStrings.FormattedString(string: "today at \(value)", ranges: [])
|
||||||
},
|
},
|
||||||
yesterdayFormatString: { value in
|
yesterdayFormatString: { value in
|
||||||
//TODO:localize
|
//TODO:localize
|
||||||
|
@ -839,6 +839,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
|||||||
dict[347227392] = { return Api.Update.parse_updateGroupCall($0) }
|
dict[347227392] = { return Api.Update.parse_updateGroupCall($0) }
|
||||||
dict[192428418] = { return Api.Update.parse_updateGroupCallConnection($0) }
|
dict[192428418] = { return Api.Update.parse_updateGroupCallConnection($0) }
|
||||||
dict[-219423922] = { return Api.Update.parse_updateGroupCallParticipants($0) }
|
dict[-219423922] = { return Api.Update.parse_updateGroupCallParticipants($0) }
|
||||||
|
dict[-856651050] = { return Api.Update.parse_updateGroupInvitePrivacyForbidden($0) }
|
||||||
dict[1763610706] = { return Api.Update.parse_updateInlineBotCallbackQuery($0) }
|
dict[1763610706] = { return Api.Update.parse_updateInlineBotCallbackQuery($0) }
|
||||||
dict[1442983757] = { return Api.Update.parse_updateLangPack($0) }
|
dict[1442983757] = { return Api.Update.parse_updateLangPack($0) }
|
||||||
dict[1180041828] = { return Api.Update.parse_updateLangPackTooLong($0) }
|
dict[1180041828] = { return Api.Update.parse_updateLangPackTooLong($0) }
|
||||||
|
@ -777,6 +777,7 @@ public extension Api {
|
|||||||
case updateGroupCall(chatId: Int64, call: Api.GroupCall)
|
case updateGroupCall(chatId: Int64, call: Api.GroupCall)
|
||||||
case updateGroupCallConnection(flags: Int32, params: Api.DataJSON)
|
case updateGroupCallConnection(flags: Int32, params: Api.DataJSON)
|
||||||
case updateGroupCallParticipants(call: Api.InputGroupCall, participants: [Api.GroupCallParticipant], version: Int32)
|
case updateGroupCallParticipants(call: Api.InputGroupCall, participants: [Api.GroupCallParticipant], version: Int32)
|
||||||
|
case updateGroupInvitePrivacyForbidden(userId: Int64)
|
||||||
case updateInlineBotCallbackQuery(flags: Int32, queryId: Int64, userId: Int64, msgId: Api.InputBotInlineMessageID, chatInstance: Int64, data: Buffer?, gameShortName: String?)
|
case updateInlineBotCallbackQuery(flags: Int32, queryId: Int64, userId: Int64, msgId: Api.InputBotInlineMessageID, chatInstance: Int64, data: Buffer?, gameShortName: String?)
|
||||||
case updateLangPack(difference: Api.LangPackDifference)
|
case updateLangPack(difference: Api.LangPackDifference)
|
||||||
case updateLangPackTooLong(langCode: String)
|
case updateLangPackTooLong(langCode: String)
|
||||||
@ -1324,6 +1325,12 @@ public extension Api {
|
|||||||
}
|
}
|
||||||
serializeInt32(version, buffer: buffer, boxed: false)
|
serializeInt32(version, buffer: buffer, boxed: false)
|
||||||
break
|
break
|
||||||
|
case .updateGroupInvitePrivacyForbidden(let userId):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(-856651050)
|
||||||
|
}
|
||||||
|
serializeInt64(userId, buffer: buffer, boxed: false)
|
||||||
|
break
|
||||||
case .updateInlineBotCallbackQuery(let flags, let queryId, let userId, let msgId, let chatInstance, let data, let gameShortName):
|
case .updateInlineBotCallbackQuery(let flags, let queryId, let userId, let msgId, let chatInstance, let data, let gameShortName):
|
||||||
if boxed {
|
if boxed {
|
||||||
buffer.appendInt32(1763610706)
|
buffer.appendInt32(1763610706)
|
||||||
@ -1900,6 +1907,8 @@ public extension Api {
|
|||||||
return ("updateGroupCallConnection", [("flags", flags as Any), ("params", params as Any)])
|
return ("updateGroupCallConnection", [("flags", flags as Any), ("params", params as Any)])
|
||||||
case .updateGroupCallParticipants(let call, let participants, let version):
|
case .updateGroupCallParticipants(let call, let participants, let version):
|
||||||
return ("updateGroupCallParticipants", [("call", call as Any), ("participants", participants as Any), ("version", version as Any)])
|
return ("updateGroupCallParticipants", [("call", call as Any), ("participants", participants as Any), ("version", version as Any)])
|
||||||
|
case .updateGroupInvitePrivacyForbidden(let userId):
|
||||||
|
return ("updateGroupInvitePrivacyForbidden", [("userId", userId as Any)])
|
||||||
case .updateInlineBotCallbackQuery(let flags, let queryId, let userId, let msgId, let chatInstance, let data, let gameShortName):
|
case .updateInlineBotCallbackQuery(let flags, let queryId, let userId, let msgId, let chatInstance, let data, let gameShortName):
|
||||||
return ("updateInlineBotCallbackQuery", [("flags", flags as Any), ("queryId", queryId as Any), ("userId", userId as Any), ("msgId", msgId as Any), ("chatInstance", chatInstance as Any), ("data", data as Any), ("gameShortName", gameShortName as Any)])
|
return ("updateInlineBotCallbackQuery", [("flags", flags as Any), ("queryId", queryId as Any), ("userId", userId as Any), ("msgId", msgId as Any), ("chatInstance", chatInstance as Any), ("data", data as Any), ("gameShortName", gameShortName as Any)])
|
||||||
case .updateLangPack(let difference):
|
case .updateLangPack(let difference):
|
||||||
@ -3031,6 +3040,17 @@ public extension Api {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public static func parse_updateGroupInvitePrivacyForbidden(_ reader: BufferReader) -> Update? {
|
||||||
|
var _1: Int64?
|
||||||
|
_1 = reader.readInt64()
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
if _c1 {
|
||||||
|
return Api.Update.updateGroupInvitePrivacyForbidden(userId: _1!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
public static func parse_updateInlineBotCallbackQuery(_ reader: BufferReader) -> Update? {
|
public static func parse_updateInlineBotCallbackQuery(_ reader: BufferReader) -> Update? {
|
||||||
var _1: Int32?
|
var _1: Int32?
|
||||||
_1 = reader.readInt32()
|
_1 = reader.readInt32()
|
||||||
|
@ -13,8 +13,21 @@ public enum CreateGroupError {
|
|||||||
case serverProvided(String)
|
case serverProvided(String)
|
||||||
}
|
}
|
||||||
|
|
||||||
func _internal_createGroup(account: Account, title: String, peerIds: [PeerId], ttlPeriod: Int32?) -> Signal<PeerId?, CreateGroupError> {
|
public struct CreateGroupResult {
|
||||||
return account.postbox.transaction { transaction -> Signal<PeerId?, CreateGroupError> in
|
public var peerId: EnginePeer.Id
|
||||||
|
public var failedToInvitePeerIds: [EnginePeer.Id]
|
||||||
|
|
||||||
|
public init(
|
||||||
|
peerId: EnginePeer.Id,
|
||||||
|
failedToInvitePeerIds: [EnginePeer.Id]
|
||||||
|
) {
|
||||||
|
self.peerId = peerId
|
||||||
|
self.failedToInvitePeerIds = failedToInvitePeerIds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func _internal_createGroup(account: Account, title: String, peerIds: [PeerId], ttlPeriod: Int32?) -> Signal<CreateGroupResult?, CreateGroupError> {
|
||||||
|
return account.postbox.transaction { transaction -> Signal<CreateGroupResult?, CreateGroupError> in
|
||||||
var inputUsers: [Api.InputUser] = []
|
var inputUsers: [Api.InputUser] = []
|
||||||
for peerId in peerIds {
|
for peerId in peerIds {
|
||||||
if let peer = transaction.getPeer(peerId), let inputUser = apiInputUser(peer) {
|
if let peer = transaction.getPeer(peerId), let inputUser = apiInputUser(peer) {
|
||||||
@ -36,7 +49,20 @@ func _internal_createGroup(account: Account, title: String, peerIds: [PeerId], t
|
|||||||
}
|
}
|
||||||
return .generic
|
return .generic
|
||||||
}
|
}
|
||||||
|> mapToSignal { updates -> Signal<PeerId?, CreateGroupError> in
|
|> mapToSignal { updates -> Signal<CreateGroupResult?, CreateGroupError> in
|
||||||
|
var failedToInvitePeerIds: [EnginePeer.Id] = []
|
||||||
|
failedToInvitePeerIds = []
|
||||||
|
switch updates {
|
||||||
|
case let .updates(updates, _, _, _, _):
|
||||||
|
for update in updates {
|
||||||
|
if case let .updateGroupInvitePrivacyForbidden(userId) = update {
|
||||||
|
failedToInvitePeerIds.append(EnginePeer.Id(namespace: Namespaces.Peer.CloudUser, id: EnginePeer.Id.Id._internalFromInt64Value(userId)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
account.stateManager.addUpdates(updates)
|
account.stateManager.addUpdates(updates)
|
||||||
if let message = updates.messages.first, let peerId = apiMessagePeerId(message) {
|
if let message = updates.messages.first, let peerId = apiMessagePeerId(message) {
|
||||||
return account.postbox.multiplePeersView([peerId])
|
return account.postbox.multiplePeersView([peerId])
|
||||||
@ -45,8 +71,11 @@ func _internal_createGroup(account: Account, title: String, peerIds: [PeerId], t
|
|||||||
}
|
}
|
||||||
|> take(1)
|
|> take(1)
|
||||||
|> castError(CreateGroupError.self)
|
|> castError(CreateGroupError.self)
|
||||||
|> map { _ in
|
|> map { _ -> CreateGroupResult in
|
||||||
return peerId
|
return CreateGroupResult(
|
||||||
|
peerId: peerId,
|
||||||
|
failedToInvitePeerIds: failedToInvitePeerIds
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return .single(nil)
|
return .single(nil)
|
||||||
|
@ -138,7 +138,7 @@ public extension TelegramEngine {
|
|||||||
return _internal_convertGroupToSupergroup(account: self.account, peerId: peerId)
|
return _internal_convertGroupToSupergroup(account: self.account, peerId: peerId)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func createGroup(title: String, peerIds: [PeerId], ttlPeriod: Int32?) -> Signal<PeerId?, CreateGroupError> {
|
public func createGroup(title: String, peerIds: [PeerId], ttlPeriod: Int32?) -> Signal<CreateGroupResult?, CreateGroupError> {
|
||||||
return _internal_createGroup(account: self.account, title: title, peerIds: peerIds, ttlPeriod: ttlPeriod)
|
return _internal_createGroup(account: self.account, title: title, peerIds: peerIds, ttlPeriod: ttlPeriod)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,10 +459,12 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
|
|||||||
|
|
||||||
actions.append(.action(ContextMenuActionItem(text: presentationData.strings.SponsoredMessageMenu_Info, textColor: .primary, textLayout: .twoLinesMax, textFont: .custom(font: Font.regular(presentationData.listsFontSize.baseDisplaySize - 1.0), height: nil, verticalOffset: nil), badge: nil, icon: { theme in
|
actions.append(.action(ContextMenuActionItem(text: presentationData.strings.SponsoredMessageMenu_Info, textColor: .primary, textLayout: .twoLinesMax, textFont: .custom(font: Font.regular(presentationData.listsFontSize.baseDisplaySize - 1.0), height: nil, verticalOffset: nil), badge: nil, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Info"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Info"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, iconSource: nil, action: { c, _ in
|
}, iconSource: nil, action: { _, f in
|
||||||
c.dismiss(completion: {
|
/*c.dismiss(completion: {
|
||||||
controllerInteraction.navigationController()?.pushViewController(AdInfoScreen(context: context))
|
controllerInteraction.navigationController()?.pushViewController(AdInfoScreen(context: context))
|
||||||
})
|
})*/
|
||||||
|
f(.dismissWithoutContent)
|
||||||
|
controllerInteraction.navigationController()?.pushViewController(AdInfoScreen(context: context))
|
||||||
})))
|
})))
|
||||||
|
|
||||||
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: context.currentAppConfiguration.with { $0 })
|
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: context.currentAppConfiguration.with { $0 })
|
||||||
|
@ -562,6 +562,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
|
|||||||
strongSelf.videoFrame = displayVideoFrame
|
strongSelf.videoFrame = displayVideoFrame
|
||||||
strongSelf.appliedForwardInfo = (forwardSource, forwardAuthorSignature)
|
strongSelf.appliedForwardInfo = (forwardSource, forwardAuthorSignature)
|
||||||
strongSelf.secretProgressIcon = secretProgressIcon
|
strongSelf.secretProgressIcon = secretProgressIcon
|
||||||
|
|
||||||
strongSelf.automaticDownload = automaticDownload
|
strongSelf.automaticDownload = automaticDownload
|
||||||
|
|
||||||
var updatedReplyBackgroundNode: NavigationBackgroundNode?
|
var updatedReplyBackgroundNode: NavigationBackgroundNode?
|
||||||
@ -689,7 +690,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}), content: NativeVideoContent(id: .message(item.message.stableId, telegramFile.fileId), userLocation: .peer(item.message.id.peerId), fileReference: .message(message: MessageReference(item.message), media: telegramFile), streamVideo: streamVideo ? .conservative : .none, enableSound: false, fetchAutomatically: false, captureProtected: item.message.isCopyProtected(), storeAfterDownload: nil), priority: .embedded, autoplay: true)
|
}), content: NativeVideoContent(id: .message(item.message.stableId, telegramFile.fileId), userLocation: .peer(item.message.id.peerId), fileReference: .message(message: MessageReference(item.message), media: telegramFile), streamVideo: streamVideo ? .conservative : .none, enableSound: false, fetchAutomatically: false, captureProtected: item.message.isCopyProtected(), storeAfterDownload: nil), priority: .embedded, autoplay: item.context.sharedContext.energyUsageSettings.autoplayVideo)
|
||||||
if let previousVideoNode = previousVideoNode {
|
if let previousVideoNode = previousVideoNode {
|
||||||
videoNode.bounds = previousVideoNode.bounds
|
videoNode.bounds = previousVideoNode.bounds
|
||||||
videoNode.position = previousVideoNode.position
|
videoNode.position = previousVideoNode.position
|
||||||
|
@ -31,6 +31,7 @@ import ChatTimerScreen
|
|||||||
import AsyncDisplayKit
|
import AsyncDisplayKit
|
||||||
import TextFormat
|
import TextFormat
|
||||||
import AvatarEditorScreen
|
import AvatarEditorScreen
|
||||||
|
import SendInviteLinkScreen
|
||||||
|
|
||||||
private struct CreateGroupArguments {
|
private struct CreateGroupArguments {
|
||||||
let context: AccountContext
|
let context: AccountContext
|
||||||
@ -606,13 +607,15 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
|
|||||||
let autoremoveTimeout = stateValue.with({ $0 }).autoremoveTimeout ?? globalAutoremoveTimeout
|
let autoremoveTimeout = stateValue.with({ $0 }).autoremoveTimeout ?? globalAutoremoveTimeout
|
||||||
let ttlPeriod: Int32? = autoremoveTimeout == 0 ? nil : autoremoveTimeout
|
let ttlPeriod: Int32? = autoremoveTimeout == 0 ? nil : autoremoveTimeout
|
||||||
|
|
||||||
var createSignal: Signal<PeerId?, CreateGroupError>
|
var createSignal: Signal<CreateGroupResult?, CreateGroupError>
|
||||||
switch mode {
|
switch mode {
|
||||||
case .generic:
|
case .generic:
|
||||||
createSignal = context.engine.peers.createGroup(title: title, peerIds: peerIds, ttlPeriod: ttlPeriod)
|
createSignal = context.engine.peers.createGroup(title: title, peerIds: peerIds, ttlPeriod: ttlPeriod)
|
||||||
case .supergroup:
|
case .supergroup:
|
||||||
createSignal = context.engine.peers.createSupergroup(title: title, description: nil)
|
createSignal = context.engine.peers.createSupergroup(title: title, description: nil)
|
||||||
|> map(Optional.init)
|
|> map { peerId -> CreateGroupResult? in
|
||||||
|
return CreateGroupResult(peerId: peerId, failedToInvitePeerIds: [])
|
||||||
|
}
|
||||||
|> mapError { error -> CreateGroupError in
|
|> mapError { error -> CreateGroupError in
|
||||||
switch error {
|
switch error {
|
||||||
case .generic:
|
case .generic:
|
||||||
@ -634,12 +637,14 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
|
|||||||
|
|
||||||
createSignal = addressPromise.get()
|
createSignal = addressPromise.get()
|
||||||
|> castError(CreateGroupError.self)
|
|> castError(CreateGroupError.self)
|
||||||
|> mapToSignal { address -> Signal<PeerId?, CreateGroupError> in
|
|> mapToSignal { address -> Signal<CreateGroupResult?, CreateGroupError> in
|
||||||
guard let address = address else {
|
guard let address = address else {
|
||||||
return .complete()
|
return .complete()
|
||||||
}
|
}
|
||||||
return context.engine.peers.createSupergroup(title: title, description: nil, location: (location.latitude, location.longitude, address))
|
return context.engine.peers.createSupergroup(title: title, description: nil, location: (location.latitude, location.longitude, address))
|
||||||
|> map(Optional.init)
|
|> map { peerId -> CreateGroupResult? in
|
||||||
|
return CreateGroupResult(peerId: peerId, failedToInvitePeerIds: [])
|
||||||
|
}
|
||||||
|> mapError { error -> CreateGroupError in
|
|> mapError { error -> CreateGroupError in
|
||||||
switch error {
|
switch error {
|
||||||
case .generic:
|
case .generic:
|
||||||
@ -661,9 +666,11 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
|
|||||||
isForum = true
|
isForum = true
|
||||||
}
|
}
|
||||||
|
|
||||||
let createGroupSignal: (Bool) -> Signal<PeerId?, CreateGroupError> = { isForum in
|
let createGroupSignal: (Bool) -> Signal<CreateGroupResult?, CreateGroupError> = { isForum in
|
||||||
return context.engine.peers.createSupergroup(title: title, description: nil, isForum: isForum)
|
return context.engine.peers.createSupergroup(title: title, description: nil, isForum: isForum)
|
||||||
|> map(Optional.init)
|
|> map { peerId -> CreateGroupResult? in
|
||||||
|
return CreateGroupResult(peerId: peerId, failedToInvitePeerIds: [])
|
||||||
|
}
|
||||||
|> mapError { error -> CreateGroupError in
|
|> mapError { error -> CreateGroupError in
|
||||||
switch error {
|
switch error {
|
||||||
case .generic:
|
case .generic:
|
||||||
@ -681,14 +688,14 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
|
|||||||
}
|
}
|
||||||
if let publicLink, !publicLink.isEmpty {
|
if let publicLink, !publicLink.isEmpty {
|
||||||
createSignal = createGroupSignal(isForum)
|
createSignal = createGroupSignal(isForum)
|
||||||
|> mapToSignal { peerId in
|
|> mapToSignal { result in
|
||||||
if let peerId = peerId {
|
if let result = result {
|
||||||
return context.engine.peers.updateAddressName(domain: .peer(peerId), name: publicLink)
|
return context.engine.peers.updateAddressName(domain: .peer(result.peerId), name: publicLink)
|
||||||
|> mapError { _ in
|
|> mapError { _ in
|
||||||
return .generic
|
return .generic
|
||||||
}
|
}
|
||||||
|> map { _ in
|
|> map { _ -> CreateGroupResult? in
|
||||||
return peerId
|
return result
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return .fail(.generic)
|
return .fail(.generic)
|
||||||
@ -702,14 +709,14 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
|
|||||||
|
|
||||||
if group.userAdminRights?.rights.contains(.canBeAnonymous) == true {
|
if group.userAdminRights?.rights.contains(.canBeAnonymous) == true {
|
||||||
createSignal = createSignal
|
createSignal = createSignal
|
||||||
|> mapToSignal { peerId in
|
|> mapToSignal { result in
|
||||||
if let peerId = peerId {
|
if let result = result {
|
||||||
return context.engine.peers.updateChannelAdminRights(peerId: peerId, adminId: context.account.peerId, rights: TelegramChatAdminRights(rights: .canBeAnonymous), rank: nil)
|
return context.engine.peers.updateChannelAdminRights(peerId: result.peerId, adminId: context.account.peerId, rights: TelegramChatAdminRights(rights: .canBeAnonymous), rank: nil)
|
||||||
|> mapError { _ in
|
|> mapError { _ in
|
||||||
return .generic
|
return .generic
|
||||||
}
|
}
|
||||||
|> map { _ in
|
|> map { _ in
|
||||||
return peerId
|
return result
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return .fail(.generic)
|
return .fail(.generic)
|
||||||
@ -718,27 +725,32 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let _ = createSignal
|
||||||
|
let _ = replaceControllerImpl
|
||||||
|
let _ = dismissImpl
|
||||||
|
let _ = uploadedVideoAvatar
|
||||||
|
|
||||||
actionsDisposable.add((createSignal
|
actionsDisposable.add((createSignal
|
||||||
|> mapToSignal { peerId -> Signal<PeerId?, CreateGroupError> in
|
|> mapToSignal { result -> Signal<CreateGroupResult?, CreateGroupError> in
|
||||||
guard let peerId = peerId else {
|
guard let result = result else {
|
||||||
return .single(nil)
|
return .single(nil)
|
||||||
}
|
}
|
||||||
let updatingAvatar = stateValue.with {
|
let updatingAvatar = stateValue.with {
|
||||||
return $0.avatar
|
return $0.avatar
|
||||||
}
|
}
|
||||||
if let _ = updatingAvatar {
|
if let _ = updatingAvatar {
|
||||||
return context.engine.peers.updatePeerPhoto(peerId: peerId, photo: uploadedAvatar.get(), video: uploadedVideoAvatar?.0.get(), videoStartTimestamp: uploadedVideoAvatar?.1, mapResourceToAvatarSizes: { resource, representations in
|
return context.engine.peers.updatePeerPhoto(peerId: result.peerId, photo: uploadedAvatar.get(), video: uploadedVideoAvatar?.0.get(), videoStartTimestamp: uploadedVideoAvatar?.1, mapResourceToAvatarSizes: { resource, representations in
|
||||||
return mapResourceToAvatarSizes(postbox: context.account.postbox, resource: resource, representations: representations)
|
return mapResourceToAvatarSizes(postbox: context.account.postbox, resource: resource, representations: representations)
|
||||||
})
|
})
|
||||||
|> ignoreValues
|
|> ignoreValues
|
||||||
|> `catch` { _ -> Signal<Never, CreateGroupError> in
|
|> `catch` { _ -> Signal<Never, CreateGroupError> in
|
||||||
return .complete()
|
return .complete()
|
||||||
}
|
}
|
||||||
|> mapToSignal { _ -> Signal<PeerId?, CreateGroupError> in
|
|> mapToSignal { _ -> Signal<CreateGroupResult?, CreateGroupError> in
|
||||||
}
|
}
|
||||||
|> then(.single(peerId))
|
|> then(.single(result))
|
||||||
} else {
|
} else {
|
||||||
return .single(peerId)
|
return .single(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|> deliverOnMainQueue
|
|> deliverOnMainQueue
|
||||||
@ -750,15 +762,48 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
|
|||||||
return current
|
return current
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).start(next: { peerId in
|
}).start(next: { result in
|
||||||
if let peerId = peerId {
|
if let result = result {
|
||||||
if let completion = completion {
|
if let completion = completion {
|
||||||
completion(peerId, {
|
completion(result.peerId, {
|
||||||
dismissImpl?()
|
dismissImpl?()
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
let controller = ChatControllerImpl(context: context, chatLocation: .peer(id: peerId))
|
let controller = ChatControllerImpl(context: context, chatLocation: .peer(id: result.peerId))
|
||||||
replaceControllerImpl?(controller)
|
replaceControllerImpl?(controller)
|
||||||
|
|
||||||
|
if !result.failedToInvitePeerIds.isEmpty {
|
||||||
|
context.account.viewTracker.forceUpdateCachedPeerData(peerId: result.peerId)
|
||||||
|
let _ = (context.engine.data.subscribe(
|
||||||
|
TelegramEngine.EngineData.Item.Peer.ExportedInvitation(id: result.peerId)
|
||||||
|
)
|
||||||
|
|> filter { $0 != nil }
|
||||||
|
|> take(1)
|
||||||
|
|> timeout(1.0, queue: .mainQueue(), alternate: .single(nil))
|
||||||
|
|> deliverOnMainQueue).start(next: { [weak controller] exportedInvitation in
|
||||||
|
let _ = controller
|
||||||
|
let _ = exportedInvitation
|
||||||
|
|
||||||
|
if let exportedInvitation, let link = exportedInvitation.link {
|
||||||
|
let _ = (context.engine.data.get(
|
||||||
|
EngineDataList(result.failedToInvitePeerIds.map(TelegramEngine.EngineData.Item.Peer.Peer.init(id:)))
|
||||||
|
)
|
||||||
|
|> deliverOnMainQueue).start(next: { peerItems in
|
||||||
|
guard let controller else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let _ = controller
|
||||||
|
let _ = peerItems
|
||||||
|
|
||||||
|
let peers = peerItems.compactMap { $0 }
|
||||||
|
if !peers.isEmpty {
|
||||||
|
let inviteScreen = SendInviteLinkScreen(context: context, link: link, peers: peers)
|
||||||
|
controller.push(inviteScreen)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, error: { error in
|
}, error: { error in
|
||||||
|
@ -496,7 +496,12 @@ public final class MediaManagerImpl: NSObject, MediaManager {
|
|||||||
strongSelf.musicMediaPlayer?.control(.playback(.pause))
|
strongSelf.musicMediaPlayer?.control(.playback(.pause))
|
||||||
strongSelf.voiceMediaPlayer?.stop()
|
strongSelf.voiceMediaPlayer?.stop()
|
||||||
if let (account, playlist, settings, storedState) = inputData {
|
if let (account, playlist, settings, storedState) = inputData {
|
||||||
let voiceMediaPlayer = SharedMediaPlayer(mediaManager: strongSelf, inForeground: strongSelf.inForeground, account: account, audioSession: strongSelf.audioSession, overlayMediaManager: strongSelf.overlayMediaManager, playlist: playlist, initialOrder: .reversed, initialLooping: .none, initialPlaybackRate: settings.voicePlaybackRate, playerIndex: nextPlayerIndex, controlPlaybackWithProximity: true, type: type)
|
var continueInstantVideoLoopAfterFinish: Bool = true
|
||||||
|
if let playlist = playlist as? PeerMessagesMediaPlaylist {
|
||||||
|
continueInstantVideoLoopAfterFinish = playlist.context.sharedContext.energyUsageSettings.autoplayVideo
|
||||||
|
}
|
||||||
|
|
||||||
|
let voiceMediaPlayer = SharedMediaPlayer(mediaManager: strongSelf, inForeground: strongSelf.inForeground, account: account, audioSession: strongSelf.audioSession, overlayMediaManager: strongSelf.overlayMediaManager, playlist: playlist, initialOrder: .reversed, initialLooping: .none, initialPlaybackRate: settings.voicePlaybackRate, playerIndex: nextPlayerIndex, controlPlaybackWithProximity: true, type: type, continueInstantVideoLoopAfterFinish: continueInstantVideoLoopAfterFinish)
|
||||||
strongSelf.voiceMediaPlayer = voiceMediaPlayer
|
strongSelf.voiceMediaPlayer = voiceMediaPlayer
|
||||||
voiceMediaPlayer.playedToEnd = { [weak voiceMediaPlayer] in
|
voiceMediaPlayer.playedToEnd = { [weak voiceMediaPlayer] in
|
||||||
if let strongSelf = self, let voiceMediaPlayer = voiceMediaPlayer, voiceMediaPlayer === strongSelf.voiceMediaPlayer {
|
if let strongSelf = self, let voiceMediaPlayer = voiceMediaPlayer, voiceMediaPlayer === strongSelf.voiceMediaPlayer {
|
||||||
@ -523,7 +528,7 @@ public final class MediaManagerImpl: NSObject, MediaManager {
|
|||||||
strongSelf.musicMediaPlayer?.stop()
|
strongSelf.musicMediaPlayer?.stop()
|
||||||
strongSelf.voiceMediaPlayer?.control(.playback(.pause))
|
strongSelf.voiceMediaPlayer?.control(.playback(.pause))
|
||||||
if let (account, playlist, settings, storedState) = inputData {
|
if let (account, playlist, settings, storedState) = inputData {
|
||||||
let musicMediaPlayer = SharedMediaPlayer(mediaManager: strongSelf, inForeground: strongSelf.inForeground, account: account, audioSession: strongSelf.audioSession, overlayMediaManager: strongSelf.overlayMediaManager, playlist: playlist, initialOrder: settings.order, initialLooping: settings.looping, initialPlaybackRate: storedState?.playbackRate ?? .x1, playerIndex: nextPlayerIndex, controlPlaybackWithProximity: false, type: type)
|
let musicMediaPlayer = SharedMediaPlayer(mediaManager: strongSelf, inForeground: strongSelf.inForeground, account: account, audioSession: strongSelf.audioSession, overlayMediaManager: strongSelf.overlayMediaManager, playlist: playlist, initialOrder: settings.order, initialLooping: settings.looping, initialPlaybackRate: storedState?.playbackRate ?? .x1, playerIndex: nextPlayerIndex, controlPlaybackWithProximity: false, type: type, continueInstantVideoLoopAfterFinish: true)
|
||||||
strongSelf.musicMediaPlayer = musicMediaPlayer
|
strongSelf.musicMediaPlayer = musicMediaPlayer
|
||||||
musicMediaPlayer.cancelled = { [weak musicMediaPlayer] in
|
musicMediaPlayer.cancelled = { [weak musicMediaPlayer] in
|
||||||
if let strongSelf = self, let musicMediaPlayer = musicMediaPlayer, musicMediaPlayer === strongSelf.musicMediaPlayer {
|
if let strongSelf = self, let musicMediaPlayer = musicMediaPlayer, musicMediaPlayer === strongSelf.musicMediaPlayer {
|
||||||
|
@ -290,7 +290,7 @@ private final class VisualMediaItemNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let file = media as? TelegramMediaFile, file.isAnimated {
|
if let file = media as? TelegramMediaFile, file.isAnimated, self.context.sharedContext.energyUsageSettings.autoplayGif {
|
||||||
if self.videoLayerFrameManager == nil {
|
if self.videoLayerFrameManager == nil {
|
||||||
let sampleBufferLayer: SampleBufferLayer
|
let sampleBufferLayer: SampleBufferLayer
|
||||||
if let current = self.sampleBufferLayer {
|
if let current = self.sampleBufferLayer {
|
||||||
|
@ -355,7 +355,7 @@ private struct PlaybackStack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final class PeerMessagesMediaPlaylist: SharedMediaPlaylist {
|
final class PeerMessagesMediaPlaylist: SharedMediaPlaylist {
|
||||||
private let context: AccountContext
|
let context: AccountContext
|
||||||
private let messagesLocation: PeerMessagesPlaylistLocation
|
private let messagesLocation: PeerMessagesPlaylistLocation
|
||||||
private let chatLocationContextHolder: Atomic<ChatLocationContextHolder?>?
|
private let chatLocationContextHolder: Atomic<ChatLocationContextHolder?>?
|
||||||
|
|
||||||
|
@ -182,7 +182,7 @@ final class SharedMediaPlayer {
|
|||||||
|
|
||||||
let type: MediaManagerPlayerType
|
let type: MediaManagerPlayerType
|
||||||
|
|
||||||
init(mediaManager: MediaManager, inForeground: Signal<Bool, NoError>, account: Account, audioSession: ManagedAudioSession, overlayMediaManager: OverlayMediaManager, playlist: SharedMediaPlaylist, initialOrder: MusicPlaybackSettingsOrder, initialLooping: MusicPlaybackSettingsLooping, initialPlaybackRate: AudioPlaybackRate, playerIndex: Int32, controlPlaybackWithProximity: Bool, type: MediaManagerPlayerType) {
|
init(mediaManager: MediaManager, inForeground: Signal<Bool, NoError>, account: Account, audioSession: ManagedAudioSession, overlayMediaManager: OverlayMediaManager, playlist: SharedMediaPlaylist, initialOrder: MusicPlaybackSettingsOrder, initialLooping: MusicPlaybackSettingsLooping, initialPlaybackRate: AudioPlaybackRate, playerIndex: Int32, controlPlaybackWithProximity: Bool, type: MediaManagerPlayerType, continueInstantVideoLoopAfterFinish: Bool) {
|
||||||
self.mediaManager = mediaManager
|
self.mediaManager = mediaManager
|
||||||
self.account = account
|
self.account = account
|
||||||
self.audioSession = audioSession
|
self.audioSession = audioSession
|
||||||
@ -310,7 +310,11 @@ final class SharedMediaPlayer {
|
|||||||
case let .audio(player):
|
case let .audio(player):
|
||||||
player.pause()
|
player.pause()
|
||||||
case let .instantVideo(node):
|
case let .instantVideo(node):
|
||||||
node.setSoundEnabled(false)
|
if continueInstantVideoLoopAfterFinish {
|
||||||
|
node.setSoundEnabled(false)
|
||||||
|
} else {
|
||||||
|
node.pause()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
strongSelf.playedToEnd?()
|
strongSelf.playedToEnd?()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user