LoopOverrideViewModel.swift 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. //
  2. // LoopOverrideViewModel.swift
  3. // LoopFollow
  4. //
  5. // Created by Jonas Björkert on 2025-01-15.
  6. // Copyright © 2025 Jon Fawcett. All rights reserved.
  7. //
  8. import Foundation
  9. final class LoopOverrideViewModel: ObservableObject, Sendable {
  10. func sendActivateOverrideRequest(
  11. override: ProfileManager.LoopOverride,
  12. completion: @escaping (Bool, String?) -> Void
  13. ) {
  14. Task {
  15. let body: [String: Any] = [
  16. "eventType": "Temporary Override",
  17. "enteredBy": Storage.shared.user.value,
  18. "reason": override.name,
  19. "reasonDisplay": "\(override.symbol) \(override.name)"
  20. ]
  21. do {
  22. let response: String = try await NightscoutUtils.executePostRequest(eventType: .temporaryOverride, body: body)
  23. DispatchQueue.main.async {
  24. if response == "OK" {
  25. Observable.shared.override.value = nil
  26. NotificationCenter.default.post(name: NSNotification.Name("refresh"), object: nil)
  27. completion(true, response)
  28. } else {
  29. let errorTitle = NightscoutUtils.extractErrorReason(from: response)
  30. let formattedError = self.formatErrorMessage(errorTitle)
  31. completion(false, formattedError)
  32. }
  33. }
  34. } catch {
  35. DispatchQueue.main.async {
  36. completion(false, nil)
  37. }
  38. }
  39. }
  40. }
  41. func sendCancelOverrideRequest(completion: @escaping (Bool, String?) -> Void) {
  42. Task {
  43. let body: [String: Any] = [
  44. "eventType": "Temporary Override Cancel"
  45. ]
  46. do {
  47. let response: String = try await NightscoutUtils.executePostRequest(eventType: .temporaryOverrideCancel, body: body)
  48. DispatchQueue.main.async {
  49. if response == "OK" {
  50. Observable.shared.override.value = nil
  51. NotificationCenter.default.post(name: NSNotification.Name("refresh"), object: nil)
  52. completion(true, response)
  53. } else {
  54. let errorTitle = NightscoutUtils.extractErrorReason(from: response)
  55. let formattedError = self.formatErrorMessage(errorTitle)
  56. completion(false, formattedError)
  57. }
  58. }
  59. } catch {
  60. DispatchQueue.main.async {
  61. completion(false, nil)
  62. }
  63. }
  64. }
  65. }
  66. func formatErrorMessage(_ errorTitle: String) -> String {
  67. switch errorTitle {
  68. case "Unauthorized":
  69. return "Unauthorized, verify that your token is correct and has admin auth"
  70. case "APNs delivery failed: BadDeviceToken":
  71. return "APNs delivery failed: BadDeviceToken, verify that the LOOP_PUSH_SERVER_ENVIRONMENT parameter in your Nightscout setup matches the build method used for Loop"
  72. default:
  73. return errorTitle
  74. }
  75. }
  76. }