mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 09:20:08 +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.storiesPostingAvailabilityDisposable?.dispose()
|
||||
self.sharedOpenStoryProgressDisposable.dispose()
|
||||
for (_, disposable) in self.preloadStoryResourceDisposables {
|
||||
disposable.dispose()
|
||||
}
|
||||
}
|
||||
|
||||
private func updateNavigationMetadata() {
|
||||
|
||||
@ -351,6 +351,8 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode,
|
||||
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) {
|
||||
self.sendButtonNode.view.addSubview(snapshotView)
|
||||
}
|
||||
@ -447,9 +449,7 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode,
|
||||
|
||||
self.textInputNode.textView.setContentOffset(self.textInputNode.textView.contentOffset, animated: false)
|
||||
|
||||
UIView.animate(withDuration: 0.2, animations: {
|
||||
self.effectView.effect = makeCustomZoomBlurEffect(isLight: self.presentationData.theme.rootController.keyboardColor == .light)
|
||||
}, completion: { _ in })
|
||||
self.effectView.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.messageBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3)
|
||||
@ -533,24 +533,32 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode,
|
||||
var completedBubble = false
|
||||
var completedAlpha = false
|
||||
|
||||
var completed = false
|
||||
let intermediateCompletion: () -> Void = { [weak self] in
|
||||
if completedEffect && completedButton && completedBubble && completedAlpha {
|
||||
if completedEffect && completedButton && completedBubble && completedAlpha && !completed {
|
||||
completed = true
|
||||
self?.textInputNode.isHidden = false
|
||||
self?.sourceSendButton.isHidden = false
|
||||
completion()
|
||||
}
|
||||
}
|
||||
|
||||
UIView.animate(withDuration: 0.2, animations: {
|
||||
self.effectView.effect = nil
|
||||
}, completion: { _ in
|
||||
self.effectView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in
|
||||
completedEffect = true
|
||||
intermediateCompletion()
|
||||
})
|
||||
|
||||
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 })
|
||||
|
||||
Queue.mainQueue().after(0.45) {
|
||||
if !completed {
|
||||
completed = true
|
||||
self.textInputNode.isHidden = false
|
||||
self.sourceSendButton.isHidden = false
|
||||
completion()
|
||||
}
|
||||
}
|
||||
|
||||
if self.animateInputField {
|
||||
if cancel {
|
||||
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 {
|
||||
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
|
||||
intermediateCompletion()
|
||||
})
|
||||
|
||||
@ -1676,6 +1676,7 @@ public class PremiumLimitScreen: ViewControllerComponentContainer {
|
||||
private let context: AccountContext
|
||||
private var action: (() -> Bool)?
|
||||
private let openPeer: (EnginePeer) -> Void
|
||||
public var disposed: () -> Void = {}
|
||||
|
||||
private let hapticFeedback = HapticFeedback()
|
||||
|
||||
@ -1707,6 +1708,10 @@ public class PremiumLimitScreen: ViewControllerComponentContainer {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
deinit {
|
||||
self.disposed()
|
||||
}
|
||||
|
||||
public override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
|
||||
@ -230,7 +230,7 @@ class StatsOverviewItemNode: ListViewItemNode {
|
||||
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()))
|
||||
|
||||
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()))
|
||||
|
||||
|
||||
@ -1382,6 +1382,9 @@ public final class StoryItemSetContainerComponent: Component {
|
||||
if self.sendMessageContext.menuController != nil {
|
||||
return .pause
|
||||
}
|
||||
if self.sendMessageContext.progressPauseContext.hasExternalController {
|
||||
return .pause
|
||||
}
|
||||
if let navigationController = component.controller()?.navigationController as? NavigationController {
|
||||
let topViewController = navigationController.topViewController
|
||||
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 lookupController: UIViewController?
|
||||
weak var menuController: ViewController?
|
||||
var progressPauseContext = StoryProgressPauseContext()
|
||||
var isViewingAttachedStickers = false
|
||||
|
||||
var currentTooltipUpdateTimer: Foundation.Timer?
|
||||
@ -2617,8 +2618,25 @@ final class StoryItemSetContainerSendMessage {
|
||||
guard let component = view.component, let navigationController = component.controller()?.navigationController as? NavigationController else {
|
||||
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
|
||||
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 {
|
||||
return
|
||||
}
|
||||
@ -2682,13 +2700,14 @@ final class StoryItemSetContainerSendMessage {
|
||||
return
|
||||
}
|
||||
controller.present(c, in: .window(.root), with: a)
|
||||
}, dismissInput: { [weak view] in
|
||||
},
|
||||
dismissInput: { [weak view] in
|
||||
guard let view else {
|
||||
return
|
||||
}
|
||||
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 {
|
||||
self.stateDisposable.dispose()
|
||||
self.durationDisposable?.dispose()
|
||||
}
|
||||
|
||||
func updateTheme(theme: PresentationTheme) {
|
||||
|
||||
@ -836,6 +836,10 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
||||
}
|
||||
})
|
||||
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))
|
||||
|> deliverOnMainQueue).startStandalone(next: { peer in
|
||||
guard let peer, let status else {
|
||||
@ -868,7 +872,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
||||
|
||||
var updateImpl: (() -> 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 {
|
||||
return true
|
||||
}
|
||||
@ -918,7 +922,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
||||
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)
|
||||
}
|
||||
return dismiss
|
||||
@ -928,12 +932,21 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
||||
})
|
||||
navigationController?.pushViewController(controller)
|
||||
|
||||
if let storyProgressPauseContext = contentContext as? StoryProgressPauseContext {
|
||||
storyProgressPauseContext.update(controller)
|
||||
|
||||
let updateExternalController = storyProgressPauseContext.update
|
||||
controller.disposed = {
|
||||
updateExternalController(nil)
|
||||
}
|
||||
}
|
||||
|
||||
updateImpl = { [weak controller] in
|
||||
if let _ = status.nextLevelBoosts {
|
||||
let _ = context.engine.peers.applyChannelBoost(peerId: peerId).startStandalone()
|
||||
controller?.updateSubject(nextSubject, count: nextCount)
|
||||
} else {
|
||||
controller?.dismiss()
|
||||
dismissImpl?()
|
||||
}
|
||||
}
|
||||
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
|
||||
openResolvedPeerImpl(peer, .chat(textInputState: nil, subject: nil, peekData: peekData))
|
||||
}, 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:
|
||||
break
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user