Changed sleep debt period to an enum
This commit is contained in:
		| @@ -8,11 +8,17 @@ | |||||||
| import Foundation | import Foundation | ||||||
| import HealthKit | import HealthKit | ||||||
|  |  | ||||||
|  | enum Days: Int, CaseIterable { | ||||||
|  |     case seven = 7 | ||||||
|  |     case thirty = 30 | ||||||
|  |     case threehundredsixtyfive = 365 | ||||||
|  | } | ||||||
|  |  | ||||||
| class HealthKitManager: ObservableObject { | class HealthKitManager: ObservableObject { | ||||||
|      |      | ||||||
|     let healthStore = HKHealthStore() |     let healthStore = HKHealthStore() | ||||||
|      |      | ||||||
|     var sleepForLastXDays: Dictionary<Int, Int> = [:] |     @Published var sleepForLastXDays: Dictionary<Days, Int> = [:] | ||||||
|      |      | ||||||
|     init() { |     init() { | ||||||
|         let sleep = HKCategoryType(.sleepAnalysis) |         let sleep = HKCategoryType(.sleepAnalysis) | ||||||
| @@ -26,25 +32,36 @@ class HealthKitManager: ObservableObject { | |||||||
|                 print(error) |                 print(error) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         self.getSleepForLastXDays(days: 7) |         self.updateSleep() | ||||||
|         self.getSleepForLastXDays(days: 30) |     } | ||||||
|  |      | ||||||
|  |     func updateSleep() { | ||||||
|  |         self.getSleepForLastXDays(days: .seven) | ||||||
|  |         self.getSleepForLastXDays(days: .thirty) | ||||||
|  |         self.getSleepForLastXDays(days: .threehundredsixtyfive) | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     func getSleepForLast7Days() -> Int { |     func getSleepForLast7Days() -> Int { | ||||||
|         self.getSleepForLastXDays(days: 7) |         self.getSleepForLastXDays(days: .seven) | ||||||
|         return self.sleepForLastXDays[7] ?? 0 |         return self.sleepForLastXDays[Days.seven] ?? 0 | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     func getSleepForLast30Days() -> Int{ |     func getSleepForLast30Days() -> Int{ | ||||||
|         self.getSleepForLastXDays(days: 30) |         self.getSleepForLastXDays(days: .thirty) | ||||||
|         return self.sleepForLastXDays[30] ?? 0 |         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 |         var totalSleep = 0 | ||||||
|         let sleep = HKCategoryType(.sleepAnalysis) |         let sleep = HKCategoryType(.sleepAnalysis) | ||||||
|         let sleepPredicate = HKCategoryValueSleepAnalysis.predicateForSamples(equalTo: HKCategoryValueSleepAnalysis.allAsleepValues) |         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 datePredicate = HKQuery.predicateForSamples(withStart: lastXDays, end: .now) | ||||||
|         let predicates = NSCompoundPredicate(andPredicateWithSubpredicates: [sleepPredicate, datePredicate]) |         let predicates = NSCompoundPredicate(andPredicateWithSubpredicates: [sleepPredicate, datePredicate]) | ||||||
| @@ -63,7 +80,9 @@ class HealthKitManager: ObservableObject { | |||||||
|                 let seconds = Int(endDate.timeIntervalSince(startDate)) |                 let seconds = Int(endDate.timeIntervalSince(startDate)) | ||||||
|                 totalSleep += seconds |                 totalSleep += seconds | ||||||
|             } |             } | ||||||
|             self.sleepForLastXDays[days] = totalSleep |             DispatchQueue.main.async { | ||||||
|  |                 self.sleepForLastXDays[days] = totalSleep | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         healthStore.execute(query) |         healthStore.execute(query) | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -9,15 +9,22 @@ import SwiftUI | |||||||
|  |  | ||||||
| struct HomeView: View { | struct HomeView: View { | ||||||
|     @EnvironmentObject var manager: HealthKitManager |     @EnvironmentObject var manager: HealthKitManager | ||||||
|  |     @EnvironmentObject var settings: SleepDebtSettings | ||||||
|     var desiredAmountOfSleep = 8 |     var desiredAmountOfSleep = 8 | ||||||
|     var body: some View { |     var body: some View { | ||||||
|         VStack { |         VStack { | ||||||
|             Image(systemName: "globe") |             Image(systemName: "globe") | ||||||
|                 .imageScale(.large) |                 .imageScale(.large) | ||||||
|                 .foregroundStyle(.tint) |                 .foregroundStyle(.tint) | ||||||
|             Text(String(manager.getSleepForLast7Days())) |             Text(String(manager.sleepForLastXDays[settings.sleepDebtPeriod] ?? 0)) | ||||||
|         } |         } | ||||||
|         .padding() |         .padding() | ||||||
|  |         .onAppear { | ||||||
|  |             manager.updateSleep() | ||||||
|  |         } | ||||||
|  |         .onReceive(settings.$sleepDebtPeriod, perform: { _ in | ||||||
|  |             manager.updateSleep() | ||||||
|  |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,13 +18,18 @@ struct SettingsView: View { | |||||||
|         NavigationStack { |         NavigationStack { | ||||||
|             List { |             List { | ||||||
|                 Section { |                 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.repaymentPeriod, focusItem: $focusItem, text: repaymentString) | ||||||
|                     SettingsNumberFieldView(value: $settings.desiredHoursOfSleep, focusItem: $focusItem, text: desiredHoursOfSleepString) |                     SettingsNumberFieldView(value: $settings.desiredHoursOfSleep, focusItem: $focusItem, text: desiredHoursOfSleepString) | ||||||
|                 } |                 } | ||||||
|                  |                  | ||||||
|             } |             } | ||||||
|         .navigationTitle("Settings") |             .navigationTitle("Settings") | ||||||
|         } |         } | ||||||
|         .onTapGesture{ |         .onTapGesture{ | ||||||
|             focusItem = false |             focusItem = false | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ struct SleepDebtApp: App { | |||||||
| } | } | ||||||
|  |  | ||||||
| class SleepDebtSettings: ObservableObject { | class SleepDebtSettings: ObservableObject { | ||||||
|     @Published var sleepDebtPeriod = 30 |     @Published var sleepDebtPeriod = Days.thirty | ||||||
|     @Published var repaymentPeriod = 7 |     @Published var repaymentPeriod = 7 | ||||||
|     @Published var desiredHoursOfSleep = 8 |     @Published var desiredHoursOfSleep = 8 | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user