From 7d2eefb896475590ce2f091b9c4b628b1485564c Mon Sep 17 00:00:00 2001 From: oliverhnat Date: Sat, 6 Jan 2024 19:29:19 +0100 Subject: [PATCH] Changed sleep debt period to an enum --- SleepDebt/HealthKitManager.swift | 39 ++++++++++++++++++++++++-------- SleepDebt/HomeView.swift | 9 +++++++- SleepDebt/SettingsView.swift | 9 ++++++-- SleepDebt/SleepDebtApp.swift | 2 +- 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/SleepDebt/HealthKitManager.swift b/SleepDebt/HealthKitManager.swift index d8021a9..034d3cf 100644 --- a/SleepDebt/HealthKitManager.swift +++ b/SleepDebt/HealthKitManager.swift @@ -8,11 +8,17 @@ import Foundation import HealthKit +enum Days: Int, CaseIterable { + case seven = 7 + case thirty = 30 + case threehundredsixtyfive = 365 +} + class HealthKitManager: ObservableObject { let healthStore = HKHealthStore() - var sleepForLastXDays: Dictionary = [:] + @Published var sleepForLastXDays: Dictionary = [:] init() { let sleep = HKCategoryType(.sleepAnalysis) @@ -26,25 +32,36 @@ class HealthKitManager: ObservableObject { print(error) } } - self.getSleepForLastXDays(days: 7) - self.getSleepForLastXDays(days: 30) + self.updateSleep() + } + + func updateSleep() { + self.getSleepForLastXDays(days: .seven) + self.getSleepForLastXDays(days: .thirty) + self.getSleepForLastXDays(days: .threehundredsixtyfive) } func getSleepForLast7Days() -> Int { - self.getSleepForLastXDays(days: 7) - return self.sleepForLastXDays[7] ?? 0 + self.getSleepForLastXDays(days: .seven) + return self.sleepForLastXDays[Days.seven] ?? 0 } func getSleepForLast30Days() -> Int{ - self.getSleepForLastXDays(days: 30) - return self.sleepForLastXDays[30] ?? 0 + self.getSleepForLastXDays(days: .thirty) + return self.sleepForLastXDays[Days.thirty] ?? 0 } - private func getSleepForLastXDays(days: Int) { + func getSleepForLast365Days() -> Int{ + self.getSleepForLastXDays(days: .threehundredsixtyfive) + return self.sleepForLastXDays[Days.threehundredsixtyfive] ?? 0 + } + + private func getSleepForLastXDays(days: Days) { var totalSleep = 0 let sleep = HKCategoryType(.sleepAnalysis) let sleepPredicate = HKCategoryValueSleepAnalysis.predicateForSamples(equalTo: HKCategoryValueSleepAnalysis.allAsleepValues) - let lastXDays = Date().addingTimeInterval(TimeInterval(-60 * 60 * 24 * days)) + + let lastXDays = Date().addingTimeInterval(TimeInterval(-60 * 60 * 24 * days.rawValue)) let datePredicate = HKQuery.predicateForSamples(withStart: lastXDays, end: .now) let predicates = NSCompoundPredicate(andPredicateWithSubpredicates: [sleepPredicate, datePredicate]) @@ -63,7 +80,9 @@ class HealthKitManager: ObservableObject { let seconds = Int(endDate.timeIntervalSince(startDate)) totalSleep += seconds } - self.sleepForLastXDays[days] = totalSleep + DispatchQueue.main.async { + self.sleepForLastXDays[days] = totalSleep + } } healthStore.execute(query) } diff --git a/SleepDebt/HomeView.swift b/SleepDebt/HomeView.swift index b816be2..bfcb862 100644 --- a/SleepDebt/HomeView.swift +++ b/SleepDebt/HomeView.swift @@ -9,15 +9,22 @@ import SwiftUI struct HomeView: View { @EnvironmentObject var manager: HealthKitManager + @EnvironmentObject var settings: SleepDebtSettings var desiredAmountOfSleep = 8 var body: some View { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) - Text(String(manager.getSleepForLast7Days())) + Text(String(manager.sleepForLastXDays[settings.sleepDebtPeriod] ?? 0)) } .padding() + .onAppear { + manager.updateSleep() + } + .onReceive(settings.$sleepDebtPeriod, perform: { _ in + manager.updateSleep() + }) } } diff --git a/SleepDebt/SettingsView.swift b/SleepDebt/SettingsView.swift index c2f533d..8c2e3df 100644 --- a/SleepDebt/SettingsView.swift +++ b/SleepDebt/SettingsView.swift @@ -18,13 +18,18 @@ struct SettingsView: View { NavigationStack { List { Section { - SettingsNumberFieldView(value: $settings.sleepDebtPeriod, focusItem: $focusItem, text: sleepDebtString) + Picker(sleepDebtString, selection: $settings.sleepDebtPeriod) { + ForEach(Days.allCases, id: \.self) { day in + Text(String(describing: day.rawValue)) + } + } + .pickerStyle(.menu) SettingsNumberFieldView(value: $settings.repaymentPeriod, focusItem: $focusItem, text: repaymentString) SettingsNumberFieldView(value: $settings.desiredHoursOfSleep, focusItem: $focusItem, text: desiredHoursOfSleepString) } } - .navigationTitle("Settings") + .navigationTitle("Settings") } .onTapGesture{ focusItem = false diff --git a/SleepDebt/SleepDebtApp.swift b/SleepDebt/SleepDebtApp.swift index d564e46..2f69c3a 100644 --- a/SleepDebt/SleepDebtApp.swift +++ b/SleepDebt/SleepDebtApp.swift @@ -21,7 +21,7 @@ struct SleepDebtApp: App { } class SleepDebtSettings: ObservableObject { - @Published var sleepDebtPeriod = 30 + @Published var sleepDebtPeriod = Days.thirty @Published var repaymentPeriod = 7 @Published var desiredHoursOfSleep = 8 }