LoopOverrideViewModel.swift 3.1 KB

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