SettingsViewController.swift 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. //
  2. // SettingsViewController.swift
  3. // LoopFollow
  4. //
  5. // Created by Jon Fawcett on 6/3/20.
  6. // Copyright © 2020 Jon Fawcett. All rights reserved.
  7. //
  8. import UIKit
  9. import Eureka
  10. import EventKit
  11. import EventKitUI
  12. class SettingsViewController: FormViewController {
  13. var appStateController: AppStateController?
  14. func showHideNSDetails() {
  15. var isHidden = false
  16. var isEnabled = true
  17. if UserDefaultsRepository.url.value == "" {
  18. isHidden = true
  19. isEnabled = false
  20. }
  21. if let row1 = form.rowBy(tag: "informationDisplaySettings") as? ButtonRow {
  22. row1.hidden = .function(["hide"], {form in
  23. return isHidden
  24. })
  25. row1.evaluateHidden()
  26. }
  27. guard let nightscoutTab = self.tabBarController?.tabBar.items![3] else { return }
  28. nightscoutTab.isEnabled = isEnabled
  29. }
  30. override func viewDidLoad() {
  31. super.viewDidLoad()
  32. if UserDefaultsRepository.forceDarkMode.value {
  33. overrideUserInterfaceStyle = .dark
  34. }
  35. form
  36. +++ Section(header: "Nightscout Settings", footer: "Changing Nightscout settings requires an app restart.")
  37. <<< TextRow(){ row in
  38. row.title = "URL"
  39. row.placeholder = "https://mycgm.herokuapp.com"
  40. row.value = UserDefaultsRepository.url.value
  41. }.cellSetup { (cell, row) in
  42. cell.textField.autocorrectionType = .no
  43. }.onChange { row in
  44. guard let value = row.value else {
  45. UserDefaultsRepository.url.value = ""
  46. self.showHideNSDetails()
  47. return }
  48. // check the format of the URL entered by the user and trim away any spaces or "/" at the end
  49. var urlNSInput = value.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression)
  50. if urlNSInput.last == "/" {
  51. urlNSInput = String(urlNSInput.dropLast())
  52. }
  53. UserDefaultsRepository.url.value = urlNSInput.lowercased()
  54. // set the row value back to the correctly formatted URL so that the user immediately sees how it should have been written
  55. row.value = UserDefaultsRepository.url.value
  56. self.showHideNSDetails()
  57. globalVariables.nsVerifiedAlert = 0
  58. }
  59. <<< TextRow(){ row in
  60. row.title = "NS Token"
  61. row.placeholder = "Leave blank if not using tokens"
  62. row.value = UserDefaultsRepository.token.value
  63. }.cellSetup { (cell, row) in
  64. cell.textField.autocorrectionType = .no
  65. }.onChange { row in
  66. if row.value == nil {
  67. UserDefaultsRepository.token.value = ""
  68. }
  69. guard let value = row.value else { return }
  70. UserDefaultsRepository.token.value = value
  71. globalVariables.nsVerifiedAlert = 0
  72. }
  73. <<< SegmentedRow<String>("units") { row in
  74. row.title = "Units"
  75. row.options = ["mg/dL", "mmol/L"]
  76. row.value = UserDefaultsRepository.units.value
  77. }.onChange { row in
  78. guard let value = row.value else { return }
  79. UserDefaultsRepository.units.value = value
  80. }
  81. +++ Section("Dexcom Settings")
  82. <<< TextRow(){ row in
  83. row.title = "User Name"
  84. row.value = UserDefaultsRepository.shareUserName.value
  85. }.cellSetup { (cell, row) in
  86. cell.textField.autocorrectionType = .no
  87. }.onChange { row in
  88. if row.value == nil {
  89. UserDefaultsRepository.shareUserName.value = ""
  90. }
  91. guard let value = row.value else { return }
  92. UserDefaultsRepository.shareUserName.value = value
  93. globalVariables.dexVerifiedAlert = 0
  94. }
  95. <<< TextRow(){ row in
  96. row.title = "Password"
  97. row.value = UserDefaultsRepository.sharePassword.value
  98. }.cellSetup { (cell, row) in
  99. cell.textField.autocorrectionType = .no
  100. cell.textField.isSecureTextEntry = true
  101. }.onChange { row in
  102. if row.value == nil {
  103. UserDefaultsRepository.sharePassword.value = ""
  104. }
  105. guard let value = row.value else { return }
  106. UserDefaultsRepository.sharePassword.value = value
  107. globalVariables.dexVerifiedAlert = 0
  108. }
  109. <<< SegmentedRow<String>("shareServer") { row in
  110. row.title = "Server"
  111. row.options = ["US", "NON-US"]
  112. row.value = UserDefaultsRepository.shareServer.value
  113. }.onChange { row in
  114. guard let value = row.value else { return }
  115. UserDefaultsRepository.shareServer.value = value
  116. }
  117. +++ Section("App Settings")
  118. <<< ButtonRow() {
  119. $0.title = "General Settings"
  120. $0.presentationMode = .show(
  121. controllerProvider: .callback(builder: {
  122. let controller = GeneralSettingsViewController()
  123. controller.appStateController = self.appStateController
  124. return controller
  125. }
  126. ), onDismiss: nil)
  127. }
  128. <<< ButtonRow("graphSettings") {
  129. $0.title = "Graph Settings"
  130. $0.presentationMode = .show(
  131. controllerProvider: .callback(builder: {
  132. let controller = GraphSettingsViewController()
  133. controller.appStateController = self.appStateController
  134. return controller
  135. }
  136. ), onDismiss: nil)
  137. }
  138. <<< ButtonRow("informationDisplaySettings") {
  139. $0.title = "Information Display Settings"
  140. $0.presentationMode = .show(
  141. controllerProvider: .callback(builder: {
  142. let controller = InfoDisplaySettingsViewController()
  143. controller.appStateController = self.appStateController
  144. return controller
  145. }
  146. ), onDismiss: nil)
  147. }
  148. +++ Section("Integrations")
  149. <<< ButtonRow() {
  150. $0.title = "Apple Watch and Carplay"
  151. $0.presentationMode = .show(
  152. controllerProvider: .callback(builder: {
  153. let controller = WatchSettingsViewController()
  154. controller.appStateController = self.appStateController
  155. return controller
  156. }
  157. ), onDismiss: nil)
  158. }
  159. +++ Section("Debug Settings")
  160. <<< ButtonRow() {
  161. $0.title = "Configure Debug"
  162. $0.presentationMode = .show(
  163. controllerProvider: .callback(builder: {
  164. let controller = DebugSettingsViewController()
  165. controller.appStateController = self.appStateController
  166. return controller
  167. }
  168. ), onDismiss: nil)
  169. }
  170. showHideNSDetails()
  171. }
  172. }