@@ -14,6 +14,9 @@ import SyncCore
14
14
import SwiftSignalKit
15
15
16
16
17
+
18
+
19
+
17
20
private final class ChannelBlacklistControllerArguments {
18
21
let context : AccountContext
19
22
@@ -188,11 +191,11 @@ private struct ChannelBlacklistControllerState: Equatable {
188
191
}
189
192
}
190
193
191
- private func channelBlacklistControllerEntries( view: PeerView , state: ChannelBlacklistControllerState , participants: [ RenderedChannelParticipant ] ? ) -> [ ChannelBlacklistEntry ] {
194
+ private func channelBlacklistControllerEntries( view: PeerView , state: ChannelBlacklistControllerState , participants: [ RenderedChannelParticipant ] ? , inSearch : Bool ) -> [ ChannelBlacklistEntry ] {
192
195
193
196
var entries : [ ChannelBlacklistEntry ] = [ ]
194
197
195
- var index : Int32 = 0
198
+ var index : Int32 = 10
196
199
var sectionId : Int32 = 1
197
200
198
201
@@ -201,16 +204,12 @@ private func channelBlacklistControllerEntries(view: PeerView, state: ChannelBla
201
204
entries. append ( . section( sectionId) )
202
205
sectionId += 1
203
206
204
- if peer. hasPermission ( . banMembers) {
205
- entries. append ( . addMember( sectionId, index, . singleItem) )
206
- index += 1
207
-
208
- entries. append ( . header( sectionId, index, peer. isGroup ? L10n . channelBlacklistDescGroup : L10n . channelBlacklistDescChannel, . textBottomItem) )
209
- index += 1
210
-
207
+ if peer. hasPermission ( . banMembers) , !inSearch {
208
+ entries. append ( . addMember( sectionId, 0 , . singleItem) )
209
+ entries. append ( . header( sectionId, 1 , peer. isGroup ? L10n . channelBlacklistDescGroup : L10n . channelBlacklistDescChannel, . textBottomItem) )
211
210
}
212
211
if let participants = participants {
213
- if !participants. isEmpty {
212
+ if !participants. isEmpty, peer . hasPermission ( . banMembers ) || inSearch {
214
213
entries. append ( . section( sectionId) )
215
214
sectionId += 1
216
215
}
@@ -245,13 +244,19 @@ private func channelBlacklistControllerEntries(view: PeerView, state: ChannelBla
245
244
return entries
246
245
}
247
246
248
- fileprivate func prepareTransition( left: [ AppearanceWrapperEntry < ChannelBlacklistEntry > ] , right: [ AppearanceWrapperEntry < ChannelBlacklistEntry > ] , initialSize: NSSize , arguments: ChannelBlacklistControllerArguments ) -> TableUpdateTransition {
247
+ fileprivate func prepareTransition( left: [ AppearanceWrapperEntry < ChannelBlacklistEntry > ] , right: [ AppearanceWrapperEntry < ChannelBlacklistEntry > ] , initialSize: NSSize , arguments: ChannelBlacklistControllerArguments , inSearch : Bool , searchData : TableSearchVisibleData ) -> TableUpdateTransition {
249
248
250
249
let ( removed, inserted, updated) = proccessEntriesWithoutReverse ( left, right: right) { entry -> TableRowItem in
251
250
return entry. entry. item ( arguments, initialSize: initialSize)
252
251
}
252
+ let searchState : TableSearchViewState ?
253
+ if inSearch {
254
+ searchState = . visible( searchData)
255
+ } else {
256
+ searchState = . none
257
+ }
253
258
254
- return TableUpdateTransition ( deleted: removed, inserted: inserted, updated: updated, animated: true )
259
+ return TableUpdateTransition ( deleted: removed, inserted: inserted, updated: updated, animated: true , searchState : searchState )
255
260
}
256
261
257
262
@@ -265,6 +270,12 @@ class ChannelBlacklistViewController: EditableViewController<TableView> {
265
270
private let updatePeerDisposable = MetaDisposable ( )
266
271
private let disposable : MetaDisposable = MetaDisposable ( )
267
272
273
+ private let _inSearch : ValuePromise < Bool > = ValuePromise ( false )
274
+ private var inSearch : Bool = false {
275
+ didSet {
276
+ _inSearch. set ( self . inSearch)
277
+ }
278
+ }
268
279
init ( _ context: AccountContext , peerId: PeerId ) {
269
280
self . peerId = peerId
270
281
super. init ( context)
@@ -275,6 +286,8 @@ class ChannelBlacklistViewController: EditableViewController<TableView> {
275
286
let context = self . context
276
287
let peerId = self . peerId
277
288
289
+
290
+
278
291
genericView. getBackgroundColor = {
279
292
theme. colors. listBackground
280
293
}
@@ -288,6 +301,8 @@ class ChannelBlacklistViewController: EditableViewController<TableView> {
288
301
}
289
302
290
303
let blacklistPromise = Promise < [ RenderedChannelParticipant ] ? > ( nil )
304
+ let listDisposable = MetaDisposable ( )
305
+
291
306
let viewValue : Atomic < PeerView ? > = Atomic ( value: nil )
292
307
293
308
let restrict : ( PeerId , Bool ) -> Void = { [ weak self] memberId, unban in
@@ -360,38 +375,85 @@ class ChannelBlacklistViewController: EditableViewController<TableView> {
360
375
let peerView = context. account. viewTracker. peerView ( peerId)
361
376
362
377
363
- let ( listDisposable , loadMoreControl) = context. peerChannelMemberCategoriesContextsManager. banned ( postbox: context. account. postbox, network: context. account. network, accountPeerId: context. account. peerId, peerId: peerId, updated: { listState in
378
+ var ( disposable , loadMoreControl) = context. peerChannelMemberCategoriesContextsManager. banned ( postbox: context. account. postbox, network: context. account. network, accountPeerId: context. account. peerId, peerId: peerId, updated: { listState in
364
379
if case . loading( true ) = listState. loadingState, listState. list. isEmpty {
365
380
blacklistPromise. set ( . single( nil ) )
366
381
} else {
367
382
blacklistPromise. set ( . single( listState. list) )
368
383
}
369
384
} )
385
+
386
+ listDisposable. set ( disposable)
387
+
370
388
actionsDisposable. add ( listDisposable)
371
-
389
+
372
390
let initialSize = atomicSize
373
391
let previousEntries : Atomic < [ AppearanceWrapperEntry < ChannelBlacklistEntry > ] > = Atomic ( value: [ ] )
374
392
375
393
376
- let signal = combineLatest ( statePromise. get ( ) , peerView, blacklistPromise. get ( ) , appearanceSignal)
394
+ let searchData = TableSearchVisibleData ( cancelImage: theme. icons. chatSearchCancel, cancel: { [ weak self] in
395
+ guard let strongSelf = self else {
396
+ return
397
+ }
398
+ strongSelf. inSearch = !strongSelf. inSearch
399
+
400
+ ( disposable, loadMoreControl) = context. peerChannelMemberCategoriesContextsManager. banned ( postbox: context. account. postbox, network: context. account. network, accountPeerId: context. account. peerId, peerId: peerId, updated: { listState in
401
+ if case . loading( true ) = listState. loadingState, listState. list. isEmpty {
402
+ blacklistPromise. set ( . single( nil ) )
403
+ } else {
404
+ blacklistPromise. set ( . single( listState. list) )
405
+ }
406
+ } )
407
+ listDisposable. set ( disposable)
408
+
409
+ } , updateState: { state in
410
+ if !state. request. isEmpty {
411
+ ( disposable, loadMoreControl) = context. peerChannelMemberCategoriesContextsManager. restrictedAndBanned ( postbox: context. account. postbox, network: context. account. network, accountPeerId: context. peerId, peerId: peerId, searchQuery: state. request, updated: { listState in
412
+ blacklistPromise. set ( . single( listState. list) )
413
+ } )
414
+ listDisposable. set ( disposable)
415
+ } else {
416
+ ( disposable, loadMoreControl) = context. peerChannelMemberCategoriesContextsManager. banned ( postbox: context. account. postbox, network: context. account. network, accountPeerId: context. account. peerId, peerId: peerId, updated: { listState in
417
+ if case . loading( true ) = listState. loadingState, listState. list. isEmpty {
418
+ blacklistPromise. set ( . single( nil ) )
419
+ } else {
420
+ blacklistPromise. set ( . single( listState. list) )
421
+ }
422
+ } )
423
+ listDisposable. set ( disposable)
424
+ }
425
+ } )
426
+
427
+
428
+ let signal = combineLatest ( statePromise. get ( ) , peerView, blacklistPromise. get ( ) , appearanceSignal, _inSearch. get ( ) )
377
429
|> deliverOnMainQueue
378
- |> map { state, view, blacklist, appearance -> ( TableUpdateTransition , PeerView ) in
430
+ |> map { state, view, blacklist, appearance, inSearch -> ( TableUpdateTransition , PeerView ) in
379
431
_ = viewValue. swap ( view)
380
- let entries = channelBlacklistControllerEntries ( view: view, state: state, participants: blacklist) . map { AppearanceWrapperEntry ( entry: $0, appearance: appearance) }
381
- return ( prepareTransition ( left: previousEntries. swap ( entries) , right: entries, initialSize: initialSize. modify { $0} , arguments: arguments) , view)
432
+ let entries = channelBlacklistControllerEntries ( view: view, state: state, participants: blacklist, inSearch : inSearch ) . map { AppearanceWrapperEntry ( entry: $0, appearance: appearance) }
433
+ return ( prepareTransition ( left: previousEntries. swap ( entries) , right: entries, initialSize: initialSize. modify { $0} , arguments: arguments, inSearch : inSearch , searchData : searchData ) , view)
382
434
} |> afterDisposed {
383
435
actionsDisposable. dispose ( )
384
- }
436
+ } |> deliverOnMainQueue
385
437
386
- disposable. set ( ( signal |> deliverOnMainQueue) . start ( next: { [ weak self] transition, peerView in
387
- if let strongSelf = self {
388
- strongSelf. genericView. merge ( with: transition)
389
- strongSelf. readyOnce ( )
390
- strongSelf. rightBarView. isHidden = strongSelf. genericView. item ( at: 0 ) is SearchEmptyRowItem
391
- if let peer = peerViewMainPeer ( peerView) as? TelegramChannel {
392
- strongSelf. rightBarView. isHidden = strongSelf. rightBarView. isHidden || !peer. hasPermission ( . banMembers)
393
- }
438
+ self . disposable. set ( signal. start ( next: { [ weak self] transition, peerView in
439
+ guard let `self` = self else {
440
+ return
441
+ }
442
+ self . genericView. merge ( with: transition)
443
+ self . readyOnce ( )
444
+ self . rightBarView. isHidden = self . genericView. item ( at: 0 ) is SearchEmptyRowItem
445
+ if let peer = peerViewMainPeer ( peerView) as? TelegramChannel {
446
+ self . rightBarView. isHidden = self . rightBarView. isHidden || !peer. hasPermission ( . banMembers)
394
447
}
448
+
449
+ var hasItems : Bool = false
450
+ self . genericView. enumerateItems ( with: { item -> Bool in
451
+ if item is ShortPeerRowItem {
452
+ hasItems = true
453
+ }
454
+ return !hasItems
455
+ } )
456
+ ( self . centerBarView as? SearchTitleBarView ) ? . updateSearchVisibility ( hasItems || self . inSearch)
395
457
} ) )
396
458
397
459
genericView. setScrollHandler { position in
@@ -406,6 +468,32 @@ class ChannelBlacklistViewController: EditableViewController<TableView> {
406
468
}
407
469
}
408
470
471
+ override func viewDidAppear( _ animated: Bool ) {
472
+ super. viewDidAppear ( animated)
473
+
474
+ window? . set ( handler: { [ weak self] ( ) -> KeyHandlerResult in
475
+ guard let `self` = self else {
476
+ return . rejected
477
+ }
478
+ self . inSearch = !self . inSearch
479
+ return . invoked
480
+ } , with: self , for: . F, modifierFlags: [ . command] )
481
+ }
482
+
483
+ override func viewWillDisappear( _ animated: Bool ) {
484
+ super. viewWillDisappear ( animated)
485
+ window? . removeAllHandlers ( for: self )
486
+ }
487
+
488
+ override func getCenterBarViewOnce( ) -> TitledBarView {
489
+ return SearchTitleBarView ( controller: self , title: . initialize( string: defaultBarTitle, color: theme. colors. text, font: . medium( . title) ) , handler: { [ weak self] in
490
+ guard let strongSelf = self else {
491
+ return
492
+ }
493
+ strongSelf. inSearch = !strongSelf. inSearch
494
+ } )
495
+ }
496
+
409
497
deinit {
410
498
disposable. dispose ( )
411
499
removePeerDisposable. dispose ( )
0 commit comments