Explorar o código

Add live preview images

polscm32 aka Marvout hai 1 ano
pai
achega
7c6a4a9866

+ 15 - 16
FreeAPS/Sources/Modules/ContactTrick/ContactTrickStateModel.swift

@@ -3,37 +3,36 @@ import CoreData
 import SwiftUI
 
 extension ContactTrick {
-    @Observable final class StateModel: BaseStateModel<Provider> {
+    @Observable final class StateModel: BaseStateModel<Provider>, ContactTrickManagerDelegate {
         @ObservationIgnored @Injected() var contactTrickStorage: ContactTrickStorage!
         @ObservationIgnored @Injected() var contactTrickManager: ContactTrickManager!
+
         var contactTrickEntries = [ContactTrickEntry]()
         var units: GlucoseUnits = .mmolL
         // Help Sheet
         var isHelpSheetPresented: Bool = false
         var helpSheetDetent = PresentationDetent.large
 
-        var previewState: ContactTrickState {
-            ContactTrickState(
-                glucose: self.units == .mmolL ? "6,8" : "127",
-                trend: "↗︎",
-                delta: units == .mmolL ? "+0,3" : "+7",
-                lastLoopDate: .now,
-                iob: 6.1,
-                iobText: "6,1",
-                cob: 27.0,
-                cobText: "27",
-                eventualBG: units == .mmolL ? "8,9" : "163",
-                maxIOB: 12.0,
-                maxCOB: 120.0
-            )
-        }
+        // Current state for live preview
+        var state = ContactTrickState()
 
         /// Subscribes to updates and initializes data fetching.
         override func subscribe() {
             units = settingsManager.settings.units
+            contactTrickManager.delegate = self
+
             Task {
                 /// Initial fetch to fill the ContactTrickEntry array
                 await fetchContactTrickEntriesAndUpdateUI()
+
+                // Initial state update is needed for preview
+                await contactTrickManager.updateContactTrickState()
+            }
+        }
+
+        func contactTrickManagerDidUpdateState(_ state: ContactTrickState) {
+            Task { @MainActor in
+                self.state = state
             }
         }
 

+ 1 - 1
FreeAPS/Sources/Modules/ContactTrick/View/AddContactTrickSheet.swift

@@ -51,7 +51,7 @@ struct AddContactTrickSheet: View {
                             .fill(previewEntry.darkMode ? .black : .white)
                             .foregroundColor(.white)
                             .frame(width: 100, height: 100)
-                        Image(uiImage: ContactPicture.getImage(contact: previewEntry, state: state.previewState))
+                        Image(uiImage: ContactPicture.getImage(contact: previewEntry, state: state.state))
                             .resizable()
                             .frame(width: 100, height: 100)
                             .clipShape(Circle())

+ 1 - 1
FreeAPS/Sources/Modules/ContactTrick/View/ContactTrickDetailView.swift

@@ -26,7 +26,7 @@ struct ContactTrickDetailView: View {
                         .fill(contactTrickEntry.darkMode ? .black : .white)
                         .foregroundColor(.white)
                         .frame(width: 100, height: 100)
-                    Image(uiImage: ContactPicture.getImage(contact: contactTrickEntry, state: state.previewState))
+                    Image(uiImage: ContactPicture.getImage(contact: contactTrickEntry, state: state.state))
                         .resizable()
                         .frame(width: 100, height: 100)
                         .clipShape(Circle())

+ 1 - 3
FreeAPS/Sources/Modules/ContactTrick/View/ContactTrickRootView.swift

@@ -51,14 +51,13 @@ extension ContactTrick {
                     ForEach(state.contactTrickEntries, id: \.id) { entry in
                         NavigationLink(destination: ContactTrickDetailView(entry: entry, state: state)) {
                             HStack {
-                                // TODO: - make this beautiful @Dan
                                 ZStack {
                                     Circle()
                                         .fill(entry.darkMode ? .black : .white)
                                         .foregroundColor(.white)
                                         .frame(width: 40, height: 40)
 
-                                    Image(uiImage: ContactPicture.getImage(contact: entry, state: state.previewState))
+                                    Image(uiImage: ContactPicture.getImage(contact: entry, state: state.state))
                                         .resizable()
                                         .frame(width: 40, height: 40)
                                         .clipShape(Circle())
@@ -69,7 +68,6 @@ extension ContactTrick {
                                         .frame(width: 40, height: 40)
                                 }
 
-                                // Entry name
                                 Text("\(entry.name)")
                             }
                         }

+ 12 - 0
FreeAPS/Sources/Services/ContactTrick/ContactTrickManager.swift

@@ -3,7 +3,12 @@ import Contacts
 import CoreData
 import Swinject
 
+protocol ContactTrickManagerDelegate: AnyObject {
+    func contactTrickManagerDidUpdateState(_ state: ContactTrickState)
+}
+
 protocol ContactTrickManager {
+    var delegate: ContactTrickManagerDelegate? { get set }
     func requestAccess() async -> Bool
     func createContact(name: String) async -> String?
     func deleteContact(withIdentifier identifier: String) async -> Bool
@@ -41,6 +46,8 @@ final class BaseContactTrickManager: NSObject, ContactTrickManager, Injectable {
         return formatter
     }
 
+    weak var delegate: ContactTrickManagerDelegate?
+
     init(resolver: Resolver) {
         super.init()
         injectServices(resolver)
@@ -239,6 +246,11 @@ final class BaseContactTrickManager: NSObject, ContactTrickManager, Injectable {
             .targetGlucose = await getCurrentGlucoseTarget() ??
             (settingsManager.settings.units == .mgdL ? Decimal(100) : 100.asMmolL)
         state.glucoseColorScheme = settingsManager.settings.glucoseColorScheme
+
+        // Notify delegate about state update on main thread
+        await MainActor.run {
+            delegate?.contactTrickManagerDidUpdateState(state)
+        }
     }
 
     // MARK: - Interactions with CNContactStore API