This commit is contained in:
Ali 2023-06-24 13:43:57 +03:00
parent a7c7608d21
commit ff0e21e412
4 changed files with 104 additions and 14 deletions

View File

@ -181,7 +181,8 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
private var rawStorySubscriptions: EngineStorySubscriptions?
private var shouldFixStorySubscriptionOrder: Bool = false
private var fixedStorySubscriptionOrder: [EnginePeer.Id] = []
var orderedStorySubscriptions: EngineStorySubscriptions?
private(set) var orderedStorySubscriptions: EngineStorySubscriptions?
private var displayedStoriesTooltip: Bool = false
private var storyProgressDisposable: Disposable?
private var storySubscriptionsDisposable: Disposable?
@ -1853,11 +1854,6 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
return
}
var wasEmpty = true
if let rawStorySubscriptions = self.rawStorySubscriptions, !rawStorySubscriptions.items.isEmpty {
wasEmpty = false
}
self.rawStorySubscriptions = rawStorySubscriptions
var items: [EngineStorySubscriptions.Item] = []
if self.shouldFixStorySubscriptionOrder {
@ -1879,8 +1875,6 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
)
self.fixedStorySubscriptionOrder = items.map(\.peer.id)
let isEmpty = rawStorySubscriptions.items.isEmpty
let transition: ContainedViewLayoutTransition
if self.didAppear {
transition = .animated(duration: 0.4, curve: .spring)
@ -1888,9 +1882,6 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
transition = .immediate
}
let _ = wasEmpty
let _ = isEmpty
self.chatListDisplayNode.temporaryContentOffsetChangeTransition = transition
self.requestLayout(transition: transition)
self.chatListDisplayNode.temporaryContentOffsetChangeTransition = nil
@ -1911,6 +1902,13 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
}
self.storiesReady.set(.single(true))
Queue.mainQueue().after(1.0, { [weak self] in
guard let self else {
return
}
self.maybeDisplayStoryTooltip()
})
})
self.storyProgressDisposable = (self.context.engine.messages.allStoriesUploadProgress()
|> deliverOnMainQueue).start(next: { [weak self] progress in
@ -1922,6 +1920,67 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
}
}
fileprivate func maybeDisplayStoryTooltip() {
let content = self.updateHeaderContent()
if content.secondaryContent != nil {
return
}
guard let chatListTitle = content.primaryContent?.chatListTitle else {
return
}
if chatListTitle.activity {
return
}
if self.displayedStoriesTooltip {
return
}
if let orderedStorySubscriptions = self.orderedStorySubscriptions, !orderedStorySubscriptions.items.isEmpty {
let _ = (ApplicationSpecificNotice.displayChatListStoriesTooltip(accountManager: self.context.sharedContext.accountManager)
|> deliverOnMainQueue).start(next: { [weak self] didDisplay in
guard let self else {
return
}
if didDisplay {
return
}
if let navigationBarView = self.chatListDisplayNode.navigationBarView.view as? ChatListNavigationBar.View, !navigationBarView.storiesUnlocked, !self.displayedStoriesTooltip {
if let storyPeerListView = self.chatListHeaderView()?.storyPeerListView(), let (anchorView, anchorRect) = storyPeerListView.anchorForTooltip() {
self.displayedStoriesTooltip = true
let absoluteFrame = anchorView.convert(anchorRect, to: self.view)
//TODO:localize
let itemList = orderedStorySubscriptions.items.prefix(3).map(\.peer.compactDisplayTitle)
var itemListString: String = itemList.joined(separator: ", ")
if #available(iOS 13.0, *) {
let listFormatter = ListFormatter()
listFormatter.locale = localeWithStrings(self.presentationData.strings)
if let value = listFormatter.string(from: itemList) {
itemListString = value
}
}
let text: String = "Tap above to view updates\nfrom \(itemListString)"
let tooltipController = TooltipController(content: .text(text), baseFontSize: self.presentationData.listsFontSize.baseDisplaySize, timeout: 30.0, dismissByTapOutside: true, dismissImmediatelyOnLayoutUpdate: true, padding: 6.0, innerPadding: UIEdgeInsets(top: 2.0, left: 3.0, bottom: 2.0, right: 3.0))
self.present(tooltipController, in: .current, with: TooltipControllerPresentationArguments(sourceNodeAndRect: { [weak self] in
guard let self else {
return nil
}
return (self.displayNode, absoluteFrame.insetBy(dx: 0.0, dy: 0.0).offsetBy(dx: 0.0, dy: 0.0))
}))
#if !DEBUG
let _ = ApplicationSpecificNotice.setDisplayChatListStoriesTooltip(accountManager: self.context.sharedContext.accountManager).start()
#endif
}
}
})
}
}
public override func displayNodeDidLoad() {
super.displayNodeDidLoad()
@ -2351,7 +2410,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
}
}
func updateHeaderContent(layout: ContainerViewLayout) -> (primaryContent: ChatListHeaderComponent.Content?, secondaryContent: ChatListHeaderComponent.Content?) {
func updateHeaderContent() -> (primaryContent: ChatListHeaderComponent.Content?, secondaryContent: ChatListHeaderComponent.Content?) {
var primaryContent: ChatListHeaderComponent.Content?
if let primaryContext = self.primaryContext {
var backTitle: String?
@ -5684,6 +5743,8 @@ private final class ChatListLocationContext {
}
self.parentController?.requestLayout(transition: .animated(duration: 0.45, curve: .spring))
self.parentController?.maybeDisplayStoryTooltip()
}
private func updateForum(

View File

@ -1915,7 +1915,7 @@ final class ChatListControllerNode: ASDisplayNode, UIGestureRecognizerDelegate {
}
private func updateNavigationBar(layout: ContainerViewLayout, deferScrollApplication: Bool, transition: Transition) -> (navigationHeight: CGFloat, storiesInset: CGFloat) {
let headerContent = self.controller?.updateHeaderContent(layout: layout)
let headerContent = self.controller?.updateHeaderContent()
var tabsNode: ASDisplayNode?
var tabsNodeIsSearch = false
@ -2355,7 +2355,7 @@ final class ChatListControllerNode: ASDisplayNode, UIGestureRecognizerDelegate {
}
private func shouldStopScrolling(listView: ListView, velocity: CGFloat, isPrimary: Bool) -> Bool {
if abs(velocity) > 1.0 {
if abs(velocity) > 0.8 {
return false
}

View File

@ -173,6 +173,7 @@ private enum ApplicationSpecificGlobalNotice: Int32 {
case chatWallpaperLightPreviewTip = 39
case chatWallpaperDarkPreviewTip = 40
case displayChatListContacts = 41
case displayChatListStoriesTooltip = 42
var key: ValueBoxKey {
let v = ValueBoxKey(length: 4)
@ -394,6 +395,10 @@ private struct ApplicationSpecificNoticeKeys {
static func displayChatListContacts() -> NoticeEntryKey {
return NoticeEntryKey(namespace: noticeNamespace(namespace: globalNamespace), key: ApplicationSpecificGlobalNotice.displayChatListContacts.key)
}
static func displayChatListStoriesTooltip() -> NoticeEntryKey {
return NoticeEntryKey(namespace: noticeNamespace(namespace: globalNamespace), key: ApplicationSpecificGlobalNotice.displayChatListStoriesTooltip.key)
}
}
public struct ApplicationSpecificNotice {
@ -1445,6 +1450,26 @@ public struct ApplicationSpecificNotice {
|> ignoreValues
}
public static func displayChatListStoriesTooltip(accountManager: AccountManager<TelegramAccountManagerTypes>) -> Signal<Bool, NoError> {
return accountManager.noticeEntry(key: ApplicationSpecificNoticeKeys.displayChatListStoriesTooltip())
|> map { view -> Bool in
if let _ = view.value?.get(ApplicationSpecificBoolNotice.self) {
return true
} else {
return false
}
}
}
public static func setDisplayChatListStoriesTooltip(accountManager: AccountManager<TelegramAccountManagerTypes>) -> Signal<Never, NoError> {
return accountManager.transaction { transaction -> Void in
if let entry = CodableEntry(ApplicationSpecificBoolNotice()) {
transaction.setNotice(ApplicationSpecificNoticeKeys.displayChatListStoriesTooltip(), entry)
}
}
|> ignoreValues
}
public static func reset(accountManager: AccountManager<TelegramAccountManagerTypes>) -> Signal<Void, NoError> {
return accountManager.transaction { transaction -> Void in
}

View File

@ -323,6 +323,10 @@ public final class StoryPeerListComponent: Component {
})
}
public func anchorForTooltip() -> (UIView, CGRect)? {
return (self.collapsedButton, self.collapsedButton.bounds)
}
public func transitionViewForItem(peerId: EnginePeer.Id) -> (UIView, StoryContainerScreen.TransitionView)? {
if self.collapsedButton.isUserInteractionEnabled {
return nil