StatRootView.swift 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import Charts
  2. import CoreData
  3. import SwiftDate
  4. import SwiftUI
  5. import Swinject
  6. extension Stat {
  7. struct RootView: BaseView {
  8. let resolver: Resolver
  9. @StateObject var state = StateModel()
  10. @FetchRequest(
  11. entity: TDD.entity(),
  12. sortDescriptors: [NSSortDescriptor(key: "timestamp", ascending: false)]
  13. ) var fetchedTDD: FetchedResults<TDD>
  14. @FetchRequest(
  15. entity: InsulinDistribution.entity(),
  16. sortDescriptors: [NSSortDescriptor(key: "date", ascending: false)]
  17. ) var fetchedInsulin: FetchedResults<InsulinDistribution>
  18. @Environment(\.colorScheme) var colorScheme
  19. enum Duration: String, CaseIterable, Identifiable {
  20. case Today
  21. case Day
  22. case Week
  23. case Month
  24. case Total
  25. var id: Self { self }
  26. }
  27. @State private var selectedDuration: Duration = .Today
  28. @State var paddingAmount: CGFloat? = 10
  29. @State var headline: Color = .secondary
  30. @State var days: Double = 0
  31. @State var pointSize: CGFloat = 3
  32. @State var conversionFactor = 0.0555
  33. private var color: LinearGradient {
  34. colorScheme == .dark ? LinearGradient(
  35. gradient: Gradient(colors: [
  36. Color("Background_1"),
  37. Color("Background_1"),
  38. Color("Background_2")
  39. // Color("Background_1")
  40. ]),
  41. startPoint: .top,
  42. endPoint: .bottom
  43. )
  44. :
  45. LinearGradient(
  46. gradient: Gradient(colors: [Color.gray.opacity(0.1)]),
  47. startPoint: .top,
  48. endPoint: .bottom
  49. )
  50. }
  51. @ViewBuilder func stats() -> some View {
  52. ZStack {
  53. Color.gray.opacity(0.05).ignoresSafeArea(.all)
  54. let filter = DateFilter()
  55. switch selectedDuration {
  56. case .Today:
  57. StatsView(
  58. filter: filter.today,
  59. $state.highLimit,
  60. $state.lowLimit,
  61. $state.units,
  62. $state.overrideUnit
  63. )
  64. case .Day:
  65. StatsView(
  66. filter: filter.day,
  67. $state.highLimit,
  68. $state.lowLimit,
  69. $state.units,
  70. $state.overrideUnit
  71. )
  72. case .Week:
  73. StatsView(
  74. filter: filter.week,
  75. $state.highLimit,
  76. $state.lowLimit,
  77. $state.units,
  78. $state.overrideUnit
  79. )
  80. case .Month:
  81. StatsView(
  82. filter: filter.month,
  83. $state.highLimit,
  84. $state.lowLimit,
  85. $state.units,
  86. $state.overrideUnit
  87. )
  88. case .Total:
  89. StatsView(
  90. filter: filter.total,
  91. $state.highLimit,
  92. $state.lowLimit,
  93. $state.units,
  94. $state.overrideUnit
  95. )
  96. }
  97. }
  98. }
  99. @ViewBuilder func chart() -> some View {
  100. let filter = DateFilter()
  101. switch selectedDuration {
  102. case .Today:
  103. ChartsView(
  104. filter: filter.today,
  105. $state.highLimit,
  106. $state.lowLimit,
  107. $state.units,
  108. $state.overrideUnit,
  109. $state.layingChart
  110. )
  111. case .Day:
  112. ChartsView(
  113. filter: filter.day,
  114. $state.highLimit,
  115. $state.lowLimit,
  116. $state.units,
  117. $state.overrideUnit,
  118. $state.layingChart
  119. )
  120. case .Week:
  121. ChartsView(
  122. filter: filter.week,
  123. $state.highLimit,
  124. $state.lowLimit,
  125. $state.units,
  126. $state.overrideUnit,
  127. $state.layingChart
  128. )
  129. case .Month:
  130. ChartsView(
  131. filter: filter.month,
  132. $state.highLimit,
  133. $state.lowLimit,
  134. $state.units,
  135. $state.overrideUnit,
  136. $state.layingChart
  137. )
  138. case .Total:
  139. ChartsView(
  140. filter: filter.total,
  141. $state.highLimit,
  142. $state.lowLimit,
  143. $state.units,
  144. $state.overrideUnit,
  145. $state.layingChart
  146. )
  147. }
  148. }
  149. var body: some View {
  150. VStack(alignment: .center) {
  151. chart().padding(.top, 20)
  152. Picker("Duration", selection: $selectedDuration) {
  153. ForEach(Duration.allCases) { duration in
  154. Text(NSLocalizedString(duration.rawValue, comment: "")).tag(Optional(duration))
  155. }
  156. }
  157. .pickerStyle(.segmented).background(.cyan.opacity(0.2))
  158. stats()
  159. }.background(color)
  160. .onAppear(perform: configureView)
  161. .navigationBarTitle("Statistics")
  162. .navigationBarTitleDisplayMode(.inline)
  163. .toolbar {
  164. ToolbarItem(placement: .topBarLeading) {
  165. Button("Close") {
  166. state.hideModal()
  167. }
  168. }
  169. }
  170. }
  171. }
  172. }