@@ -103,7 +103,13 @@ final class BolusEntryViewModel: ObservableObject {
103
103
private var manualGlucoseSample : NewGlucoseSample ? // derived from `enteredManualGlucose`, but stored to ensure timestamp consistency
104
104
105
105
@Published var recommendedBolus : HKQuantity ?
106
+ var recommendedBolusAmount : Double ? {
107
+ recommendedBolus? . doubleValue ( for: . internationalUnit( ) )
108
+ }
106
109
@Published var enteredBolus = HKQuantity ( unit: . internationalUnit( ) , doubleValue: 0 )
110
+ var enteredBolusAmount : Double {
111
+ enteredBolus. doubleValue ( for: . internationalUnit( ) )
112
+ }
107
113
private var userChangedBolusAmount = false
108
114
@Published var isInitiatingSaveOrBolus = false
109
115
@@ -307,11 +313,11 @@ final class BolusEntryViewModel: ObservableObject {
307
313
// MARK: - View API
308
314
309
315
var isBolusRecommended : Bool {
310
- guard let recommendedBolus = recommendedBolus else {
316
+ guard let recommendedBolusAmount = recommendedBolusAmount else {
311
317
return false
312
318
}
313
319
314
- return recommendedBolus . doubleValue ( for : . internationalUnit ( ) ) > 0
320
+ return recommendedBolusAmount > 0
315
321
}
316
322
317
323
func saveAndDeliver( onSuccess completion: @escaping ( ) -> Void ) {
@@ -325,15 +331,13 @@ final class BolusEntryViewModel: ObservableObject {
325
331
return
326
332
}
327
333
328
- let amountEntered = enteredBolus. doubleValue ( for: . internationalUnit( ) )
329
-
330
- let amountToDeliver = delegate. roundBolusVolume ( units: amountEntered)
331
- guard amountEntered == 0 || amountToDeliver > 0 else {
334
+ let amountToDeliver = delegate. roundBolusVolume ( units: enteredBolusAmount)
335
+ guard enteredBolusAmount == 0 || amountToDeliver > 0 else {
332
336
presentAlert ( . bolusTooSmall)
333
337
return
334
338
}
335
339
336
- let amountToDeliverString = bolusVolumeFormatter . numberFormatter . string ( from : amountToDeliver ) ?? String ( amountToDeliver)
340
+ let amountToDeliverString = formatBolusAmount ( amountToDeliver)
337
341
338
342
// Capture state as is during initial action, to prevent race conditions
339
343
// caused by later updates to member variables while async operations are
@@ -403,7 +407,7 @@ final class BolusEntryViewModel: ObservableObject {
403
407
}
404
408
405
409
private func saveCarbsAndDeliverBolus( amountToDeliver: Double , potentialCarbEntry: NewCarbEntry ? , onSuccess completion: @escaping ( ) -> Void ) {
406
- let activationType = BolusActivationType . activationTypeFor ( recommendedAmount: recommendedBolus ? . doubleValue ( for : . internationalUnit ( ) ) , bolusAmount: amountToDeliver)
410
+ let activationType = BolusActivationType . activationTypeFor ( recommendedAmount: recommendedBolusAmount , bolusAmount: amountToDeliver)
407
411
408
412
guard let carbEntry = potentialCarbEntry else {
409
413
dosingDecision. carbEntry = nil
@@ -465,7 +469,12 @@ final class BolusEntryViewModel: ObservableObject {
465
469
activeAlert = alert
466
470
}
467
471
468
- private lazy var bolusVolumeFormatter = QuantityFormatter ( for: . internationalUnit( ) )
472
+ private lazy var bolusAmountFormatter : NumberFormatter = {
473
+ let formatter = QuantityFormatter ( )
474
+ formatter. setPreferredNumberFormatter ( for: . internationalUnit( ) )
475
+ formatter. numberFormatter. roundingMode = . down
476
+ return formatter. numberFormatter
477
+ } ( )
469
478
470
479
private lazy var absorptionTimeFormatter : DateComponentsFormatter = {
471
480
let formatter = DateComponentsFormatter ( )
@@ -477,15 +486,15 @@ final class BolusEntryViewModel: ObservableObject {
477
486
} ( )
478
487
479
488
var enteredBolusAmountString : String {
480
- let bolusVolume = enteredBolus . doubleValue ( for : . internationalUnit ( ) )
481
- return bolusVolumeFormatter . numberFormatter . string ( from : bolusVolume ) ?? String ( bolusVolume )
489
+ let bolusAmount = enteredBolusAmount
490
+ return formatBolusAmount ( bolusAmount )
482
491
}
483
492
484
493
var maximumBolusAmountString : String ? {
485
- guard let maxBolusVolume = maximumBolus? . doubleValue ( for: . internationalUnit( ) ) else {
494
+ guard let maxBolusAmount = maximumBolus? . doubleValue ( for: . internationalUnit( ) ) else {
486
495
return nil
487
496
}
488
- return bolusVolumeFormatter . numberFormatter . string ( from : maxBolusVolume ) ?? String ( maxBolusVolume )
497
+ return formatBolusAmount ( maxBolusAmount )
489
498
}
490
499
491
500
var carbEntryAmountAndEmojiString : String ? {
@@ -698,9 +707,11 @@ final class BolusEntryViewModel: ObservableObject {
698
707
let notice : Notice ?
699
708
do {
700
709
recommendation = try computeBolusRecommendation ( from: state)
710
+
701
711
if let recommendation = recommendation {
702
712
recommendedBolus = HKQuantity ( unit: . internationalUnit( ) , doubleValue: delegate. roundBolusVolume ( units: recommendation. amount) )
703
-
713
+ //recommendedBolus = HKQuantity(unit: .internationalUnit(), doubleValue: recommendation.amount)
714
+
704
715
switch recommendation. notice {
705
716
case . glucoseBelowSuspendThreshold:
706
717
if let suspendThreshold = delegate. settings. suspendThreshold {
@@ -822,6 +833,25 @@ final class BolusEntryViewModel: ObservableObject {
822
833
823
834
chartDateInterval = DateInterval ( start: chartStartDate, duration: . hours( totalHours) )
824
835
}
836
+
837
+ func formatBolusAmount( _ bolusAmount: Double ) -> String {
838
+ bolusAmountFormatter. string ( from: bolusAmount) ?? String ( bolusAmount)
839
+ }
840
+
841
+ var recommendedBolusString : String {
842
+ guard let amount = recommendedBolusAmount else {
843
+ return " – "
844
+ }
845
+ return formatBolusAmount ( amount)
846
+ }
847
+
848
+ func updateEnteredBolus( _ enteredBolusString: String ) {
849
+ updateEnteredBolus ( bolusAmountFormatter. number ( from: enteredBolusString) ? . doubleValue)
850
+ }
851
+
852
+ func updateEnteredBolus( _ enteredBolusAmount: Double ? ) {
853
+ enteredBolus = HKQuantity ( unit: . internationalUnit( ) , doubleValue: enteredBolusAmount ?? 0 )
854
+ }
825
855
}
826
856
827
857
extension BolusEntryViewModel . Alert : Identifiable {
0 commit comments