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