Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.20 KB | None | 0 0
  1. //
  2. // LixOverrideViewController.swift
  3. // Learning
  4. //
  5. // Modified from Voyager
  6. // Created by Derrick Showers on 1/11/18.
  7. // Copyright © 2016 LinkedIn. All rights reserved.
  8. //
  9.  
  10. import ArtDeco
  11. import LIAuthLibrary
  12. import Networking
  13. import UIKit
  14. import LixLib
  15.  
  16. final class LixOverrideViewController: UITableViewController {
  17.  
  18. // MARK: - Constants
  19.  
  20. private enum Constants {
  21. static let lixEnabledValue = "enabled"
  22. static let lixControlValue = "control"
  23. }
  24.  
  25. // MARK: - Private Properties
  26.  
  27. private let reuseIdentifier = "LROROverrideCell"
  28.  
  29. private let searchController = UISearchController(searchResultsController: nil)
  30.  
  31. private var lixOverrideData: [LixOverrideData] = []
  32.  
  33. // MARK: Lifecycle
  34.  
  35. override func viewDidLoad() {
  36. super.viewDidLoad()
  37.  
  38. let preAuthLixData = LixOverrideData(sectionTitle: "PreAuth Lix in \(LINETEnvironment.currentEnvironment())", lixDefinitions: LixManager.guest.allValues)
  39. let authLixData = LixOverrideData(sectionTitle: "Auth Lix in \(LINETEnvironment.currentEnvironment())", lixDefinitions: LixManager.member.allValues)
  40. let serverLixData = ServerLixOverrideData(sectionTitle: "Server Lix in \(LINETEnvironment.currentEnvironment())")
  41.  
  42. lixOverrideData = [preAuthLixData, authLixData, serverLixData]
  43.  
  44. readOverrideLixData()
  45.  
  46. searchController.searchResultsUpdater = self
  47. searchController.dimsBackgroundDuringPresentation = false
  48. searchController.hidesNavigationBarDuringPresentation = false
  49. definesPresentationContext = true
  50. tableView.tableHeaderView = searchController.searchBar
  51. navigationItem.rightBarButtonItems = [
  52. UIBarButtonItem(title: "Reset All", style: .plain, target: self, action: #selector(resetAll)),
  53. UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addLix))
  54. ]
  55.  
  56. // Set up the pull-to-refresh control
  57. let rc = UIRefreshControl()
  58. refreshControl = rc
  59. rc.addTarget(self, action: #selector(onRefresh), for: .valueChanged)
  60. }
  61.  
  62. // MARK: - Private Helpers
  63.  
  64. private func filterContentForSearchText(_ searchText: String) {
  65. lixOverrideData.forEach { lixData in lixData.filterText = searchText }
  66. tableView.reloadData()
  67. }
  68.  
  69. private func setSingleLixOverride(_ lixDefinition: LixDefinition, value: String) {
  70. setLixOverrideValue(lixDefinition, value: value)
  71. reloadOverrideLixData()
  72. }
  73.  
  74. private func resetSingleLixOverride(_ lixDefinition: LixDefinition) {
  75. resetLixOverrideValue(lixDefinition)
  76. reloadOverrideLixData()
  77. }
  78.  
  79. private func readOverrideLixData() {
  80. let overrides = LINETLRORCookieManager.allLROR(forDomain: LINETEnvironment.currentHost())
  81. lixOverrideData.forEach { lixData in lixData.clearOverrides() }
  82. overrides?.forEach { (name, value) in
  83. guard let nameString = name as? String else {
  84. return
  85. }
  86. guard let valueString = value as? String else {
  87. return
  88. }
  89. var foundMatch = false
  90. foundMatch = lixOverrideData[0].overrideLix(nameString, lixValue: valueString) || foundMatch
  91. foundMatch = lixOverrideData[1].overrideLix(nameString, lixValue: valueString) || foundMatch
  92. if !foundMatch {
  93. _ = lixOverrideData[2].overrideLix(nameString, lixValue: valueString)
  94. }
  95. }
  96. }
  97.  
  98. private func reloadOverrideLixData() {
  99. readOverrideLixData()
  100. tableView.reloadData()
  101. }
  102.  
  103. private func showValueInputAlertView(_ lixDefinition: LixDefinition) {
  104. let alert = UIAlertController.init(title: "Custom Lix", message: lixDefinition.key, preferredStyle: .alert)
  105. alert.addTextField { (textField) -> Void in
  106. textField.placeholder = "Enter custom value"
  107. }
  108. alert.addAction(UIAlertAction(title: "Set Custom Value", style: .default, handler: { [weak self] (_) -> Void in
  109. let textField = alert.textFields![0] as UITextField
  110. if let updatedValue = textField.text, !updatedValue.isEmpty {
  111. self?.setSingleLixOverride(lixDefinition, value: updatedValue)
  112. } else {
  113. if let toastView = AlertToastView.toastView(message: "Please enter a custom value.", success: false) {
  114. ToastsManager.shared.enqueueToast(toastView)
  115. }
  116. }
  117. }))
  118. alert.addAction(UIAlertAction(title: "Set Enabled", style: .default, handler: { [weak self] (_) -> Void in
  119. self?.setSingleLixOverride(lixDefinition, value: Constants.lixEnabledValue)
  120. }))
  121. alert.addAction(UIAlertAction(title: "Set Control", style: .default, handler: { [weak self] (_) -> Void in
  122. self?.setSingleLixOverride(lixDefinition, value: Constants.lixControlValue)
  123. }))
  124. alert.addAction(UIAlertAction(title: "Reset", style: .destructive, handler: { [weak self] (_) -> Void in
  125. self?.resetSingleLixOverride(lixDefinition)
  126. }))
  127. alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
  128. present(alert, animated: true, completion: nil)
  129. }
  130.  
  131. private func setLixOverrideValue(_ lixDefinition: LixDefinition, value: String) {
  132. LixManager.shared.overrideTreatment(value: value, for: lixDefinition)
  133. LINETLRORCookieManager.setLRORWithName(lixDefinition.key, value: value, domain: LINETEnvironment.currentHost())
  134. }
  135.  
  136. private func resetLixOverrideValue(_ lixDefinition: LixDefinition) {
  137. LixManager.shared.resetOverriddenTreatment(for: lixDefinition)
  138. LINETLRORCookieManager.removeLROR(withName: lixDefinition.key, domain: LINETEnvironment.currentHost())
  139. }
  140.  
  141. private func resetAllLixOverrideValues() {
  142. let environmentDomain = LINETEnvironment.currentHost()
  143. for (cookieNameObject, _) in LINETLRORCookieManager.allLROR(forDomain: environmentDomain) {
  144. if let cookieName = cookieNameObject as? String {
  145. LINETLRORCookieManager.removeLROR(withName: cookieName, domain: environmentDomain)
  146. }
  147. }
  148.  
  149. LixManager.shared.resetOverriddenTreatmentForAllGuestLixes()
  150. LixManager.shared.resetOverriddenTreatmentForAllMemberLixes()
  151. }
  152.  
  153. @objc func addLix(_ sender: AnyObject) {
  154. guard let viewController = AddLixViewController.present(from: self, with: nil, style: .modal) as? AddLixViewController else {
  155. return
  156. }
  157. viewController.delegate = self
  158. }
  159.  
  160. @objc func onRefresh(_ sender: AnyObject) {
  161. reloadOverrideLixData()
  162. refreshControl?.endRefreshing()
  163. }
  164.  
  165. @objc func resetAll(_ sender: AnyObject) {
  166. resetAllLixOverrideValues()
  167. reloadOverrideLixData()
  168. }
  169. }
  170.  
  171. // MARK: - UITableViewDataSource
  172. extension LixOverrideViewController {
  173.  
  174. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  175. searchController.searchBar.resignFirstResponder()
  176. let section = (indexPath as NSIndexPath).section
  177. let row = (indexPath as NSIndexPath).row
  178.  
  179. guard section < lixOverrideData.count else {
  180. return
  181. }
  182.  
  183. guard let lixDefinition = lixOverrideData[safe: section]?.filteredLixDefinitions[safe: row] else {
  184. return
  185. }
  186.  
  187. showValueInputAlertView(lixDefinition)
  188. }
  189.  
  190. override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
  191. let button = UITableViewRowAction(style: .default, title: "Reset") { [weak self] (_: UITableViewRowAction!, indexPath: IndexPath!) -> Void in
  192. let section = indexPath.section
  193. let row = indexPath.row
  194. if let lixDefinition = self?.lixOverrideData[safe: section]?.filteredLixDefinitions[safe: row] {
  195. self?.resetSingleLixOverride(lixDefinition)
  196. }
  197. }
  198.  
  199. return [button]
  200. }
  201.  
  202. override func tableView (_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
  203. // Need this for `func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath)` to work.
  204. return true
  205. }
  206. }
  207.  
  208. // MARK: - UITableViewDelegate
  209. extension LixOverrideViewController {
  210.  
  211. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  212. guard section < lixOverrideData.count else {
  213. fatalError("LiXOverrideViewController's table view has too many sections)")
  214. }
  215.  
  216. return lixOverrideData[section].filteredLixDefinitions.count
  217. }
  218.  
  219. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  220. let row = (indexPath as NSIndexPath).row
  221. let section = (indexPath as NSIndexPath).section
  222.  
  223. guard section < lixOverrideData.count else {
  224. fatalError("LiXOverrideViewController's table view has too many sections)")
  225. }
  226.  
  227. let lixData = lixOverrideData[section]
  228.  
  229. let cell = (tableView.dequeueReusableCell(withIdentifier: reuseIdentifier)
  230. ?? UITableViewCell(style: .subtitle, reuseIdentifier: reuseIdentifier))
  231.  
  232. let lixDefinition = lixData.filteredLixDefinitions[row]
  233. cell.textLabel?.text = lixDefinition.key
  234. cell.textLabel?.font = ARTTextStyle.body1.muted.limitedSize.font
  235. if let value = lixData.overridesMap[lixDefinition] {
  236. cell.detailTextLabel?.artStyle = ARTTextStyle.caption.muted.bold.link.limitedSize
  237. cell.detailTextLabel?.text = value
  238. } else {
  239. cell.detailTextLabel?.artStyle = ARTTextStyle.caption.muted.limitedSize
  240. cell.detailTextLabel?.text = LixManager.shared.treatment(for: lixDefinition)
  241. }
  242.  
  243. return cell
  244. }
  245.  
  246. override func numberOfSections(in tableView: UITableView) -> Int {
  247. return lixOverrideData.count
  248. }
  249.  
  250. override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
  251. guard section < lixOverrideData.count else {
  252. fatalError("LiXOverrideViewController's table view has too many sections)")
  253. }
  254.  
  255. return lixOverrideData[section].sectionTitle
  256. }
  257. }
  258.  
  259. // MARK: - AddLixViewControllerDelegate
  260.  
  261. extension LixOverrideViewController: AddLixViewControllerDelegate {
  262.  
  263. func addLixViewController(_ vc: AddLixViewController, didAddLixKey lixData: (lixKey: String, value: String?)) {
  264. let lixValue = lixData.value ?? Constants.lixControlValue
  265. let lixName = lixData.lixKey
  266.  
  267. if !lixName.isEmpty {
  268. setSingleLixOverride(LixDefinition(key: lixName), value: lixValue)
  269. } else if let toastAlertView = AlertToastView.toastView(message: "Please enter a lix name.", success: false) {
  270. ToastsManager.shared.enqueueToast(toastAlertView)
  271. }
  272. }
  273. }
  274.  
  275. extension LixOverrideViewController: UISearchResultsUpdating {
  276. public func updateSearchResults(for searchController: UISearchController) {
  277. filterContentForSearchText(searchController.searchBar.text!)
  278. }
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement