RemoteViewController.swift 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //
  2. // RemoteViewController.swift
  3. // LoopFollow
  4. //
  5. // Created by Jonas Björkert on 2024-07-19.
  6. // Copyright © 2024 Jon Fawcett. All rights reserved.
  7. //
  8. import Foundation
  9. import UIKit
  10. import SwiftUI
  11. import HealthKit
  12. class RemoteViewController: UIViewController {
  13. private var statusMessage: ObservableValue<String> {
  14. return Observable.shared.statusMessage
  15. }
  16. override func viewDidLoad() {
  17. super.viewDidLoad()
  18. let remoteView = RemoteView(
  19. onRefreshStatus: refreshStatus,
  20. onCancelExistingTarget: cancelExistingTarget,
  21. sendTempTarget: sendTempTarget
  22. )
  23. let hostingController = UIHostingController(rootView: remoteView)
  24. addChild(hostingController)
  25. view.addSubview(hostingController.view)
  26. hostingController.view.translatesAutoresizingMaskIntoConstraints = false
  27. NSLayoutConstraint.activate([
  28. hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
  29. hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
  30. hostingController.view.topAnchor.constraint(equalTo: view.topAnchor),
  31. hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
  32. ])
  33. hostingController.didMove(toParent: self)
  34. initialSetup()
  35. }
  36. private func initialSetup() {
  37. // Perform initial setup checks here
  38. // For example, load the Nightscout URL and token from user defaults or another source
  39. }
  40. private func refreshStatus() {
  41. // Refresh the status to check current temp targets and other relevant info
  42. }
  43. private func cancelExistingTarget(completion: @escaping (Bool) -> Void) {
  44. let tempTargetBody: [String: Any] = [
  45. "enteredBy": "LoopFollow",
  46. "eventType": "Temporary Target",
  47. "reason": "Manual",
  48. "duration": 0,
  49. "created_at": ISO8601DateFormatter().string(from: Date())
  50. ]
  51. NightscoutUtils.executePostRequest(eventType: .treatments, body: tempTargetBody) { (result: Result<[TreatmentCancelResponse], Error>) in
  52. switch result {
  53. case .success(let response):
  54. print("Success: \(response)")
  55. DispatchQueue.main.async {
  56. self.statusMessage.set("Temp target successfully cancelled.")
  57. completion(true)
  58. }
  59. case .failure(let error):
  60. print("Error: \(error)")
  61. DispatchQueue.main.async {
  62. self.statusMessage.set("Failed to cancel temp target: \(error.localizedDescription)")
  63. completion(false)
  64. }
  65. }
  66. }
  67. }
  68. private func sendTempTarget(newTarget: HKQuantity, duration: HKQuantity, completion: @escaping (Bool) -> Void) {
  69. let tempTargetBody: [String: Any] = [
  70. "enteredBy": "LoopFollow",
  71. "eventType": "Temporary Target",
  72. "reason": "Manual",
  73. "targetTop": newTarget.doubleValue(for: .milligramsPerDeciliter),
  74. "targetBottom": newTarget.doubleValue(for: .milligramsPerDeciliter),
  75. "duration": Int(duration.doubleValue(for: .minute())),
  76. "created_at": ISO8601DateFormatter().string(from: Date())
  77. ]
  78. NightscoutUtils.executePostRequest(eventType: .treatments, body: tempTargetBody) { (result: Result<[TreatmentResponse], Error>) in
  79. switch result {
  80. case .success(let response):
  81. print("Success: \(response)")
  82. DispatchQueue.main.async {
  83. self.statusMessage.set("Temp target sent successfully.")
  84. completion(true)
  85. }
  86. case .failure(let error):
  87. print("Error: \(error)")
  88. DispatchQueue.main.async {
  89. self.statusMessage.set("Failed to send temp target: \(error.localizedDescription)")
  90. completion(false)
  91. }
  92. }
  93. }
  94. }
  95. }