InfoManager.swift 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // LoopFollow
  2. // InfoManager.swift
  3. import Combine
  4. import Foundation
  5. import HealthKit
  6. class InfoManager: ObservableObject {
  7. @Published var tableData: [InfoData]
  8. init() {
  9. tableData = InfoType.allCases.map { InfoData(id: $0.rawValue, name: $0.name) }
  10. }
  11. func updateInfoData(type: InfoType, value: String, numericValue: Double? = nil) {
  12. tableData[type.rawValue].value = value
  13. tableData[type.rawValue].numericValue = numericValue
  14. objectWillChange.send()
  15. }
  16. func updateInfoData(type: InfoType, value: HKQuantity) {
  17. let formattedValue = Localizer.formatQuantity(value)
  18. let numericValue = value.doubleValue(for: Localizer.getPreferredUnit())
  19. updateInfoData(type: type, value: formattedValue, numericValue: numericValue)
  20. }
  21. func updateInfoData(type: InfoType, firstValue: HKQuantity, secondValue: HKQuantity, separator: InfoDataSeparator) {
  22. let formattedFirstValue = Localizer.formatQuantity(firstValue)
  23. let formattedSecondValue = Localizer.formatQuantity(secondValue)
  24. if formattedFirstValue != formattedSecondValue {
  25. let combinedValue = "\(formattedFirstValue) \(separator.rawValue) \(formattedSecondValue)"
  26. updateInfoData(type: type, value: combinedValue)
  27. } else {
  28. updateInfoData(type: type, value: formattedFirstValue)
  29. }
  30. }
  31. func updateInfoData(type: InfoType, value: Double, maxFractionDigits: Int = 1, minFractionDigits: Int = 0) {
  32. let formattedValue = Localizer.formatToLocalizedString(value, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
  33. updateInfoData(type: type, value: formattedValue, numericValue: value)
  34. }
  35. func updateInfoData(type: InfoType, value: Double, enactedValue: Double, separator: InfoDataSeparator, maxFractionDigits: Int = 1, minFractionDigits: Int = 0) {
  36. let formattedValue = Localizer.formatToLocalizedString(value, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
  37. let formattedEnactedValue = Localizer.formatToLocalizedString(enactedValue, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
  38. let separatorString = separator.rawValue
  39. let combinedValue = "\(formattedValue) \(separatorString) \(formattedEnactedValue)"
  40. updateInfoData(type: type, value: combinedValue)
  41. }
  42. func updateInfoData(type: InfoType, value: Metric) {
  43. let formattedValue = value.formattedValue()
  44. updateInfoData(type: type, value: formattedValue, numericValue: value.value)
  45. }
  46. func clearInfoData(type: InfoType) {
  47. tableData[type.rawValue].value = ""
  48. tableData[type.rawValue].numericValue = nil
  49. objectWillChange.send()
  50. }
  51. func clearInfoData(types: [InfoType]) {
  52. for type in types {
  53. tableData[type.rawValue].value = ""
  54. tableData[type.rawValue].numericValue = nil
  55. }
  56. objectWillChange.send()
  57. }
  58. var visibleRows: [InfoData] {
  59. Storage.shared.infoDisplayItems.value
  60. .filter { $0.isVisible }
  61. .compactMap { item in
  62. let index = item.type.rawValue
  63. guard index < tableData.count else { return nil }
  64. return tableData[index]
  65. }
  66. }
  67. }