mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 17:30:12 +00:00
Various fixes
This commit is contained in:
parent
2973d7ce06
commit
4e4d02aefc
@ -781,6 +781,9 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
|
|||||||
self.storyProgressDisposable?.dispose()
|
self.storyProgressDisposable?.dispose()
|
||||||
self.storiesPostingAvailabilityDisposable?.dispose()
|
self.storiesPostingAvailabilityDisposable?.dispose()
|
||||||
self.sharedOpenStoryProgressDisposable.dispose()
|
self.sharedOpenStoryProgressDisposable.dispose()
|
||||||
|
for (_, disposable) in self.preloadStoryResourceDisposables {
|
||||||
|
disposable.dispose()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateNavigationMetadata() {
|
private func updateNavigationMetadata() {
|
||||||
|
|||||||
@ -351,6 +351,8 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode,
|
|||||||
self.scrollNode.view.contentInsetAdjustmentBehavior = .never
|
self.scrollNode.view.contentInsetAdjustmentBehavior = .never
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.effectView.effect = makeCustomZoomBlurEffect(isLight: self.presentationData.theme.rootController.keyboardColor == .light)
|
||||||
|
|
||||||
if let snapshotView = self.sourceSendButton.view.snapshotView(afterScreenUpdates: false) {
|
if let snapshotView = self.sourceSendButton.view.snapshotView(afterScreenUpdates: false) {
|
||||||
self.sendButtonNode.view.addSubview(snapshotView)
|
self.sendButtonNode.view.addSubview(snapshotView)
|
||||||
}
|
}
|
||||||
@ -447,9 +449,7 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode,
|
|||||||
|
|
||||||
self.textInputNode.textView.setContentOffset(self.textInputNode.textView.contentOffset, animated: false)
|
self.textInputNode.textView.setContentOffset(self.textInputNode.textView.contentOffset, animated: false)
|
||||||
|
|
||||||
UIView.animate(withDuration: 0.2, animations: {
|
self.effectView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
||||||
self.effectView.effect = makeCustomZoomBlurEffect(isLight: self.presentationData.theme.rootController.keyboardColor == .light)
|
|
||||||
}, completion: { _ in })
|
|
||||||
self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
self.dimNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
||||||
self.contentContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
self.contentContainerNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
||||||
self.messageBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3)
|
self.messageBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3)
|
||||||
@ -533,24 +533,32 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode,
|
|||||||
var completedBubble = false
|
var completedBubble = false
|
||||||
var completedAlpha = false
|
var completedAlpha = false
|
||||||
|
|
||||||
|
var completed = false
|
||||||
let intermediateCompletion: () -> Void = { [weak self] in
|
let intermediateCompletion: () -> Void = { [weak self] in
|
||||||
if completedEffect && completedButton && completedBubble && completedAlpha {
|
if completedEffect && completedButton && completedBubble && completedAlpha && !completed {
|
||||||
|
completed = true
|
||||||
self?.textInputNode.isHidden = false
|
self?.textInputNode.isHidden = false
|
||||||
self?.sourceSendButton.isHidden = false
|
self?.sourceSendButton.isHidden = false
|
||||||
completion()
|
completion()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UIView.animate(withDuration: 0.2, animations: {
|
self.effectView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in
|
||||||
self.effectView.effect = nil
|
|
||||||
}, completion: { _ in
|
|
||||||
completedEffect = true
|
completedEffect = true
|
||||||
intermediateCompletion()
|
intermediateCompletion()
|
||||||
})
|
})
|
||||||
|
|
||||||
self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false)
|
self.dimNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false)
|
||||||
self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in })
|
self.contentContainerNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in })
|
||||||
|
|
||||||
|
Queue.mainQueue().after(0.45) {
|
||||||
|
if !completed {
|
||||||
|
completed = true
|
||||||
|
self.textInputNode.isHidden = false
|
||||||
|
self.sourceSendButton.isHidden = false
|
||||||
|
completion()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if self.animateInputField {
|
if self.animateInputField {
|
||||||
if cancel {
|
if cancel {
|
||||||
self.fromMessageTextNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, delay: 0.15, removeOnCompletion: false)
|
self.fromMessageTextNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3, delay: 0.15, removeOnCompletion: false)
|
||||||
@ -561,7 +569,7 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode,
|
|||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
self.textInputNode.isHidden = false
|
self.textInputNode.isHidden = false
|
||||||
self.messageClipNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { _ in
|
self.messageClipNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in
|
||||||
completedAlpha = true
|
completedAlpha = true
|
||||||
intermediateCompletion()
|
intermediateCompletion()
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1676,6 +1676,7 @@ public class PremiumLimitScreen: ViewControllerComponentContainer {
|
|||||||
private let context: AccountContext
|
private let context: AccountContext
|
||||||
private var action: (() -> Bool)?
|
private var action: (() -> Bool)?
|
||||||
private let openPeer: (EnginePeer) -> Void
|
private let openPeer: (EnginePeer) -> Void
|
||||||
|
public var disposed: () -> Void = {}
|
||||||
|
|
||||||
private let hapticFeedback = HapticFeedback()
|
private let hapticFeedback = HapticFeedback()
|
||||||
|
|
||||||
@ -1707,6 +1708,10 @@ public class PremiumLimitScreen: ViewControllerComponentContainer {
|
|||||||
fatalError("init(coder:) has not been implemented")
|
fatalError("init(coder:) has not been implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
self.disposed()
|
||||||
|
}
|
||||||
|
|
||||||
public override func viewDidLoad() {
|
public override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
|||||||
@ -230,7 +230,7 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||||||
if let stats = item.stats as? ChannelBoostStatus {
|
if let stats = item.stats as? ChannelBoostStatus {
|
||||||
topLeftValueLabelLayoutAndApply = makeTopLeftValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "\(stats.level)", font: valueFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
|
topLeftValueLabelLayoutAndApply = makeTopLeftValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "\(stats.level)", font: valueFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
|
||||||
|
|
||||||
topRightValueLabelLayoutAndApply = makeTopRightValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "\(Int(stats.premiumAudience?.value ?? 0))", font: valueFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
|
topRightValueLabelLayoutAndApply = makeTopRightValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "≈\(Int(stats.premiumAudience?.value ?? 0))", font: valueFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
|
||||||
|
|
||||||
bottomLeftValueLabelLayoutAndApply = makeBottomLeftValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "\(stats.boosts)", font: valueFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
|
bottomLeftValueLabelLayoutAndApply = makeBottomLeftValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "\(stats.boosts)", font: valueFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
|
||||||
|
|
||||||
|
|||||||
@ -1382,6 +1382,9 @@ public final class StoryItemSetContainerComponent: Component {
|
|||||||
if self.sendMessageContext.menuController != nil {
|
if self.sendMessageContext.menuController != nil {
|
||||||
return .pause
|
return .pause
|
||||||
}
|
}
|
||||||
|
if self.sendMessageContext.progressPauseContext.hasExternalController {
|
||||||
|
return .pause
|
||||||
|
}
|
||||||
if let navigationController = component.controller()?.navigationController as? NavigationController {
|
if let navigationController = component.controller()?.navigationController as? NavigationController {
|
||||||
let topViewController = navigationController.topViewController
|
let topViewController = navigationController.topViewController
|
||||||
if !(topViewController is StoryContainerScreen) && !(topViewController is MediaEditorScreen) && !(topViewController is ShareWithPeersScreen) && !(topViewController is AttachmentController) {
|
if !(topViewController is StoryContainerScreen) && !(topViewController is MediaEditorScreen) && !(topViewController is ShareWithPeersScreen) && !(topViewController is AttachmentController) {
|
||||||
|
|||||||
@ -69,6 +69,7 @@ final class StoryItemSetContainerSendMessage {
|
|||||||
weak var statusController: ViewController?
|
weak var statusController: ViewController?
|
||||||
weak var lookupController: UIViewController?
|
weak var lookupController: UIViewController?
|
||||||
weak var menuController: ViewController?
|
weak var menuController: ViewController?
|
||||||
|
var progressPauseContext = StoryProgressPauseContext()
|
||||||
var isViewingAttachedStickers = false
|
var isViewingAttachedStickers = false
|
||||||
|
|
||||||
var currentTooltipUpdateTimer: Foundation.Timer?
|
var currentTooltipUpdateTimer: Foundation.Timer?
|
||||||
@ -2617,8 +2618,25 @@ final class StoryItemSetContainerSendMessage {
|
|||||||
guard let component = view.component, let navigationController = component.controller()?.navigationController as? NavigationController else {
|
guard let component = view.component, let navigationController = component.controller()?.navigationController as? NavigationController else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.progressPauseContext.update = { [weak self, weak view] controller in
|
||||||
|
guard let self, let view else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.progressPauseContext.externalController = controller
|
||||||
|
view.updateIsProgressPaused()
|
||||||
|
}
|
||||||
|
|
||||||
|
let presentationData = component.context.sharedContext.currentPresentationData.with { $0 }.withUpdated(theme: defaultDarkColorPresentationTheme)
|
||||||
|
let updatedPresentationData: (PresentationData, Signal<PresentationData, NoError>) = (presentationData, .single(presentationData))
|
||||||
let peerId = component.slice.peer.id
|
let peerId = component.slice.peer.id
|
||||||
component.context.sharedContext.openResolvedUrl(result, context: component.context, urlContext: .chat(peerId: peerId, updatedPresentationData: nil), navigationController: navigationController, forceExternal: forceExternal, openPeer: { [weak self, weak view] peerId, navigation in
|
component.context.sharedContext.openResolvedUrl(
|
||||||
|
result,
|
||||||
|
context: component.context,
|
||||||
|
urlContext: .chat(peerId: peerId, updatedPresentationData: updatedPresentationData),
|
||||||
|
navigationController: navigationController,
|
||||||
|
forceExternal: forceExternal,
|
||||||
|
openPeer: { [weak self, weak view] peerId, navigation in
|
||||||
guard let self, let view, let component = view.component, let controller = component.controller() as? StoryContainerScreen else {
|
guard let self, let view, let component = view.component, let controller = component.controller() as? StoryContainerScreen else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -2682,13 +2700,14 @@ final class StoryItemSetContainerSendMessage {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
controller.present(c, in: .window(.root), with: a)
|
controller.present(c, in: .window(.root), with: a)
|
||||||
}, dismissInput: { [weak view] in
|
},
|
||||||
|
dismissInput: { [weak view] in
|
||||||
guard let view else {
|
guard let view else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
view.endEditing(true)
|
view.endEditing(true)
|
||||||
},
|
},
|
||||||
contentContext: nil
|
contentContext: self.progressPauseContext
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3397,3 +3416,12 @@ final class StoryItemSetContainerSendMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class StoryProgressPauseContext {
|
||||||
|
fileprivate weak var externalController: ViewController?
|
||||||
|
public fileprivate(set) var update: (ViewController?) -> Void = { _ in }
|
||||||
|
|
||||||
|
var hasExternalController: Bool {
|
||||||
|
return self.externalController != nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -103,6 +103,7 @@ final class ChatTextInputAudioRecordingTimeNode: ASDisplayNode {
|
|||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
self.stateDisposable.dispose()
|
self.stateDisposable.dispose()
|
||||||
|
self.durationDisposable?.dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateTheme(theme: PresentationTheme) {
|
func updateTheme(theme: PresentationTheme) {
|
||||||
|
|||||||
@ -836,6 +836,10 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
case let .boost(peerId, status, canApplyStatus):
|
case let .boost(peerId, status, canApplyStatus):
|
||||||
|
var forceDark = false
|
||||||
|
if let updatedPresentationData, updatedPresentationData.initial.theme.overallDarkAppearance {
|
||||||
|
forceDark = true
|
||||||
|
}
|
||||||
let _ = (context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId))
|
let _ = (context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId))
|
||||||
|> deliverOnMainQueue).startStandalone(next: { peer in
|
|> deliverOnMainQueue).startStandalone(next: { peer in
|
||||||
guard let peer, let status else {
|
guard let peer, let status else {
|
||||||
@ -868,7 +872,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
|||||||
|
|
||||||
var updateImpl: (() -> Void)?
|
var updateImpl: (() -> Void)?
|
||||||
var dismissImpl: (() -> Void)?
|
var dismissImpl: (() -> Void)?
|
||||||
let controller = PremiumLimitScreen(context: context, subject: subject, count: Int32(status.boosts), action: {
|
let controller = PremiumLimitScreen(context: context, subject: subject, count: Int32(status.boosts), forceDark: forceDark, action: {
|
||||||
if isBoosted {
|
if isBoosted {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -918,7 +922,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
let controller = textAlertController(sharedContext: context.sharedContext, title: title, text: text, actions: actions, parseMarkdown: true)
|
let controller = textAlertController(sharedContext: context.sharedContext, updatedPresentationData: updatedPresentationData, title: title, text: text, actions: actions, parseMarkdown: true)
|
||||||
present(controller, nil)
|
present(controller, nil)
|
||||||
}
|
}
|
||||||
return dismiss
|
return dismiss
|
||||||
@ -928,12 +932,21 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
|||||||
})
|
})
|
||||||
navigationController?.pushViewController(controller)
|
navigationController?.pushViewController(controller)
|
||||||
|
|
||||||
|
if let storyProgressPauseContext = contentContext as? StoryProgressPauseContext {
|
||||||
|
storyProgressPauseContext.update(controller)
|
||||||
|
|
||||||
|
let updateExternalController = storyProgressPauseContext.update
|
||||||
|
controller.disposed = {
|
||||||
|
updateExternalController(nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
updateImpl = { [weak controller] in
|
updateImpl = { [weak controller] in
|
||||||
if let _ = status.nextLevelBoosts {
|
if let _ = status.nextLevelBoosts {
|
||||||
let _ = context.engine.peers.applyChannelBoost(peerId: peerId).startStandalone()
|
let _ = context.engine.peers.applyChannelBoost(peerId: peerId).startStandalone()
|
||||||
controller?.updateSubject(nextSubject, count: nextCount)
|
controller?.updateSubject(nextSubject, count: nextCount)
|
||||||
} else {
|
} else {
|
||||||
controller?.dismiss()
|
dismissImpl?()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dismissImpl = { [weak controller] in
|
dismissImpl = { [weak controller] in
|
||||||
|
|||||||
@ -90,6 +90,10 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: EnginePeer.Id?, n
|
|||||||
controller.present(JoinLinkPreviewController(context: context, link: link, navigateToPeer: { peer, peekData in
|
controller.present(JoinLinkPreviewController(context: context, link: link, navigateToPeer: { peer, peekData in
|
||||||
openResolvedPeerImpl(peer, .chat(textInputState: nil, subject: nil, peekData: peekData))
|
openResolvedPeerImpl(peer, .chat(textInputState: nil, subject: nil, peekData: peekData))
|
||||||
}, parentNavigationController: controller.navigationController as? NavigationController), in: .window(.root))
|
}, parentNavigationController: controller.navigationController as? NavigationController), in: .window(.root))
|
||||||
|
case .boost:
|
||||||
|
if let navigationController = controller.navigationController as? NavigationController {
|
||||||
|
openResolvedUrlImpl(result, context: context, urlContext: peerId.flatMap { .chat(peerId: $0, updatedPresentationData: nil) } ?? .generic, navigationController: navigationController, forceExternal: false, openPeer: { _, _ in }, sendFile: nil, sendSticker: nil, joinVoiceChat: nil, present: { c, a in }, dismissInput: {}, contentContext: nil)
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user