add in cloudkit toggle

This commit is contained in:
Trey t
2022-01-26 12:08:40 -06:00
parent 6c96602bff
commit 8c58b37be5
10 changed files with 88 additions and 38 deletions

View File

@@ -27,7 +27,7 @@ struct FeelsApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, persistenceController.container.viewContext)
.environment(\.managedObjectContext, persistenceController.viewContext)
}.onChange(of: scenePhase) { phase in
if phase == .background {
BGTask.scheduleBackgroundProcessing()

View File

@@ -13,6 +13,10 @@ class ContentModeViewModel: ObservableObject {
@Published public private(set) var savedOnboardingData = UserDefaultsStore.getOnboarding()
init() {
PersistenceController.shared.switchContainerListeners.append {
self.getGroupedData()
}
updateData()
}

View File

@@ -11,6 +11,7 @@ class UserDefaultsStore {
enum Keys: String {
case savedOnboardingData
case needsOnboarding
case useCloudKit
}
static func getOnboarding() -> OnboardingData {

View File

@@ -6,13 +6,10 @@
//
import CoreData
import WidgetKit
import Foundation
import UIKit
import SwiftUI
class PersistenceController {
private var dataUpdateCall: (() -> Void)?
private let callDelay = 10
@AppStorage(UserDefaultsStore.Keys.useCloudKit.rawValue) private var useCloudKit = false
static let shared = PersistenceController.persistenceController
@@ -24,6 +21,8 @@ class PersistenceController {
return PersistenceController.shared.container.viewContext
}
public var switchContainerListeners = [(() -> Void)]()
public func getEntry(byDate date: Date) -> MoodEntry? {
let predicate = NSPredicate(format: "forDate == %@",
date as NSDate)
@@ -180,40 +179,49 @@ class PersistenceController {
return entries
}
let container: NSPersistentCloudKitContainer
lazy var container: NSPersistentContainer = {
setupContainer()
}()
init(inMemory: Bool = false) {
container = NSPersistentCloudKitContainer(name: "Feels")
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
func switchContainer() {
try? viewContext.save()
container = setupContainer()
for item in switchContainerListeners {
item()
}
}
private func setupContainer() -> NSPersistentContainer {
if useCloudKit {
container = NSPersistentCloudKitContainer(name: "Feels")
} else {
container = NSPersistentContainer(name: "Feels")
}
guard let description = container.persistentStoreDescriptions.first else {
fatalError("Could not retrieve a persistent store description.")
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
/*
Typical reasons for an error here include:
* The parent directory does not exist, cannot be created, or disallows writing.
* The persistent store is not accessible, due to permissions or data protection when the device is locked.
* The device is out of space.
* The store could not be migrated to the current model version.
Check the error message to determine what the actual problem was.
*/
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
container.viewContext.automaticallyMergesChangesFromParent = true
for description in container.persistentStoreDescriptions {
description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}
init(inMemory: Bool = false) {
container = setupContainer()
}
public func splitIntoYearMonth() -> [Int: [Int: [MoodEntry]]] {
let data = PersistenceController.shared.getData(startDate: Date(timeIntervalSince1970: 0),

View File

@@ -75,19 +75,19 @@ struct AddMoodHeaderView_Previews: PreviewProvider {
Group {
AddMoodHeaderView(addItemHeaderClosure: { (_,_) in
}).environment(\.managedObjectContext, PersistenceController.shared.container.viewContext)
}).environment(\.managedObjectContext, PersistenceController.shared.viewContext)
AddMoodHeaderView(addItemHeaderClosure: { (_,_) in
}).preferredColorScheme(.dark).environment(\.managedObjectContext, PersistenceController.shared.container.viewContext)
}).preferredColorScheme(.dark).environment(\.managedObjectContext, PersistenceController.shared.viewContext)
AddMoodHeaderView(addItemHeaderClosure: { (_,_) in
}).environment(\.managedObjectContext, PersistenceController.shared.container.viewContext)
}).environment(\.managedObjectContext, PersistenceController.shared.viewContext)
AddMoodHeaderView(addItemHeaderClosure: { (_,_) in
}).preferredColorScheme(.dark).environment(\.managedObjectContext, PersistenceController.shared.container.viewContext)
}).preferredColorScheme(.dark).environment(\.managedObjectContext, PersistenceController.shared.viewContext)
}
}
}

View File

@@ -69,13 +69,13 @@ struct BGView: View, Equatable {
struct BGView_Previews: PreviewProvider {
static var previews: some View {
BGView().environment(\.managedObjectContext, PersistenceController.shared.container.viewContext)
BGView().environment(\.managedObjectContext, PersistenceController.shared.viewContext)
.onAppear(perform: {
PersistenceController.shared.populateMemory()
})
BGView()
.preferredColorScheme(.dark)
.environment(\.managedObjectContext, PersistenceController.shared.container.viewContext)
.environment(\.managedObjectContext, PersistenceController.shared.viewContext)
}
}

View File

@@ -212,6 +212,7 @@ struct ContentView: View {
VStack{
settingsButtonView
.padding(.top, 50)
headerView
@@ -231,13 +232,13 @@ private let itemFormatter: DateFormatter = {
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environment(\.managedObjectContext, PersistenceController.shared.container.viewContext)
ContentView().environment(\.managedObjectContext, PersistenceController.shared.viewContext)
.onAppear(perform: {
PersistenceController.shared.populateMemory()
})
ContentView()
.preferredColorScheme(.dark)
.environment(\.managedObjectContext, PersistenceController.shared.container.viewContext)
.environment(\.managedObjectContext, PersistenceController.shared.viewContext)
}
}

View File

@@ -20,6 +20,8 @@ struct SettingsView: View {
@State private var showWhyBGMode = false
@ObservedObject var syncMonitor = SyncMonitor.shared
@AppStorage(UserDefaultsStore.Keys.useCloudKit.rawValue) private var useCloudKit = false
var body: some View {
ZStack {
Color(UIColor.secondarySystemBackground)
@@ -27,13 +29,18 @@ struct SettingsView: View {
VStack {
closeButtonView
.padding()
cloudKitEnable
addTestDataCell
clearDB
changeIcon
showOnboardingButton
whyBackgroundMode
specialThanksCell
cloudKitStatus
if useCloudKit {
cloudKitStatus
}
Spacer()
}
.padding()
@@ -192,6 +199,25 @@ struct SettingsView: View {
.clipShape(RoundedRectangle(cornerRadius: 25, style: .continuous))
}
private var cloudKitEnable: some View {
ZStack {
Color(UIColor.systemBackground)
VStack {
Toggle(String(localized: "settings_use_cloudkit_title"),
isOn: $useCloudKit)
.onChange(of: useCloudKit) { value in
print(value)
PersistenceController.shared.switchContainer()
}
.padding()
Text(String(localized: "settings_use_cloudkit_body"))
}
.padding(.bottom)
}
.fixedSize(horizontal: false, vertical: true)
.clipShape(RoundedRectangle(cornerRadius: 25, style: .continuous))
}
private var cloudKitStatus: some View {
ZStack {
Color(UIColor.systemBackground)