ContactSettingsViewModel.swift 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // LoopFollow
  2. // ContactSettingsViewModel.swift
  3. import Combine
  4. import Foundation
  5. extension Bundle {
  6. var displayName: String {
  7. return object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? "LoopFollow"
  8. }
  9. }
  10. class ContactSettingsViewModel: ObservableObject {
  11. var contactName: String {
  12. "\(Bundle.main.displayName) - BG"
  13. }
  14. @Published var contactEnabled: Bool {
  15. didSet {
  16. Storage.shared.contactEnabled.value = contactEnabled
  17. triggerRefresh()
  18. }
  19. }
  20. @Published var contactTrend: ContactIncludeOption {
  21. didSet {
  22. Storage.shared.contactTrend.value = contactTrend
  23. if contactTrend != .include {
  24. contactTrendTarget = .BG
  25. }
  26. if contactTrend != .separate {
  27. if contactDeltaTarget == .Trend { contactDeltaTarget = .BG }
  28. if contactIOBTarget == .Trend { contactIOBTarget = .BG }
  29. }
  30. triggerRefresh()
  31. }
  32. }
  33. @Published var contactDelta: ContactIncludeOption {
  34. didSet {
  35. Storage.shared.contactDelta.value = contactDelta
  36. if contactDelta != .include {
  37. contactDeltaTarget = .BG
  38. }
  39. if contactDelta != .separate {
  40. if contactTrendTarget == .Delta { contactTrendTarget = .BG }
  41. if contactIOBTarget == .Delta { contactIOBTarget = .BG }
  42. }
  43. triggerRefresh()
  44. }
  45. }
  46. @Published var contactIOB: ContactIncludeOption {
  47. didSet {
  48. Storage.shared.contactIOB.value = contactIOB
  49. if contactIOB != .include {
  50. contactIOBTarget = .BG
  51. }
  52. if contactIOB != .separate {
  53. if contactTrendTarget == .IOB { contactTrendTarget = .BG }
  54. if contactDeltaTarget == .IOB { contactDeltaTarget = .BG }
  55. }
  56. triggerRefresh()
  57. }
  58. }
  59. @Published var contactTrendTarget: ContactType {
  60. didSet {
  61. Storage.shared.contactTrendTarget.value = contactTrendTarget
  62. triggerRefresh()
  63. }
  64. }
  65. @Published var contactDeltaTarget: ContactType {
  66. didSet {
  67. Storage.shared.contactDeltaTarget.value = contactDeltaTarget
  68. triggerRefresh()
  69. }
  70. }
  71. @Published var contactIOBTarget: ContactType {
  72. didSet {
  73. Storage.shared.contactIOBTarget.value = contactIOBTarget
  74. triggerRefresh()
  75. }
  76. }
  77. @Published var contactBackgroundColor: String {
  78. didSet {
  79. Storage.shared.contactBackgroundColor.value = contactBackgroundColor
  80. triggerRefresh()
  81. }
  82. }
  83. @Published var contactTextColor: String {
  84. didSet {
  85. Storage.shared.contactTextColor.value = contactTextColor
  86. triggerRefresh()
  87. }
  88. }
  89. @Published var contactColorMode: ContactColorMode {
  90. didSet {
  91. Storage.shared.contactColorMode.value = contactColorMode
  92. triggerRefresh()
  93. }
  94. }
  95. private var cancellables = Set<AnyCancellable>()
  96. init() {
  97. contactEnabled = Storage.shared.contactEnabled.value
  98. contactTrend = Storage.shared.contactTrend.value
  99. contactDelta = Storage.shared.contactDelta.value
  100. contactIOB = Storage.shared.contactIOB.value
  101. contactTrendTarget = Storage.shared.contactTrendTarget.value
  102. contactDeltaTarget = Storage.shared.contactDeltaTarget.value
  103. contactIOBTarget = Storage.shared.contactIOBTarget.value
  104. contactBackgroundColor = Storage.shared.contactBackgroundColor.value
  105. contactTextColor = Storage.shared.contactTextColor.value
  106. contactColorMode = Storage.shared.contactColorMode.value
  107. Storage.shared.contactEnabled.$value
  108. .assign(to: &$contactEnabled)
  109. Storage.shared.contactTrend.$value
  110. .assign(to: &$contactTrend)
  111. Storage.shared.contactDelta.$value
  112. .assign(to: &$contactDelta)
  113. Storage.shared.contactIOB.$value
  114. .assign(to: &$contactIOB)
  115. Storage.shared.contactTrendTarget.$value
  116. .assign(to: &$contactTrendTarget)
  117. Storage.shared.contactDeltaTarget.$value
  118. .assign(to: &$contactDeltaTarget)
  119. Storage.shared.contactIOBTarget.$value
  120. .assign(to: &$contactIOBTarget)
  121. Storage.shared.contactBackgroundColor.$value
  122. .assign(to: &$contactBackgroundColor)
  123. Storage.shared.contactTextColor.$value
  124. .assign(to: &$contactTextColor)
  125. Storage.shared.contactColorMode.$value
  126. .assign(to: &$contactColorMode)
  127. }
  128. func availableTargets(for field: ContactType) -> [ContactType] {
  129. var targets: [ContactType] = [.BG]
  130. if field != .Trend, contactTrend == .separate {
  131. targets.append(.Trend)
  132. }
  133. if field != .Delta, contactDelta == .separate {
  134. targets.append(.Delta)
  135. }
  136. if field != .IOB, contactIOB == .separate {
  137. targets.append(.IOB)
  138. }
  139. return targets
  140. }
  141. private func triggerRefresh() {
  142. NotificationCenter.default.post(name: NSNotification.Name("refresh"), object: nil)
  143. }
  144. }