OverrideProfilesStateModel.swift 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import CoreData
  2. import SwiftUI
  3. extension OverrideProfilesConfig {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Published var percentage: Double = 100
  6. @Published var isEnabled = false
  7. @Published var _indefinite = true
  8. @Published var duration: Decimal = 0
  9. let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
  10. func saveSettings() {
  11. coredataContext.perform {
  12. let saveOverride = Override(context: self.coredataContext)
  13. saveOverride.duration = self.duration as NSDecimalNumber
  14. saveOverride.indefinite = self._indefinite
  15. saveOverride.percentage = self.percentage
  16. saveOverride.enabled = self.isEnabled
  17. saveOverride.date = Date()
  18. try? self.coredataContext.save()
  19. }
  20. }
  21. func savedSettings() {
  22. coredataContext.performAndWait {
  23. var overrideArray = [Override]()
  24. let requestEnabled = Override.fetchRequest() as NSFetchRequest<Override>
  25. let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
  26. requestEnabled.sortDescriptors = [sortIsEnabled]
  27. requestEnabled.fetchLimit = 1
  28. try? overrideArray = coredataContext.fetch(requestEnabled)
  29. isEnabled = overrideArray.first?.enabled ?? false
  30. percentage = overrideArray.first?.percentage ?? 100
  31. _indefinite = overrideArray.first?.indefinite ?? true
  32. duration = (overrideArray.first?.duration ?? 0) as Decimal
  33. var newDuration = Double(duration)
  34. if isEnabled {
  35. let duration = overrideArray.first?.duration ?? 0
  36. let addedMinutes = Int(duration as Decimal)
  37. let date = overrideArray.first?.date ?? Date()
  38. if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(), !_indefinite {
  39. isEnabled = false
  40. }
  41. newDuration = Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes
  42. }
  43. if newDuration < 0 { newDuration = 0 } else { duration = Decimal(newDuration) }
  44. if !isEnabled {
  45. _indefinite = true
  46. percentage = 100
  47. duration = 0
  48. }
  49. }
  50. }
  51. }
  52. }