@@ -10,6 +10,7 @@ import PresentationDataUtils
1010import AccountContext
1111import ItemListPeerItem
1212import ItemListPeerActionItem
13+ import AvatarNode
1314
1415private final class SelectivePrivacyPeersControllerArguments {
1516 let context : AccountContext
@@ -20,15 +21,17 @@ private final class SelectivePrivacyPeersControllerArguments {
2021 let openPeer : ( EnginePeer ) -> Void
2122 let deleteAll : ( ) -> Void
2223 let removePremiumUsers : ( ) -> Void
24+ let removeBots : ( ) -> Void
2325
24- init ( context: AccountContext , setPeerIdWithRevealedOptions: @escaping ( EnginePeer . Id ? , EnginePeer . Id ? ) -> Void , removePeer: @escaping ( EnginePeer . Id ) -> Void , addPeer: @escaping ( ) -> Void , openPeer: @escaping ( EnginePeer ) -> Void , deleteAll: @escaping ( ) -> Void , removePremiumUsers: @escaping ( ) -> Void ) {
26+ init ( context: AccountContext , setPeerIdWithRevealedOptions: @escaping ( EnginePeer . Id ? , EnginePeer . Id ? ) -> Void , removePeer: @escaping ( EnginePeer . Id ) -> Void , addPeer: @escaping ( ) -> Void , openPeer: @escaping ( EnginePeer ) -> Void , deleteAll: @escaping ( ) -> Void , removePremiumUsers: @escaping ( ) -> Void , removeBots : @escaping ( ) -> Void ) {
2527 self . context = context
2628 self . setPeerIdWithRevealedOptions = setPeerIdWithRevealedOptions
2729 self . removePeer = removePeer
2830 self . addPeer = addPeer
2931 self . openPeer = openPeer
3032 self . deleteAll = deleteAll
3133 self . removePremiumUsers = removePremiumUsers
34+ self . removeBots = removeBots
3235 }
3336}
3437
@@ -41,6 +44,7 @@ private enum SelectivePrivacyPeersEntryStableId: Hashable {
4144 case header
4245 case add
4346 case premiumUsers
47+ case bots
4448 case peer( EnginePeer . Id )
4549 case delete
4650}
@@ -49,16 +53,21 @@ private let premiumAvatarIcon: UIImage? = {
4953 return generatePremiumCategoryIcon ( size: CGSize ( width: 31.0 , height: 31.0 ) , cornerRadius: 8.0 )
5054} ( )
5155
56+ private let botsIcon : UIImage ? = {
57+ return generateAvatarImage ( size: CGSize ( width: 31.0 , height: 31.0 ) , icon: generateTintedImage ( image: UIImage ( bundleImageName: " Chat List/Filters/Bot " ) , color: . white) , cornerRadius: 8.0 , color: . violet)
58+ } ( )
59+
5260private enum SelectivePrivacyPeersEntry : ItemListNodeEntry {
5361 case premiumUsersItem( ItemListPeerItemEditing , Bool )
62+ case botsItem( ItemListPeerItemEditing , Bool )
5463 case peerItem( Int32 , PresentationDateTimeFormat , PresentationPersonNameOrder , SelectivePrivacyPeer , ItemListPeerItemEditing , Bool )
5564 case addItem( String , Bool )
5665 case headerItem( String )
5766 case deleteItem( String )
5867
5968 var section : ItemListSectionId {
6069 switch self {
61- case . addItem, . premiumUsersItem, . peerItem, . headerItem:
70+ case . addItem, . premiumUsersItem, . botsItem , . peerItem, . headerItem:
6271 return SelectivePrivacyPeersSection . peers. rawValue
6372 case . deleteItem:
6473 return SelectivePrivacyPeersSection . delete. rawValue
@@ -69,6 +78,8 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
6978 switch self {
7079 case . premiumUsersItem:
7180 return . premiumUsers
81+ case . botsItem:
82+ return . bots
7283 case let . peerItem( _, _, _, peer, _, _) :
7384 return . peer( peer. peer. id)
7485 case . addItem:
@@ -88,6 +99,12 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
8899 } else {
89100 return false
90101 }
102+ case let . botsItem( editing, isEnabled) :
103+ if case . botsItem( editing, isEnabled) = rhs {
104+ return true
105+ } else {
106+ return false
107+ }
91108 case let . peerItem( lhsIndex, lhsDateTimeFormat, lhsNameOrder, lhsPeer, lhsEditing, lhsEnabled) :
92109 if case let . peerItem( rhsIndex, rhsDateTimeFormat, rhsNameOrder, rhsPeer, rhsEditing, rhsEnabled) = rhs {
93110 if lhsIndex != rhsIndex {
@@ -143,26 +160,33 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
143160 return true
144161 case let . peerItem( rhsIndex, _, _, _, _, _) :
145162 return index < rhsIndex
146- case . addItem, . headerItem, . premiumUsersItem:
163+ case . addItem, . headerItem, . premiumUsersItem, . botsItem :
147164 return false
148165 }
149166 case . premiumUsersItem:
150167 switch rhs {
151- case . peerItem, . deleteItem:
168+ case . peerItem, . deleteItem, . botsItem :
152169 return true
153170 case . premiumUsersItem, . addItem, . headerItem:
154171 return false
155172 }
173+ case . botsItem:
174+ switch rhs {
175+ case . peerItem, . deleteItem:
176+ return true
177+ case . botsItem, . premiumUsersItem, . addItem, . headerItem:
178+ return false
179+ }
156180 case . addItem:
157181 switch rhs {
158- case . peerItem, . deleteItem, . premiumUsersItem:
182+ case . peerItem, . deleteItem, . botsItem , . premiumUsersItem:
159183 return true
160184 case . addItem, . headerItem:
161185 return false
162186 }
163187 case . headerItem:
164188 switch rhs {
165- case . peerItem, . deleteItem, . premiumUsersItem, . addItem:
189+ case . peerItem, . deleteItem, . botsItem , . premiumUsersItem, . addItem:
166190 return true
167191 case . headerItem:
168192 return false
@@ -182,6 +206,15 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
182206 } , removePeer: { peerId in
183207 arguments. removePremiumUsers ( )
184208 } )
209+ case let . botsItem( editing, enabled) :
210+ let peer : EnginePeer = . user( TelegramUser (
211+ id: EnginePeer . Id ( namespace: Namespaces . Peer. CloudUser, id: EnginePeer . Id. Id. _internalFromInt64Value ( 2 ) ) , accessHash: nil , firstName: presentationData. strings. PrivacySettings_CategoryBots, lastName: nil , username: nil , phone: nil , photo: [ ] , botInfo: nil , restrictionInfo: nil , flags: [ ] , emojiStatus: nil , usernames: [ ] , storiesHidden: nil , nameColor: nil , backgroundEmojiId: nil , profileColor: nil , profileBackgroundEmojiId: nil , subscriberCount: nil ) )
212+ return ItemListPeerItem ( presentationData: presentationData, dateTimeFormat: PresentationDateTimeFormat ( ) , nameDisplayOrder: . firstLast, context: arguments. context, peer: peer, customAvatarIcon: botsIcon, presence: nil , text: . none, label: . none, editing: editing, switchValue: nil , enabled: enabled, selectable: true , sectionId: self . section, action: {
213+ } , setPeerIdWithRevealedOptions: { previousId, id in
214+ arguments. setPeerIdWithRevealedOptions ( previousId, id)
215+ } , removePeer: { peerId in
216+ arguments. removeBots ( )
217+ } )
185218 case let . peerItem( _, dateTimeFormat, nameDisplayOrder, peer, editing, enabled) :
186219 var text : ItemListPeerItemText = . none
187220 if let group = peer. peer as? TelegramGroup {
@@ -221,11 +254,13 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
221254
222255private struct SelectivePrivacyPeersControllerState : Equatable {
223256 var enableForPremium : Bool
257+ var enableForBots : Bool
224258 var editing : Bool
225259 var peerIdWithRevealedOptions : EnginePeer . Id ?
226260
227- init ( enableForPremium: Bool , editing: Bool , peerIdWithRevealedOptions: EnginePeer . Id ? ) {
261+ init ( enableForPremium: Bool , enableForBots : Bool , editing: Bool , peerIdWithRevealedOptions: EnginePeer . Id ? ) {
228262 self . enableForPremium = enableForPremium
263+ self . enableForBots = enableForBots
229264 self . editing = editing
230265 self . peerIdWithRevealedOptions = peerIdWithRevealedOptions
231266 }
@@ -247,6 +282,10 @@ private func selectivePrivacyPeersControllerEntries(presentationData: Presentati
247282 entries. append ( . premiumUsersItem( ItemListPeerItemEditing ( editable: true , editing: state. editing, revealed: state. peerIdWithRevealedOptions? . id. _internalGetInt64Value ( ) == 1 ) , true ) )
248283 }
249284
285+ if state. enableForBots {
286+ entries. append ( . botsItem( ItemListPeerItemEditing ( editable: true , editing: state. editing, revealed: state. peerIdWithRevealedOptions? . id. _internalGetInt64Value ( ) == 2 ) , true ) )
287+ }
288+
250289 var index : Int32 = 0
251290 for peer in peers {
252291 entries. append ( . peerItem( index, presentationData. dateTimeFormat, presentationData. nameDisplayOrder, peer, ItemListPeerItemEditing ( editable: true , editing: state. editing, revealed: peer. peer. id == state. peerIdWithRevealedOptions) , true ) )
@@ -260,8 +299,8 @@ private func selectivePrivacyPeersControllerEntries(presentationData: Presentati
260299 return entries
261300}
262301
263- public func selectivePrivacyPeersController( context: AccountContext , title: String , initialPeers: [ EnginePeer . Id : SelectivePrivacyPeer ] , initialEnableForPremium: Bool , displayPremiumCategory: Bool , updated: @escaping ( [ EnginePeer . Id : SelectivePrivacyPeer ] , Bool ) -> Void ) -> ViewController {
264- let initialState = SelectivePrivacyPeersControllerState ( enableForPremium: initialEnableForPremium, editing: false , peerIdWithRevealedOptions: nil )
302+ public func selectivePrivacyPeersController( context: AccountContext , title: String , initialPeers: [ EnginePeer . Id : SelectivePrivacyPeer ] , initialEnableForPremium: Bool , displayPremiumCategory: Bool , initialEnableForBots : Bool , displayBotsCategory : Bool , updated: @escaping ( [ EnginePeer . Id : SelectivePrivacyPeer ] , Bool , Bool ) -> Void ) -> ViewController {
303+ let initialState = SelectivePrivacyPeersControllerState ( enableForPremium: initialEnableForPremium, enableForBots : initialEnableForBots , editing: false , peerIdWithRevealedOptions: nil )
265304 let statePromise = ValuePromise ( initialState, ignoreRepeated: true )
266305 let stateValue = Atomic ( value: initialState)
267306 let updateState : ( ( SelectivePrivacyPeersControllerState ) -> SelectivePrivacyPeersControllerState ) -> Void = { f in
@@ -311,7 +350,7 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
311350 for peer in updatedPeers {
312351 updatedPeerDict [ peer. peer. id] = peer
313352 }
314- updated ( updatedPeerDict, stateValue. with ( { $0 } ) . enableForPremium)
353+ updated ( updatedPeerDict, stateValue. with ( { $0 } ) . enableForPremium, stateValue . with ( { $0 } ) . enableForBots )
315354
316355 if updatedPeerDict. isEmpty {
317356 dismissImpl ? ( )
@@ -324,6 +363,7 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
324363 } , addPeer: {
325364 enum AdditionalCategoryId : Int {
326365 case premiumUsers
366+ case bots
327367 }
328368
329369 let presentationData = context. sharedContext. currentPresentationData. with { $0 }
@@ -341,6 +381,17 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
341381 )
342382 ]
343383 }
384+ if displayBotsCategory {
385+ additionalCategories = [
386+ ChatListNodeAdditionalCategory (
387+ id: AdditionalCategoryId . bots. rawValue,
388+ icon: generateAvatarImage ( size: CGSize ( width: 40.0 , height: 40.0 ) , icon: generateTintedImage ( image: UIImage ( bundleImageName: " Chat List/Filters/Bot " ) , color: . white) , cornerRadius: 12.0 , color: . violet) ,
389+ smallIcon: generateAvatarImage ( size: CGSize ( width: 22.0 , height: 22.0 ) , icon: generateTintedImage ( image: UIImage ( bundleImageName: " Chat List/Filters/Bot " ) , color: . white) , iconScale: 0.6 , cornerRadius: 6.0 , circleCorners: true , color: . violet) ,
390+ title: presentationData. strings. PrivacySettings_CategoryBots,
391+ appearance: . option( sectionTitle: presentationData. strings. PrivacySettings_SearchUserTypesHeader)
392+ )
393+ ]
394+ }
344395 var selectedCategories = Set < Int > ( )
345396 if stateValue. with ( { $0 } ) . enableForPremium {
346397 selectedCategories. insert ( AdditionalCategoryId . premiumUsers. rawValue)
@@ -361,9 +412,11 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
361412 |> deliverOnMainQueue) . start ( next: { [ weak controller] result in
362413 var peerIds : [ ContactListPeerId ] = [ ]
363414 var premiumSelected = false
415+ var botsSelected = false
364416 if case let . result( peerIdsValue, additionalOptionIds) = result {
365417 peerIds = peerIdsValue
366418 premiumSelected = additionalOptionIds. contains ( AdditionalCategoryId . premiumUsers. rawValue)
419+ botsSelected = additionalOptionIds. contains ( AdditionalCategoryId . bots. rawValue)
367420 } else {
368421 return
369422 }
@@ -412,11 +465,12 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
412465 for peer in updatedPeers {
413466 updatedPeerDict [ peer. peer. id] = peer
414467 }
415- updated ( updatedPeerDict, premiumSelected)
468+ updated ( updatedPeerDict, premiumSelected, botsSelected )
416469
417470 updateState { state in
418471 var state = state
419472 state. enableForPremium = premiumSelected
473+ state. enableForBots = botsSelected
420474 return state
421475 }
422476
@@ -451,7 +505,7 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
451505 }
452506
453507 peersPromise. set ( . single( [ ] ) )
454- updated ( [ : ] , false )
508+ updated ( [ : ] , false , false )
455509
456510 dismissImpl ? ( )
457511
@@ -483,9 +537,36 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
483537 for peer in updatedPeers {
484538 updatedPeerDict [ peer. peer. id] = peer
485539 }
486- updated ( updatedPeerDict, false )
540+ updated ( updatedPeerDict, stateValue. with ( { $0 } ) . enableForPremium, stateValue. with ( { $0 } ) . enableForBots)
541+
542+ if updatedPeerDict. isEmpty && !stateValue. with ( { $0 } ) . enableForPremium && !stateValue. with ( { $0 } ) . enableForBots {
543+ dismissImpl ? ( )
544+ }
545+
546+ return . complete( )
547+ }
548+
549+ removePeerDisposable. set ( applyPeers. start ( ) )
550+ } , removeBots: {
551+ updateState { state in
552+ var state = state
553+ state. enableForBots = false
554+ return state
555+ }
556+ let applyPeers : Signal < Void , NoError > = peersPromise. get ( )
557+ |> take ( 1 )
558+ |> deliverOnMainQueue
559+ |> mapToSignal { peers -> Signal < Void , NoError > in
560+ let updatedPeers = peers
561+ peersPromise. set ( . single( updatedPeers) )
562+
563+ var updatedPeerDict : [ EnginePeer . Id : SelectivePrivacyPeer ] = [ : ]
564+ for peer in updatedPeers {
565+ updatedPeerDict [ peer. peer. id] = peer
566+ }
567+ updated ( updatedPeerDict, stateValue. with ( { $0 } ) . enableForPremium, stateValue. with ( { $0 } ) . enableForBots)
487568
488- if updatedPeerDict. isEmpty && !stateValue. with ( { $0 } ) . enableForPremium {
569+ if updatedPeerDict. isEmpty && !stateValue. with ( { $0 } ) . enableForPremium && !stateValue . with ( { $0 } ) . enableForBots {
489570 dismissImpl ? ( )
490571 }
491572
0 commit comments