mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Refactor ContactListUI and related modules
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import TelegramPermissions
|
||||
|
||||
extension PermissionKind {
|
||||
fileprivate static var defaultOrder: [PermissionKind] {
|
||||
return [.contacts, .notifications]
|
||||
}
|
||||
}
|
||||
|
||||
public enum PermissionUIRequestVariation {
|
||||
case `default`
|
||||
case modal(title: String, text: String, allowTitle: String, allowInSettingsTitle: String)
|
||||
}
|
||||
|
||||
public struct PermissionUISplitTest: SplitTest {
|
||||
public typealias Configuration = PermissionUIConfiguration
|
||||
public typealias Event = PermissionUIEvent
|
||||
|
||||
public let postbox: Postbox
|
||||
public let bucket: String?
|
||||
public let configuration: Configuration
|
||||
|
||||
public init(postbox: Postbox, bucket: String?, configuration: Configuration) {
|
||||
self.postbox = postbox
|
||||
self.bucket = bucket
|
||||
self.configuration = configuration
|
||||
}
|
||||
|
||||
public struct PermissionUIConfiguration: SplitTestConfiguration {
|
||||
public static var defaultValue: PermissionUIConfiguration {
|
||||
return PermissionUIConfiguration(contacts: .default, notifications: .default, order: PermissionKind.defaultOrder)
|
||||
}
|
||||
|
||||
public let contacts: PermissionUIRequestVariation
|
||||
public let notifications: PermissionUIRequestVariation
|
||||
public let order: [PermissionKind]
|
||||
|
||||
fileprivate init(contacts: PermissionUIRequestVariation, notifications: PermissionUIRequestVariation, order: [PermissionKind]) {
|
||||
self.contacts = contacts
|
||||
self.notifications = notifications
|
||||
self.order = order
|
||||
}
|
||||
|
||||
static func with(appConfiguration: AppConfiguration) -> (PermissionUIConfiguration, String?) {
|
||||
if let data = appConfiguration.data, let permissions = data["ui_permissions_modals"] as? [String: Any] {
|
||||
let contacts: PermissionUIRequestVariation
|
||||
if let modal = permissions["phonebook_modal"] as? [String: Any] {
|
||||
contacts = .modal(title: modal["popup_title_lang"] as? String ?? "", text: modal["popup_text_lang"] as? String ?? "", allowTitle: modal["popup_allowbtn_lang"] as? String ?? "", allowInSettingsTitle: modal["popup_allowbtn_settings_lang"] as? String ?? "")
|
||||
} else {
|
||||
contacts = .default
|
||||
}
|
||||
|
||||
let notifications: PermissionUIRequestVariation
|
||||
if let modal = permissions["notifications_modal"] as? [String: Any] {
|
||||
notifications = .modal(title: modal["popup_title_lang"] as? String ?? "", text: modal["popup_text_lang"] as? String ?? "", allowTitle: modal["popup_allowbtn_lang"] as? String ?? "", allowInSettingsTitle: modal["popup_allowbtn_settings_lang"] as? String ?? "")
|
||||
} else {
|
||||
notifications = .default
|
||||
}
|
||||
|
||||
let order: [PermissionKind]
|
||||
if let values = permissions["order"] as? [String] {
|
||||
order = values.compactMap { value in
|
||||
switch value {
|
||||
case "phonebook":
|
||||
return .contacts
|
||||
case "notifications":
|
||||
return .notifications
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
} else {
|
||||
order = PermissionKind.defaultOrder
|
||||
}
|
||||
|
||||
return (PermissionUIConfiguration(contacts: contacts, notifications: notifications, order: order), permissions["bucket"] as? String)
|
||||
} else {
|
||||
return (.defaultValue, nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum PermissionUIEvent: String, SplitTestEvent {
|
||||
case ContactsModalRequest = "phbmodal_request"
|
||||
case ContactsRequest = "phbperm_request"
|
||||
case ContactsAllowed = "phbperm_allow"
|
||||
case ContactsDenied = "phbperm_disallow"
|
||||
case NotificationsModalRequest = "ntfmodal_request"
|
||||
case NotificationsRequest = "ntfperm_request"
|
||||
case NotificationsAllowed = "ntfperm_allow"
|
||||
case NotificationsDenied = "ntfperm_disallow"
|
||||
}
|
||||
}
|
||||
|
||||
public func permissionUISplitTest(postbox: Postbox) -> Signal<PermissionUISplitTest, NoError> {
|
||||
return postbox.preferencesView(keys: [PreferencesKeys.appConfiguration])
|
||||
|> mapToSignal { view -> Signal<PermissionUISplitTest, NoError> in
|
||||
if let appConfiguration = view.values[PreferencesKeys.appConfiguration] as? AppConfiguration, appConfiguration.data != nil {
|
||||
let (config, bucket) = PermissionUISplitTest.Configuration.with(appConfiguration: appConfiguration)
|
||||
return .single(PermissionUISplitTest(postbox: postbox, bucket: bucket, configuration: config))
|
||||
} else {
|
||||
return .never()
|
||||
}
|
||||
} |> take(1)
|
||||
}
|
||||
Reference in New Issue
Block a user