mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-06 17:00:13 +00:00
Various fixes
This commit is contained in:
parent
e167e794cc
commit
5229c1666c
@ -117,7 +117,7 @@ public enum AvatarNodeImageOverride: Equatable {
|
|||||||
case savedMessagesIcon
|
case savedMessagesIcon
|
||||||
case repliesIcon
|
case repliesIcon
|
||||||
case archivedChatsIcon(hiddenByDefault: Bool)
|
case archivedChatsIcon(hiddenByDefault: Bool)
|
||||||
case editAvatarIcon
|
case editAvatarIcon(forceNone: Bool)
|
||||||
case deletedIcon
|
case deletedIcon
|
||||||
case phoneIcon
|
case phoneIcon
|
||||||
}
|
}
|
||||||
@ -322,8 +322,8 @@ public final class AvatarNode: ASDisplayNode {
|
|||||||
case let .archivedChatsIcon(hiddenByDefault):
|
case let .archivedChatsIcon(hiddenByDefault):
|
||||||
representation = nil
|
representation = nil
|
||||||
icon = .archivedChatsIcon(hiddenByDefault: hiddenByDefault)
|
icon = .archivedChatsIcon(hiddenByDefault: hiddenByDefault)
|
||||||
case .editAvatarIcon:
|
case let .editAvatarIcon(forceNone):
|
||||||
representation = peer?.smallProfileImage
|
representation = forceNone ? nil : peer?.smallProfileImage
|
||||||
icon = .editAvatarIcon
|
icon = .editAvatarIcon
|
||||||
case .deletedIcon:
|
case .deletedIcon:
|
||||||
representation = nil
|
representation = nil
|
||||||
|
|||||||
@ -660,7 +660,7 @@ public class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNo
|
|||||||
overrideImage = .image(representation)
|
overrideImage = .image(representation)
|
||||||
}
|
}
|
||||||
} else if case .editSettings = item.mode {
|
} else if case .editSettings = item.mode {
|
||||||
overrideImage = AvatarNodeImageOverride.editAvatarIcon
|
overrideImage = AvatarNodeImageOverride.editAvatarIcon(forceNone: false)
|
||||||
} else if peer.isDeleted {
|
} else if peer.isDeleted {
|
||||||
overrideImage = .deletedIcon
|
overrideImage = .deletedIcon
|
||||||
}
|
}
|
||||||
|
|||||||
@ -312,27 +312,45 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
guard let videoNode = self.videoNode, self.isCentral else {
|
guard let videoNode = self.videoNode, self.isCentral else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if let _ = self.videoStartTimestamp {
|
if let videoStartTimestamp = self.videoStartTimestamp {
|
||||||
videoNode.isHidden = true
|
videoNode.isHidden = true
|
||||||
self.playbackStatusDisposable.set((videoNode.status
|
self.playbackStatusDisposable.set((videoNode.status
|
||||||
|> map { status -> Bool in
|
|> castError(Bool.self)
|
||||||
if let status = status, case .playing = status.status {
|
|> mapToSignal { status -> Signal<Bool, Bool> in
|
||||||
return true
|
if let status = status, case .playing = status.status {
|
||||||
} else {
|
if videoStartTimestamp > 0.0 && videoStartTimestamp > status.duration - 1.0 {
|
||||||
return false
|
return .fail(true)
|
||||||
}
|
}
|
||||||
|
return .single(true)
|
||||||
|
} else {
|
||||||
|
return .single(false)
|
||||||
}
|
}
|
||||||
|> filter { playing in
|
}
|
||||||
return playing
|
|> filter { playing in
|
||||||
}
|
return playing
|
||||||
|> take(1)
|
}
|
||||||
|> deliverOnMainQueue).start(completed: { [weak self] in
|
|> take(1)
|
||||||
if let strongSelf = self {
|
|> deliverOnMainQueue).start(error: { [weak self] _ in
|
||||||
|
if let strongSelf = self {
|
||||||
|
if let _ = strongSelf.videoNode {
|
||||||
|
videoNode.seek(0.0)
|
||||||
Queue.mainQueue().after(0.1) {
|
Queue.mainQueue().after(0.1) {
|
||||||
|
strongSelf.videoNode?.layer.allowsGroupOpacity = true
|
||||||
|
strongSelf.videoNode?.alpha = 0.0
|
||||||
strongSelf.videoNode?.isHidden = false
|
strongSelf.videoNode?.isHidden = false
|
||||||
|
|
||||||
|
strongSelf.videoNode?.alpha = 1.0
|
||||||
|
strongSelf.videoNode?.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25, delay: 0.01)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}))
|
}
|
||||||
|
}, completed: { [weak self] in
|
||||||
|
if let strongSelf = self {
|
||||||
|
Queue.mainQueue().after(0.1) {
|
||||||
|
strongSelf.videoNode?.isHidden = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}))
|
||||||
} else {
|
} else {
|
||||||
self.playbackStatusDisposable.set(nil)
|
self.playbackStatusDisposable.set(nil)
|
||||||
videoNode.isHidden = false
|
videoNode.isHidden = false
|
||||||
|
|||||||
@ -340,20 +340,38 @@ public final class PeerInfoAvatarListItemNode: ASDisplayNode {
|
|||||||
videoNode.canAttachContent = true
|
videoNode.canAttachContent = true
|
||||||
videoNode.isHidden = true
|
videoNode.isHidden = true
|
||||||
|
|
||||||
if let _ = self.videoStartTimestamp {
|
if let videoStartTimestamp = self.videoStartTimestamp {
|
||||||
self.playbackStartDisposable.set((videoNode.status
|
self.playbackStartDisposable.set((videoNode.status
|
||||||
|> map { status -> Bool in
|
|> castError(Bool.self)
|
||||||
|
|> mapToSignal { status -> Signal<Bool, Bool> in
|
||||||
if let status = status, case .playing = status.status {
|
if let status = status, case .playing = status.status {
|
||||||
return true
|
if videoStartTimestamp > 0.0 && videoStartTimestamp > status.duration - 1.0 {
|
||||||
|
return .fail(true)
|
||||||
|
}
|
||||||
|
return .single(true)
|
||||||
} else {
|
} else {
|
||||||
return false
|
return .single(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|> filter { playing in
|
|> filter { playing in
|
||||||
return playing
|
return playing
|
||||||
}
|
}
|
||||||
|> take(1)
|
|> take(1)
|
||||||
|> deliverOnMainQueue).start(completed: { [weak self] in
|
|> deliverOnMainQueue).start(error: { [weak self] _ in
|
||||||
|
if let strongSelf = self {
|
||||||
|
if let _ = strongSelf.videoNode {
|
||||||
|
videoNode.seek(0.0)
|
||||||
|
Queue.mainQueue().after(0.1) {
|
||||||
|
strongSelf.videoNode?.layer.allowsGroupOpacity = true
|
||||||
|
strongSelf.videoNode?.alpha = 0.0
|
||||||
|
strongSelf.videoNode?.isHidden = false
|
||||||
|
|
||||||
|
strongSelf.videoNode?.alpha = 1.0
|
||||||
|
strongSelf.videoNode?.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25, delay: 0.01)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, completed: { [weak self] in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
Queue.mainQueue().after(0.1) {
|
Queue.mainQueue().after(0.1) {
|
||||||
strongSelf.videoNode?.isHidden = false
|
strongSelf.videoNode?.isHidden = false
|
||||||
|
|||||||
@ -320,6 +320,17 @@ func _internal_updatePeerPhotoInternal(postbox: Postbox, network: Network, state
|
|||||||
updatePeers(transaction: transaction, peers: [groupOrChannel], update: { _, updated in
|
updatePeers(transaction: transaction, peers: [groupOrChannel], update: { _, updated in
|
||||||
return updated
|
return updated
|
||||||
})
|
})
|
||||||
|
|
||||||
|
transaction.updatePeerCachedData(peerIds: Set([peer.id]), update: { _, current in
|
||||||
|
if let current = current as? CachedChannelData {
|
||||||
|
return current.withUpdatedPhoto(nil)
|
||||||
|
} else if let current = current as? CachedGroupData {
|
||||||
|
return current.withUpdatedPhoto(nil)
|
||||||
|
} else {
|
||||||
|
return current
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
return .complete(groupOrChannel.profileImageRepresentations)
|
return .complete(groupOrChannel.profileImageRepresentations)
|
||||||
}
|
}
|
||||||
|> mapError { _ -> UploadPeerPhotoError in }
|
|> mapError { _ -> UploadPeerPhotoError in }
|
||||||
|
|||||||
@ -681,24 +681,26 @@ final class PeerInfoEditingAvatarNode: ASDisplayNode {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let canEdit = canEditPeerInfo(context: self.context, peer: peer)
|
||||||
|
|
||||||
let previousItem = self.item
|
let previousItem = self.item
|
||||||
var item = item
|
var item = item
|
||||||
self.item = item
|
self.item = item
|
||||||
|
|
||||||
let overrideImage: AvatarNodeImageOverride?
|
let overrideImage: AvatarNodeImageOverride?
|
||||||
if canEditPeerInfo(context: self.context, peer: peer), peer.profileImageRepresentations.isEmpty {
|
if canEdit, peer.profileImageRepresentations.isEmpty {
|
||||||
overrideImage = .editAvatarIcon
|
overrideImage = .editAvatarIcon(forceNone: true)
|
||||||
} else if let previousItem = previousItem, item == nil {
|
} else if let previousItem = previousItem, item == nil {
|
||||||
if case let .image(_, representations, _, _) = previousItem, let rep = representations.last {
|
if case let .image(_, representations, _, _) = previousItem, let rep = representations.last {
|
||||||
self.removedPhotoResourceIds.insert(rep.representation.resource.id.stringRepresentation)
|
self.removedPhotoResourceIds.insert(rep.representation.resource.id.stringRepresentation)
|
||||||
}
|
}
|
||||||
overrideImage = AvatarNodeImageOverride.none
|
overrideImage = canEdit ? .editAvatarIcon(forceNone: true) : AvatarNodeImageOverride.none
|
||||||
item = nil
|
item = nil
|
||||||
} else if let rep = peer.profileImageRepresentations.last, self.removedPhotoResourceIds.contains(rep.resource.id.stringRepresentation) {
|
} else if let representation = peer.profileImageRepresentations.last, self.removedPhotoResourceIds.contains(representation.resource.id.stringRepresentation) {
|
||||||
overrideImage = AvatarNodeImageOverride.none
|
overrideImage = canEdit ? .editAvatarIcon(forceNone: true) : AvatarNodeImageOverride.none
|
||||||
item = nil
|
item = nil
|
||||||
} else {
|
} else {
|
||||||
overrideImage = nil
|
overrideImage = item == nil && canEdit ? .editAvatarIcon(forceNone: true) : nil
|
||||||
}
|
}
|
||||||
self.avatarNode.font = avatarPlaceholderFont(size: floor(avatarSize * 16.0 / 37.0))
|
self.avatarNode.font = avatarPlaceholderFont(size: floor(avatarSize * 16.0 / 37.0))
|
||||||
self.avatarNode.setPeer(context: self.context, theme: theme, peer: EnginePeer(peer), overrideImage: overrideImage, synchronousLoad: false, displayDimensions: CGSize(width: avatarSize, height: avatarSize))
|
self.avatarNode.setPeer(context: self.context, theme: theme, peer: EnginePeer(peer), overrideImage: overrideImage, synchronousLoad: false, displayDimensions: CGSize(width: avatarSize, height: avatarSize))
|
||||||
|
|||||||
@ -5323,11 +5323,21 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func editingOpenPublicLinkSetup() {
|
private func editingOpenPublicLinkSetup() {
|
||||||
self.controller?.push(channelVisibilityController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: self.peerId, mode: .generic, upgradedToSupergroup: { _, f in f() }))
|
var upgradedToSupergroupImpl: (() -> Void)?
|
||||||
|
let controller = channelVisibilityController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: self.peerId, mode: .generic, upgradedToSupergroup: { _, f in
|
||||||
|
upgradedToSupergroupImpl?()
|
||||||
|
f()
|
||||||
|
})
|
||||||
|
self.controller?.push(controller)
|
||||||
|
|
||||||
|
upgradedToSupergroupImpl = { [weak controller] in
|
||||||
|
if let controller = controller, let navigationController = controller.navigationController as? NavigationController {
|
||||||
|
rebuildControllerStackAfterSupergroupUpgrade(controller: controller, navigationController: navigationController)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func editingOpenInviteLinksSetup() {
|
private func editingOpenInviteLinksSetup() {
|
||||||
|
|
||||||
self.controller?.push(inviteLinkListController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: self.peerId, admin: nil))
|
self.controller?.push(inviteLinkListController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: self.peerId, admin: nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5481,13 +5491,38 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
switch action {
|
switch action {
|
||||||
case .promote:
|
case .promote:
|
||||||
if case let .channelMember(channelMember) = member {
|
if case let .channelMember(channelMember) = member {
|
||||||
self.controller?.push(channelAdminController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: peer.id, adminId: member.id, initialParticipant: channelMember.participant, updated: { _ in
|
var upgradedToSupergroupImpl: (() -> Void)?
|
||||||
}, upgradedToSupergroup: { _, f in f() }, transferedOwnership: { _ in }))
|
let controller = channelAdminController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: peer.id, adminId: member.id, initialParticipant: channelMember.participant, updated: { _ in
|
||||||
|
}, upgradedToSupergroup: { _, f in
|
||||||
|
upgradedToSupergroupImpl?()
|
||||||
|
f()
|
||||||
|
}, transferedOwnership: { _ in })
|
||||||
|
|
||||||
|
self.controller?.push(controller)
|
||||||
|
|
||||||
|
upgradedToSupergroupImpl = { [weak controller] in
|
||||||
|
if let controller = controller, let navigationController = controller.navigationController as? NavigationController {
|
||||||
|
rebuildControllerStackAfterSupergroupUpgrade(controller: controller, navigationController: navigationController)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case .restrict:
|
case .restrict:
|
||||||
if case let .channelMember(channelMember) = member {
|
if case let .channelMember(channelMember) = member {
|
||||||
self.controller?.push(channelBannedMemberController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: peer.id, memberId: member.id, initialParticipant: channelMember.participant, updated: { _ in
|
var upgradedToSupergroupImpl: (() -> Void)?
|
||||||
}, upgradedToSupergroup: { _, f in f() }))
|
|
||||||
|
let controller = channelBannedMemberController(context: self.context, updatedPresentationData: self.controller?.updatedPresentationData, peerId: peer.id, memberId: member.id, initialParticipant: channelMember.participant, updated: { _ in
|
||||||
|
}, upgradedToSupergroup: { _, f in
|
||||||
|
upgradedToSupergroupImpl?()
|
||||||
|
f()
|
||||||
|
})
|
||||||
|
|
||||||
|
self.controller?.push(controller)
|
||||||
|
|
||||||
|
upgradedToSupergroupImpl = { [weak controller] in
|
||||||
|
if let controller = controller, let navigationController = controller.navigationController as? NavigationController {
|
||||||
|
rebuildControllerStackAfterSupergroupUpgrade(controller: controller, navigationController: navigationController)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case .remove:
|
case .remove:
|
||||||
data.members?.membersContext.removeMember(memberId: member.id)
|
data.members?.membersContext.removeMember(memberId: member.id)
|
||||||
@ -5711,25 +5746,16 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func deleteAvatar(_ item: PeerInfoAvatarListItem, remove: Bool = true) {
|
private func deleteProfilePhoto(_ item: PeerInfoAvatarListItem) {
|
||||||
if self.data?.peer?.id == self.context.account.peerId {
|
let dismiss = self.headerNode.avatarListNode.listContainerNode.deleteItem(item)
|
||||||
if case let .image(reference, _, _, _) = item {
|
if dismiss {
|
||||||
if let reference = reference {
|
if self.headerNode.isAvatarExpanded {
|
||||||
if remove {
|
self.headerNode.updateIsAvatarExpanded(false, transition: .immediate)
|
||||||
let _ = self.context.engine.accountData.removeAccountPhoto(reference: reference).start()
|
self.updateNavigationExpansionPresentation(isExpanded: false, animated: true)
|
||||||
}
|
}
|
||||||
let dismiss = self.headerNode.avatarListNode.listContainerNode.deleteItem(item)
|
if let (layout, navigationHeight) = self.validLayout {
|
||||||
if dismiss {
|
self.scrollNode.view.setContentOffset(CGPoint(), animated: false)
|
||||||
if self.headerNode.isAvatarExpanded {
|
self.containerLayoutUpdated(layout: layout, navigationHeight: navigationHeight, transition: .immediate, additive: false)
|
||||||
self.headerNode.updateIsAvatarExpanded(false, transition: .immediate)
|
|
||||||
self.updateNavigationExpansionPresentation(isExpanded: false, animated: true)
|
|
||||||
}
|
|
||||||
if let (layout, navigationHeight) = self.validLayout {
|
|
||||||
self.scrollNode.view.setContentOffset(CGPoint(), animated: false)
|
|
||||||
self.containerLayoutUpdated(layout: layout, navigationHeight: navigationHeight, transition: .immediate, additive: false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6006,7 +6032,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
|
|
||||||
let proceed = {
|
let proceed = {
|
||||||
if let item = item {
|
if let item = item {
|
||||||
strongSelf.deleteAvatar(item, remove: false)
|
strongSelf.deleteProfilePhoto(item)
|
||||||
}
|
}
|
||||||
|
|
||||||
let _ = strongSelf.currentAvatarMixin.swap(nil)
|
let _ = strongSelf.currentAvatarMixin.swap(nil)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user