MainHomeView.swift 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // LoopFollow
  2. // MainHomeView.swift
  3. import SwiftUI
  4. struct MainHomeView: View {
  5. // Deliberately not @ObservedObject: this view only passes the model on.
  6. // The chart views observe what they each need, so data and (especially)
  7. // per-frame pan/zoom updates don't re-evaluate this whole screen.
  8. let chartModel: BGChartModel
  9. @ObservedObject var infoManager: InfoManager
  10. @ObservedObject var statsModel: StatsDisplayModel
  11. @ObservedObject var showSmallGraph = Storage.shared.showSmallGraph
  12. @ObservedObject var showStats = Storage.shared.showStats
  13. @ObservedObject var hideInfoTable = Storage.shared.hideInfoTable
  14. @ObservedObject var smallGraphHeight = Storage.shared.smallGraphHeight
  15. @ObservedObject var url = Storage.shared.url
  16. @ObservedObject var graphTimeZoneEnabled = Storage.shared.graphTimeZoneEnabled
  17. @ObservedObject var graphTimeZoneIdentifier = Storage.shared.graphTimeZoneIdentifier
  18. var onRefresh: (() -> Void)?
  19. var onStatsTap: (() -> Void)?
  20. private var timeZoneOverride: String? {
  21. guard graphTimeZoneEnabled.value,
  22. let tz = TimeZone(identifier: graphTimeZoneIdentifier.value)
  23. else { return nil }
  24. return tz.identifier
  25. }
  26. private var isNightscoutEnabled: Bool {
  27. !url.value.isEmpty
  28. }
  29. var body: some View {
  30. VStack(spacing: 8) {
  31. // Top section: BG display + info table
  32. HStack(spacing: 10) {
  33. BGDisplayView(onRefresh: onRefresh)
  34. if isNightscoutEnabled && !hideInfoTable.value {
  35. InfoTableView(infoManager: infoManager, timeZoneOverride: timeZoneOverride)
  36. .dynamicTypeSize(...DynamicTypeSize.accessibility1)
  37. .frame(minWidth: 160, maxWidth: 250)
  38. .overlay(
  39. Rectangle()
  40. .fill(Color(UIColor.darkGray))
  41. .frame(width: 2),
  42. alignment: .leading
  43. )
  44. }
  45. }
  46. .fixedSize(horizontal: false, vertical: true)
  47. // Main chart (fills remaining space)
  48. BGChartView(model: chartModel, config: .main)
  49. // Small overview chart
  50. if showSmallGraph.value {
  51. BGChartView(model: chartModel, config: .small)
  52. .frame(height: CGFloat(smallGraphHeight.value))
  53. }
  54. // Statistics
  55. if showStats.value {
  56. StatsDisplayView(model: statsModel, onTap: onStatsTap)
  57. }
  58. }
  59. .padding(8)
  60. }
  61. }