InfoManager.swift 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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) {
  12. tableData[type.rawValue].value = value
  13. objectWillChange.send()
  14. }
  15. func updateInfoData(type: InfoType, value: HKQuantity) {
  16. let formattedValue = Localizer.formatQuantity(value)
  17. updateInfoData(type: type, value: formattedValue)
  18. }
  19. func updateInfoData(type: InfoType, firstValue: HKQuantity, secondValue: HKQuantity, separator: InfoDataSeparator) {
  20. let formattedFirstValue = Localizer.formatQuantity(firstValue)
  21. let formattedSecondValue = Localizer.formatQuantity(secondValue)
  22. if formattedFirstValue != formattedSecondValue {
  23. let combinedValue = "\(formattedFirstValue) \(separator.rawValue) \(formattedSecondValue)"
  24. updateInfoData(type: type, value: combinedValue)
  25. } else {
  26. updateInfoData(type: type, value: formattedFirstValue)
  27. }
  28. }
  29. func updateInfoData(type: InfoType, value: Double, maxFractionDigits: Int = 1, minFractionDigits: Int = 0) {
  30. let formattedValue = Localizer.formatToLocalizedString(value, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
  31. updateInfoData(type: type, value: formattedValue)
  32. }
  33. func updateInfoData(type: InfoType, value: Double, enactedValue: Double, separator: InfoDataSeparator, maxFractionDigits: Int = 1, minFractionDigits: Int = 0) {
  34. let formattedValue = Localizer.formatToLocalizedString(value, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
  35. let formattedEnactedValue = Localizer.formatToLocalizedString(enactedValue, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
  36. let separatorString = separator.rawValue
  37. let combinedValue = "\(formattedValue) \(separatorString) \(formattedEnactedValue)"
  38. updateInfoData(type: type, value: combinedValue)
  39. }
  40. func updateInfoData(type: InfoType, value: Metric) {
  41. let formattedValue = value.formattedValue()
  42. updateInfoData(type: type, value: formattedValue)
  43. }
  44. func clearInfoData(type: InfoType) {
  45. tableData[type.rawValue].value = ""
  46. objectWillChange.send()
  47. }
  48. func clearInfoData(types: [InfoType]) {
  49. for type in types {
  50. tableData[type.rawValue].value = ""
  51. }
  52. objectWillChange.send()
  53. }
  54. var visibleRows: [InfoData] {
  55. Storage.shared.infoSort.value
  56. .filter { $0 < Storage.shared.infoVisible.value.count && Storage.shared.infoVisible.value[$0] }
  57. .compactMap { index in
  58. guard index < tableData.count else { return nil }
  59. return tableData[index]
  60. }
  61. }
  62. }