// // DataController.swift // Feels // // SwiftData controller replacing Core Data PersistenceController. // import SwiftData import SwiftUI @MainActor final class DataController: ObservableObject { static let shared = DataController() private(set) var container: ModelContainer var modelContext: ModelContext { container.mainContext } private var useCloudKit: Bool { GroupUserDefaults.groupDefaults.bool(forKey: UserDefaultsStore.Keys.useCloudKit.rawValue) } // Listeners for data changes (keeping existing pattern) var switchContainerListeners = [(() -> Void)]() private var editedDataClosure = [() -> Void]() // Computed properties for earliest/latest entries var earliestEntry: MoodEntryModel? { var descriptor = FetchDescriptor( sortBy: [SortDescriptor(\.forDate, order: .forward)] ) descriptor.fetchLimit = 1 return try? modelContext.fetch(descriptor).first } var latestEntry: MoodEntryModel? { var descriptor = FetchDescriptor( sortBy: [SortDescriptor(\.forDate, order: .reverse)] ) descriptor.fetchLimit = 1 return try? modelContext.fetch(descriptor).first } private init() { let cloudKit = GroupUserDefaults.groupDefaults.bool(forKey: UserDefaultsStore.Keys.useCloudKit.rawValue) container = SharedModelContainer.create(useCloudKit: cloudKit) } // MARK: - Container Switching (for CloudKit toggle) func switchContainer() { save() container = SharedModelContainer.create(useCloudKit: useCloudKit) for listener in switchContainerListeners { listener() } } // MARK: - Listener Management func addNewDataListener(closure: @escaping (() -> Void)) { editedDataClosure.append(closure) } func saveAndRunDataListeners() { save() for closure in editedDataClosure { closure() } } func save() { guard modelContext.hasChanges else { return } do { try modelContext.save() } catch { print("Failed to save context: \(error)") } } }