import SwiftUI import SwiftData /// A view modifier that refreshes the view when CloudKit data changes struct CloudKitSyncObserver: ViewModifier { @Environment(\.modelContext) private var modelContext @State private var refreshID = UUID() func body(content: Content) -> some View { content .id(refreshID) // Force view refresh when this changes .onReceive(NotificationCenter.default.publisher(for: .cloudKitDataDidChange)) { _ in refreshID = UUID() Task { @MainActor in // do { // for entity in modelContext.container.schema.entities { // fetchAll(of: entity.Type, from: modelContext) // } // } catch { // print("ERROR: failed to fetch data on CloudKit change") // } // // try? modelContext.fetch(FetchDescriptor()) // try? modelContext.fetch(FetchDescriptor()) // try? modelContext.fetch(FetchDescriptor()) // try? modelContext.fetch(FetchDescriptor()) // try? modelContext.fetch(FetchDescriptor()) // try? modelContext.fetch(FetchDescriptor()) // try? modelContext.fetch(FetchDescriptor()) // try? modelContext.fetch(FetchDescriptor()) // TODO: add more entities? } } } private func fetchAll(of type: T.Type,from modelContext: ModelContext) async throws -> [T]? { try modelContext.fetch(FetchDescriptor()) } } // Extension to make it easier to use the modifier extension View { /// Adds observation for CloudKit sync changes and refreshes the view when changes occur func observeCloudKitChanges() -> some View { self.modifier(CloudKitSyncObserver()) } }