Various improvements

This commit is contained in:
Ilya Laktyushin 2026-01-25 22:17:49 +04:00
parent 7f59789ffc
commit 0d12dd29ad
190 changed files with 16735 additions and 5317 deletions

View file

@ -23,6 +23,20 @@ public enum CallListControllerMode {
case navigation
}
public enum CallListEntryTag: ItemListItemTag, Equatable {
case edit
case showTab
case missed
public func isEqual(to other: ItemListItemTag) -> Bool {
if let other = other as? CallListEntryTag, self == other {
return true
} else {
return false
}
}
}
private final class DeleteAllButtonNode: ASDisplayNode {
private let pressed: () -> Void
@ -69,6 +83,8 @@ private final class DeleteAllButtonNode: ASDisplayNode {
}
}
public final class CallListController: TelegramBaseController {
private var controllerNode: CallListControllerNode {
return self.displayNode as! CallListControllerNode
@ -81,6 +97,7 @@ public final class CallListController: TelegramBaseController {
private let context: AccountContext
private let mode: CallListControllerMode
private let focusOnItemTag: CallListEntryTag?
private var presentationData: PresentationData
private var presentationDataDisposable: Disposable?
@ -96,9 +113,15 @@ public final class CallListController: TelegramBaseController {
private let clearDisposable = MetaDisposable()
private var createConferenceCallDisposable: Disposable?
public init(context: AccountContext, mode: CallListControllerMode) {
public init(
context: AccountContext,
mode: CallListControllerMode,
focusOnItemTag: CallListEntryTag? = nil
) {
self.context = context
self.mode = mode
self.focusOnItemTag = focusOnItemTag
self.presentationData = context.sharedContext.currentPresentationData.with { $0 }
self.segmentedTitleView = ItemListControllerSegmentedTitleView(theme: self.presentationData.theme, segments: [self.presentationData.strings.Calls_All, self.presentationData.strings.Calls_Missed], selectedIndex: 0)
@ -409,7 +432,7 @@ public final class CallListController: TelegramBaseController {
if let strongSelf = self {
strongSelf.callPressed()
}
})
}, focusOnItemTag: self.focusOnItemTag)
if case .navigation = self.mode {
self.controllerNode.navigationBar = self.navigationBar
@ -421,6 +444,18 @@ public final class CallListController: TelegramBaseController {
}
self._ready.set(self.controllerNode.ready)
self.displayNodeDidLoad()
switch self.focusOnItemTag {
case .edit:
self.editPressed()
case .missed:
Queue.mainQueue().after(0.1) {
self.segmentedTitleView.index = 1
self.controllerNode.updateType(.missed)
}
default:
break
}
}
override public var navigationEdgeEffectExtension: CGFloat {

View file

@ -125,7 +125,7 @@ private func mappedInsertEntries(context: AccountContext, presentationData: Item
case let .displayTab(_, text, value):
return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ItemListSwitchItem(presentationData: presentationData, systemStyle: .glass, title: text, value: value, enabled: true, noCorners: false, sectionId: 0, style: .blocks, updated: { value in
nodeInteraction.updateShowCallsTab(value)
}), directionHint: entry.directionHint)
}, tag: CallListEntryTag.showTab), directionHint: entry.directionHint)
case let .displayTabInfo(_, text):
return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: 0), directionHint: entry.directionHint)
case .openNewCall:
@ -149,7 +149,7 @@ private func mappedUpdateEntries(context: AccountContext, presentationData: Item
case let .displayTab(_, text, value):
return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ItemListSwitchItem(presentationData: presentationData, systemStyle: .glass, title: text, value: value, enabled: true, noCorners: false, sectionId: 0, style: .blocks, updated: { value in
nodeInteraction.updateShowCallsTab(value)
}), directionHint: entry.directionHint)
}, tag: CallListEntryTag.showTab), directionHint: entry.directionHint)
case let .displayTabInfo(_, text):
return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: ItemListTextItem(presentationData: presentationData, text: .plain(text), sectionId: 0), directionHint: entry.directionHint)
case .openNewCall:
@ -184,6 +184,7 @@ final class CallListControllerNode: ASDisplayNode {
private let context: AccountContext
private let mode: CallListControllerMode
private var presentationData: PresentationData
private var focusOnItemTag: CallListEntryTag?
private var containerLayout: (ContainerViewLayout, CGFloat)?
@ -241,7 +242,7 @@ final class CallListControllerNode: ASDisplayNode {
private var previousContentOffset: ListViewVisibleContentOffset?
init(controller: CallListController, context: AccountContext, mode: CallListControllerMode, presentationData: PresentationData, call: @escaping (EngineMessage) -> Void, joinGroupCall: @escaping (EnginePeer.Id, EngineGroupCallDescription) -> Void, openInfo: @escaping (EnginePeer.Id, [EngineMessage]) -> Void, emptyStateUpdated: @escaping (Bool) -> Void, openNewCall: @escaping () -> Void) {
init(controller: CallListController, context: AccountContext, mode: CallListControllerMode, presentationData: PresentationData, call: @escaping (EngineMessage) -> Void, joinGroupCall: @escaping (EnginePeer.Id, EngineGroupCallDescription) -> Void, openInfo: @escaping (EnginePeer.Id, [EngineMessage]) -> Void, emptyStateUpdated: @escaping (Bool) -> Void, openNewCall: @escaping () -> Void, focusOnItemTag: CallListEntryTag?) {
self.controller = controller
self.context = context
self.mode = mode
@ -253,6 +254,7 @@ final class CallListControllerNode: ASDisplayNode {
self.openNewCall = openNewCall
self.currentState = CallListNodeState(presentationData: ItemListPresentationData(presentationData), dateTimeFormat: presentationData.dateTimeFormat, disableAnimations: true, editing: false, messageIdWithRevealedOptions: nil)
self.statePromise = ValuePromise(self.currentState, ignoreRepeated: true)
self.focusOnItemTag = focusOnItemTag
self.listNode = ListView()
self.listNode.verticalScrollIndicatorColor = self.presentationData.theme.list.scrollIndicatorColor
@ -861,6 +863,16 @@ final class CallListControllerNode: ASDisplayNode {
strongSelf._ready.set(true)
}
if let focusOnItemTag = strongSelf.focusOnItemTag {
strongSelf.focusOnItemTag = nil
strongSelf.listNode.forEachItemNode { itemNode in
if let itemNode = itemNode as? ItemListItemNode, let tag = itemNode.tag, tag.isEqual(to: focusOnItemTag) {
itemNode.displayHighlight()
}
}
}
completion()
}
}