Skip to content

Commit bbfcfcd

Browse files
authored
LOOP-1800: fix carbs being recorded before authentication is complete (#218)
1 parent 0255be1 commit bbfcfcd

File tree

1 file changed

+29
-25
lines changed

1 file changed

+29
-25
lines changed

Loop/View Models/BolusEntryViewModel.swift

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import os.log
1414
import LoopKit
1515
import LoopKitUI
1616
import LoopUI
17+
import SwiftUI
1718

1819

1920
final class BolusEntryViewModel: ObservableObject {
@@ -33,6 +34,8 @@ final class BolusEntryViewModel: ObservableObject {
3334
case staleGlucoseData
3435
}
3536

37+
@Environment(\.authenticate) var authenticate
38+
3639
// MARK: - State
3740

3841
@Published var glucoseValues: [GlucoseValue] = [] // stored glucose values + manual glucose entry
@@ -198,7 +201,28 @@ final class BolusEntryViewModel: ObservableObject {
198201
presentAlert(.manualGlucoseEntryOutOfAcceptableRange)
199202
return
200203
}
204+
}
201205

206+
// Authenticate the bolus before saving anything
207+
if enteredBolus.doubleValue(for: .internationalUnit()) > 0 {
208+
let message = String(format: NSLocalizedString("Authenticate to Bolus %@ Units", comment: "The message displayed during a device authentication prompt for bolus specification"), enteredBolusAmountString)
209+
authenticate(message) {
210+
switch $0 {
211+
case .success:
212+
self.continueSaving(onSuccess: completion)
213+
case .failure:
214+
break
215+
}
216+
}
217+
} else if potentialCarbEntry != nil { // Allow user to save carbs without bolusing
218+
self.continueSaving(onSuccess: completion)
219+
} else {
220+
completion()
221+
}
222+
}
223+
224+
private func continueSaving(onSuccess completion: @escaping () -> Void) {
225+
if let manualGlucoseSample = manualGlucoseSample {
202226
isInitiatingSaveOrBolus = true
203227
dataManager.loopManager.addGlucose([manualGlucoseSample]) { result in
204228
DispatchQueue.main.async {
@@ -219,7 +243,7 @@ final class BolusEntryViewModel: ObservableObject {
219243

220244
private func saveCarbsAndDeliverBolus(onSuccess completion: @escaping () -> Void) {
221245
guard let carbEntry = potentialCarbEntry else {
222-
authenticateAndDeliverBolus(onSuccess: completion)
246+
deliverBolus(onSuccess: completion)
223247
return
224248
}
225249

@@ -237,7 +261,7 @@ final class BolusEntryViewModel: ObservableObject {
237261
DispatchQueue.main.async {
238262
switch result {
239263
case .success:
240-
self.authenticateAndDeliverBolus(onSuccess: completion)
264+
self.deliverBolus(onSuccess: completion)
241265
case .failure(let error):
242266
self.isInitiatingSaveOrBolus = false
243267
self.presentAlert(.carbEntryPersistenceFailure)
@@ -247,36 +271,16 @@ final class BolusEntryViewModel: ObservableObject {
247271
}
248272
}
249273

250-
private func authenticateAndDeliverBolus(onSuccess completion: @escaping () -> Void) {
274+
private func deliverBolus(onSuccess completion: @escaping () -> Void) {
251275
let bolusVolume = enteredBolus.doubleValue(for: .internationalUnit())
252276
guard bolusVolume > 0 else {
253277
completion()
254278
return
255279
}
256280

257281
isInitiatingSaveOrBolus = true
258-
259-
let context = LAContext()
260-
guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: nil) else {
261-
dataManager.enactBolus(units: bolusVolume)
262-
completion()
263-
return
264-
}
265-
266-
context.evaluatePolicy(
267-
.deviceOwnerAuthentication,
268-
localizedReason: String(format: NSLocalizedString("Authenticate to Bolus %@ Units", comment: "The message displayed during a device authentication prompt for bolus specification"), enteredBolusAmountString),
269-
reply: { success, error in
270-
DispatchQueue.main.async {
271-
if success {
272-
self.dataManager.enactBolus(units: bolusVolume)
273-
completion()
274-
} else {
275-
self.isInitiatingSaveOrBolus = false
276-
}
277-
}
278-
}
279-
)
282+
dataManager.enactBolus(units: bolusVolume)
283+
completion()
280284
}
281285

282286
private func presentAlert(_ alert: Alert) {

0 commit comments

Comments
 (0)