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 HealthKit
enum Days: Int, CaseIterable {
case seven = 7
case thirty = 30
case threehundredsixtyfive = 365
}
class HealthKitManager: ObservableObject {
let healthStore = HKHealthStore()
var sleepForLastXDays: Dictionary<Int, Int> = [:]
@Published var sleepForLastXDays: Dictionary<Days, Int> = [:]
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,8 +80,10 @@ class HealthKitManager: ObservableObject {
let seconds = Int(endDate.timeIntervalSince(startDate))
totalSleep += seconds
}
DispatchQueue.main.async {
self.sleepForLastXDays[days] = totalSleep
}
}
healthStore.execute(query)
}
}

View File

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

View File

@@ -18,7 +18,12 @@ 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)
}

View File

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