Changed sleep debt period to an enum

This commit is contained in:
2024-01-06 19:29:19 +01:00
parent 26ef9ead48
commit 7d2eefb896
4 changed files with 45 additions and 14 deletions

View File

@@ -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)
} }

View File

@@ -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()
})
} }
} }

View File

@@ -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

View File

@@ -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
} }