Procházet zdrojové kódy

SnoozerViewController

Jonas Björkert před 1 rokem
rodič
revize
e171dc43f1

+ 12 - 2
LoopFollow.xcodeproj/project.pbxproj

@@ -414,6 +414,8 @@
 		DDB0AF512BB1A8BE00AFA48B /* BuildDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildDetails.swift; sourceTree = "<group>"; };
 		DDB0AF542BB1B24A00AFA48B /* BuildDetails.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = BuildDetails.plist; sourceTree = "<group>"; };
 		DDBE3ABC2CB5A961006B37DC /* OverrideView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverrideView.swift; sourceTree = "<group>"; };
+		DDC7E5122DBCE1B900EB1127 /* SnoozerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnoozerView.swift; sourceTree = "<group>"; };
+		DDC7E5132DBCE1B900EB1127 /* SnoozerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnoozerViewController.swift; sourceTree = "<group>"; };
 		DDCF979324C0D380002C9752 /* UIViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewExtension.swift; sourceTree = "<group>"; };
 		DDCF979524C1443C002C9752 /* GeneralSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsViewController.swift; sourceTree = "<group>"; };
 		DDCF979724C1489C002C9752 /* GraphSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphSettingsViewController.swift; sourceTree = "<group>"; };
@@ -613,7 +615,6 @@
 
 /* Begin PBXFileSystemSynchronizedRootGroup section */
 		DD4AFB4A2DB684A200BB593F /* AlarmEditing */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = AlarmEditing; sourceTree = "<group>"; };
-		DD4AFB6C2DBCDA6B00BB593F /* Snoozer */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = Snoozer; sourceTree = "<group>"; };
 /* End PBXFileSystemSynchronizedRootGroup section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -876,6 +877,15 @@
 			path = Scripts;
 			sourceTree = "<group>";
 		};
+		DDC7E5142DBCE1B900EB1127 /* Snoozer */ = {
+			isa = PBXGroup;
+			children = (
+				DDC7E5122DBCE1B900EB1127 /* SnoozerView.swift */,
+				DDC7E5132DBCE1B900EB1127 /* SnoozerViewController.swift */,
+			);
+			path = Snoozer;
+			sourceTree = "<group>";
+		};
 		DDCF9A7E2D85FCE6004DF4DD /* Alarm */ = {
 			isa = PBXGroup;
 			children = (
@@ -1134,7 +1144,7 @@
 		FC8DEEE32485D1680075863F /* LoopFollow */ = {
 			isa = PBXGroup;
 			children = (
-				DD4AFB6C2DBCDA6B00BB593F /* Snoozer */,
+				DDC7E5142DBCE1B900EB1127 /* Snoozer */,
 				DDCF9A7E2D85FCE6004DF4DD /* Alarm */,
 				DD1A97122D429495000DDC11 /* Settings */,
 				DD2C2E522D3C36A8006413A5 /* Dexcom */,

+ 38 - 56
LoopFollow/Snoozer/SnoozerView.swift

@@ -8,77 +8,59 @@
 
 
 import SwiftUI
-import Combine
 
 struct SnoozerView: View {
-    @ObservedObject var bg = Observable.shared.bgValue
-    @ObservedObject var trend = Observable.shared.trendArrow
-    @ObservedObject var delta = Observable.shared.delta
-    @ObservedObject var minutesAgo = Observable.shared.minutesAgo
-    @ObservedObject var alarmTitle = Observable.shared.alarmTitle
+    @ObservedObject var bgValue: ObservableValue<String>
+    @ObservedObject var deltaValue: ObservableValue<String>
+    @ObservedObject var direction: ObservableValue<String>
+    @ObservedObject var age: ObservableValue<String>
+    @ObservedObject var time: ObservableValue<String>
+    @ObservedObject var alarmText: ObservableValue<String?>
 
-    @State private var snoozeMinutes = 10
-    @State private var currentTime = Date()
-
-    private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
-
-    var bgColor: Color {
-        switch bg.value {
-        case ..<4.0:
-            return .red
-        case 4.0..<10:
-            return .yellow
-        default:
-            return .blue
-        }
-    }
+    @Binding var snoozeMinutes: Int
+    var onSnooze: () -> Void
 
     var body: some View {
-        VStack(spacing: 20) {
-            Text(String(format: "%.1f", bg.value).replacingOccurrences(of: ".", with: ","))
-                .font(.system(size: 100, weight: .bold))
-                .foregroundColor(bgColor)
+        VStack(spacing: 12) {
+            Text(bgValue.value)
+                .font(.system(size: 72, weight: .bold))
+                .foregroundColor(.yellow)
+
+            if let alarm = alarmText.value, !alarm.isEmpty {
+                Text(alarm)
+                    .font(.title2)
+                    .foregroundColor(.red)
+            }
 
-            Text(trend.value)
-                .font(.system(size: 40))
+            Text(direction.value)
+                .font(.title)
 
-            Text(String(format: "%+.1f", delta.value))
+            Text(deltaValue.value)
                 .font(.title2)
+                .foregroundColor(.white.opacity(0.8))
 
-            Text("\(minutesAgo.value) min ago")
+            Text(age.value + " ago")
                 .font(.subheadline)
+                .foregroundColor(.white.opacity(0.6))
 
-            Text(currentTimeFormatted)
-                .font(.largeTitle)
-                .onReceive(timer) { _ in currentTime = Date() }
+            Text(time.value)
+                .font(.title3)
 
-            if let alarm = alarmTitle.value {
-                Text(alarm)
-                    .font(.title2)
-                    .foregroundColor(.red)
-                    .padding(.top)
-
-                Stepper("Snooze for \(snoozeMinutes) min", value: $snoozeMinutes, in: 5...60, step: 5)
-                    .padding(.horizontal)
+            HStack {
+                Text("Snooze for \(snoozeMinutes) min")
+                Stepper("", value: $snoozeMinutes, in: 1...60)
+                    .labelsHidden()
+            }
+            .padding(.top)
 
-                Button("Snooze") {
-                    // Call snooze logic
-                    print("Snoozing \(alarm) for \(snoozeMinutes) minutes")
-                }
+            Button("Snooze", action: onSnooze)
                 .padding()
-                .background(Color.gray.opacity(0.3))
-                .cornerRadius(10)
-            }
+                .background(Color.blue)
+                .foregroundColor(.white)
+                .cornerRadius(8)
         }
         .padding()
         .background(Color.black)
-        .foregroundColor(.white)
-        .ignoresSafeArea()
-    }
-
-    private var currentTimeFormatted: String {
-        let formatter = DateFormatter()
-        formatter.dateFormat = "HH:mm"
-        return formatter.string(from: currentTime)
+        .edgesIgnoringSafeArea(.all)
     }
-}
+}

+ 67 - 0
LoopFollow/Snoozer/SnoozerViewController.swift

@@ -0,0 +1,67 @@
+//
+//  SnoozerViewController.swift
+//  LoopFollow
+//
+//  Created by Jonas Björkert on 2025-04-26.
+//  Copyright © 2025 Jon Fawcett. All rights reserved.
+//
+
+
+import UIKit
+import SwiftUI
+import Combine
+
+class SnoozerViewController: UIViewController {
+    private var hostingController: UIHostingController<SnoozerView>?
+
+    private var bgValue = ObservableValue<String>(default: "8,9")
+    private var deltaValue = ObservableValue<String>(default: "-0,7")
+    private var direction = ObservableValue<String>(default: "→")
+    private var age = ObservableValue<String>(default: "4 min")
+    private var time = ObservableValue<String>(default: "10:28")
+    private var alarmText = ObservableValue<String?>(default: "High Alert")
+    @State private var snoozeMinutes = 15
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        view.backgroundColor = .black
+
+        let snoozerView = SnoozerView(
+            bgValue: bgValue,
+            deltaValue: deltaValue,
+            direction: direction,
+            age: age,
+            time: time,
+            alarmText: alarmText,
+            snoozeMinutes: Binding(get: { self.snoozeMinutes }, set: { self.snoozeMinutes = $0 }),
+            onSnooze: {
+                // Trigger snooze logic here (e.g., update UserDefaultsRepository, stop alarm, etc.)
+                print("Snoozed for \(self.snoozeMinutes) minutes")
+            }
+        )
+
+        let hosting = UIHostingController(rootView: snoozerView)
+        self.hostingController = hosting
+        addChild(hosting)
+        view.addSubview(hosting.view)
+        hosting.view.translatesAutoresizingMaskIntoConstraints = false
+
+        NSLayoutConstraint.activate([
+            hosting.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
+            hosting.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
+            hosting.view.topAnchor.constraint(equalTo: view.topAnchor),
+            hosting.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
+        ])
+
+        hosting.didMove(toParent: self)
+    }
+
+    // ✅ Only this screen supports landscape
+    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
+        return [.portrait, .landscapeLeft, .landscapeRight]
+    }
+
+    override var shouldAutorotate: Bool {
+        return true
+    }
+}