diff --git a/Shared/FeelsApp.swift b/Shared/FeelsApp.swift index 7ca3df2..4127855 100644 --- a/Shared/FeelsApp.swift +++ b/Shared/FeelsApp.swift @@ -30,14 +30,12 @@ struct FeelsApp: App { .environment(\.managedObjectContext, persistenceController.viewContext) }.onChange(of: scenePhase) { phase in if phase == .background { - BGTask.scheduleBackgroundProcessing() +// BGTask.scheduleBackgroundProcessing() WidgetCenter.shared.reloadAllTimelines() } if phase == .active { UIApplication.shared.applicationIconBadgeNumber = 0 - print("UserDefaultsStore input day", UserDefaultsStore.getOnboarding().inputDay) - print("UserDefaultsStore input date", UserDefaultsStore.getOnboarding().date) } } } diff --git a/Shared/Persisence/Persistence.swift b/Shared/Persisence/Persistence.swift index 6245a54..f6d2eda 100644 --- a/Shared/Persisence/Persistence.swift +++ b/Shared/Persisence/Persistence.swift @@ -12,9 +12,7 @@ class PersistenceController { @AppStorage(UserDefaultsStore.Keys.useCloudKit.rawValue, store: GroupUserDefaults.groupDefaults) private var useCloudKit = false static let shared = PersistenceController.persistenceController - - public var listeners = [(() -> Void)]() - + private static var persistenceController: PersistenceController { return PersistenceController(inMemory: false) } @@ -23,8 +21,14 @@ class PersistenceController { return PersistenceController.shared.container.viewContext } + public lazy var childContext: NSManagedObjectContext = { + NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) + }() + public var switchContainerListeners = [(() -> Void)]() + private var editedDataClosure = [() -> Void]() + public var earliestEntry: MoodEntry? { let fetchRequest = NSFetchRequest(entityName: "MoodEntry") fetchRequest.sortDescriptors = [NSSortDescriptor(key: "forDate", ascending: true)] @@ -50,6 +54,16 @@ class PersistenceController { item() } } + + public func addNewDataListener(closure: @escaping (() -> Void)) { + editedDataClosure.append(closure) + } + + public func runDataListeners() { + for closure in editedDataClosure { + closure() + } + } private func setupContainer() -> NSPersistentContainer { if useCloudKit { @@ -79,12 +93,6 @@ class PersistenceController { init(inMemory: Bool = false) { container = setupContainer() } - - func updateListeners() { - for listener in listeners { - listener() - } - } } extension NSManagedObjectContext { diff --git a/Shared/Persisence/PersistenceADD.swift b/Shared/Persisence/PersistenceADD.swift index 72ec602..cbd516d 100644 --- a/Shared/Persisence/PersistenceADD.swift +++ b/Shared/Persisence/PersistenceADD.swift @@ -25,7 +25,7 @@ extension PersistenceController { do { try viewContext.save() - updateListeners() + runDataListeners() } catch { let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") diff --git a/Shared/Persisence/PersistenceDELETE.swift b/Shared/Persisence/PersistenceDELETE.swift index 9573647..4699a79 100644 --- a/Shared/Persisence/PersistenceDELETE.swift +++ b/Shared/Persisence/PersistenceDELETE.swift @@ -15,7 +15,7 @@ extension PersistenceController { do { try viewContext.executeAndMergeChanges(using: deleteRequest) try viewContext.save() - updateListeners() + runDataListeners() } catch let error as NSError { fatalError("Unresolved error \(error), \(error.userInfo)") } @@ -25,7 +25,7 @@ extension PersistenceController { if let entry = PersistenceController.shared.getEntry(byDate: forDate) { viewContext.delete(entry) try! viewContext.save() - updateListeners() + runDataListeners() } } } diff --git a/Shared/Persisence/PersistenceHelper.swift b/Shared/Persisence/PersistenceHelper.swift index fd48b83..b50bfc6 100644 --- a/Shared/Persisence/PersistenceHelper.swift +++ b/Shared/Persisence/PersistenceHelper.swift @@ -8,10 +8,6 @@ import CoreData extension PersistenceController { - private var childContext: NSManagedObjectContext { - return NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) - } - public func randomEntries(count: Int) -> [MoodEntry] { var entries = [MoodEntry]() @@ -63,19 +59,24 @@ extension PersistenceController { } func populateTestData() { - for idx in 1..<120 { - let newItem = MoodEntry(context: viewContext) - newItem.timestamp = Date() - newItem.moodValue = Int16(Mood.allValues.randomElement()!.rawValue) - newItem.canEdit = true - newItem.canDelete = true - - let date = Calendar.current.date(byAdding: .day, value: -idx, to: Date())! - newItem.forDate = date - newItem.weekDay = Int16(Calendar.current.component(.weekday, from: date)) - } do { + self.clearDB() try viewContext.save() + + for idx in 1..<120 { + let newItem = MoodEntry(context: viewContext) + newItem.timestamp = Date() + newItem.moodValue = Int16(Mood.allValues.randomElement()!.rawValue) + newItem.canEdit = true + newItem.canDelete = true + + let date = Calendar.current.date(byAdding: .day, value: -idx, to: Date())! + newItem.forDate = date + newItem.weekDay = Int16(Calendar.current.component(.weekday, from: date)) + } + + try viewContext.save() + runDataListeners() } catch { // 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. diff --git a/Shared/Persisence/PersistenceUPDATE.swift b/Shared/Persisence/PersistenceUPDATE.swift index c9ab3d3..9d9dea9 100644 --- a/Shared/Persisence/PersistenceUPDATE.swift +++ b/Shared/Persisence/PersistenceUPDATE.swift @@ -37,7 +37,7 @@ extension PersistenceController { return false } - updateListeners() + runDataListeners() return true } } diff --git a/Shared/views/HeaderStatsView.swift b/Shared/views/HeaderStatsView.swift index 841ec0a..0304934 100644 --- a/Shared/views/HeaderStatsView.swift +++ b/Shared/views/HeaderStatsView.swift @@ -11,10 +11,16 @@ import Charts struct HeaderStatsView : UIViewRepresentable { //Bar chart accepts data as array of BarChartDataEntry objects var entries : [BarChartDataEntry] - var moodTint: MoodTints + var moodTints: [Color] - init(fakeData: Bool, backDays: Int, moodTint: MoodTints) { - self.moodTint = moodTint + var tmpHolderToMakeViewDiffefrent: Color + + init(fakeData: Bool, backDays: Int, moodTint: [Color]) { + self.moodTints = moodTint + guard moodTints.count == 5 else { + fatalError("mood tint count dont match") + } + self.tmpHolderToMakeViewDiffefrent = Color.random() entries = [BarChartDataEntry]() var moodEntries: [MoodEntry]? @@ -98,7 +104,7 @@ struct HeaderStatsView : UIViewRepresentable { let dataSet = BarChartDataSet(entries: entries) // change bars color to green - dataSet.colors = Mood.allValues.map({ NSUIColor( moodTint.color(forMood: $0) ) }) + dataSet.colors = moodTints.map({ NSUIColor( $0 ) }) dataSet.secondaryTextColor = UIColor.systemGray dataSet.valueColors = [.white] dataSet.highlightAlpha = 0.0 @@ -122,6 +128,6 @@ struct HeaderStatsView : UIViewRepresentable { struct HeaderStatsView_Previews: PreviewProvider { static var previews: some View { - HeaderStatsView(fakeData: true, backDays: 30, moodTint: .Default).frame(minHeight: 85, maxHeight: 90) + HeaderStatsView(fakeData: true, backDays: 30, moodTint: [Color.green, Color.blue, Color.yellow, Color.red, Color.orange]).frame(minHeight: 85, maxHeight: 90) } } diff --git a/Shared/views/HomeView/HomeView.swift b/Shared/views/HomeView/HomeView.swift index 0e64e95..af72979 100644 --- a/Shared/views/HomeView/HomeView.swift +++ b/Shared/views/HomeView/HomeView.swift @@ -24,6 +24,9 @@ struct HomeView: View { @AppStorage(UserDefaultsStore.Keys.moodImages.rawValue, store: GroupUserDefaults.groupDefaults) private var imagePack: MoodImages = .FontAwesome @AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default + // store a value that gets changed when user updates custom colors to update the view since the moodTint doesn't change + @AppStorage(UserDefaultsStore.Keys.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0 + // MARK: top header storage @AppStorage(UserDefaultsStore.Keys.contentViewCurrentSelectedHeaderViewBackDays.rawValue, store: GroupUserDefaults.groupDefaults) private var currentSelectedHeaderViewBackDays: Int = 30 @AppStorage(UserDefaultsStore.Keys.contentViewHeaderTagViewOneViewType.rawValue, store: GroupUserDefaults.groupDefaults) private var firstSwichableHeaderViewType: MainSwitchableViewType = .total @@ -119,6 +122,10 @@ struct HomeView: View { Spacer() } else { ZStack { + + Text(String(customMoodTintUpdateNumber)) + .hidden() + VStack { headerView Spacer() @@ -167,11 +174,7 @@ struct HomeView: View { .foregroundColor(Color(UIColor.darkGray)) .font(.system(size: 20)) }).sheet(isPresented: $showingSheet) { - SettingsView(editedDataClosure: { - withAnimation{ - viewModel.updateData() - } - }) + SettingsView() }.padding(.trailing) } } diff --git a/Shared/views/HomeView/HomeViewViewModel.swift b/Shared/views/HomeView/HomeViewViewModel.swift index 204919e..c2be984 100644 --- a/Shared/views/HomeView/HomeViewViewModel.swift +++ b/Shared/views/HomeView/HomeViewViewModel.swift @@ -41,10 +41,12 @@ class HomeViewViewModel: ObservableObject { PersistenceController.shared.switchContainerListeners.append { self.getGroupedData(addMonthStartWeekdayPadding: self.addMonthStartWeekdayPadding) - } - PersistenceController.shared.listeners.append { [weak self] in - self?.updateData() + + PersistenceController.shared.addNewDataListener { + withAnimation{ + self.updateData() + } } updateData() } @@ -55,7 +57,7 @@ class HomeViewViewModel: ObservableObject { if addMonthStartWeekdayPadding { grouped = MoodEntryFunctions.padMoodEntriesForCalendar(entries: grouped) } - +// numberOfItems = numberOfEntries } @@ -67,12 +69,11 @@ class HomeViewViewModel: ObservableObject { public func add(mood: Mood, forDate date: Date, entryType: EntryType) { PersistenceController.shared.add(mood: mood, forDate: date, entryType: entryType) - updateData() } public func update(entry: MoodEntry, toMood mood: Mood) { - if PersistenceController.shared.update(entryDate: entry.forDate!, withModd: mood) { - updateData() + if !PersistenceController.shared.update(entryDate: entry.forDate!, withModd: mood) { + #warning("show error") } } @@ -96,7 +97,6 @@ class HomeViewViewModel: ObservableObject { do { try PersistenceController.shared.viewContext.save() - updateData() } catch { // 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. diff --git a/Shared/views/MainTabView.swift b/Shared/views/MainTabView.swift index 1a28a2a..ed29372 100644 --- a/Shared/views/MainTabView.swift +++ b/Shared/views/MainTabView.swift @@ -66,7 +66,6 @@ struct MainTabView: View { } }) .onChange(of: theme, perform: { value in - print("changed to ", value) switch theme { case .system: UIApplication.shared.windows.first?.overrideUserInterfaceStyle = .unspecified diff --git a/Shared/views/MonthView/MonthView.swift b/Shared/views/MonthView/MonthView.swift index 7497a60..6908baf 100644 --- a/Shared/views/MonthView/MonthView.swift +++ b/Shared/views/MonthView/MonthView.swift @@ -14,6 +14,7 @@ struct MonthView: View { @AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default + // store a value that gets changed when user updates custom colors to update the view since the moodTint doesn't change @AppStorage(UserDefaultsStore.Keys.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0 @ObservedObject var viewModel = HomeViewViewModel(addMonthStartWeekdayPadding: true) @@ -111,11 +112,7 @@ extension MonthView { .foregroundColor(Color(UIColor.darkGray)) .font(.system(size: 20)) }).sheet(isPresented: $showingSheet) { - SettingsView(editedDataClosure: { - withAnimation{ - viewModel.updateData() - } - }) + SettingsView() } .padding(.top, 60) .padding(.trailing) diff --git a/Shared/views/SettingsView/SettingsView.swift b/Shared/views/SettingsView/SettingsView.swift index c9cbff4..ec4d8d3 100644 --- a/Shared/views/SettingsView/SettingsView.swift +++ b/Shared/views/SettingsView/SettingsView.swift @@ -10,9 +10,7 @@ import CloudKitSyncMonitor struct SettingsView: View { @Environment(\.dismiss) var dismiss - - let editedDataClosure: (() -> Void) - + @State private var showOnboarding = false @State private var showSpecialThanks = false @@ -104,7 +102,6 @@ struct SettingsView: View { theme.currentTheme.secondaryBGColor Button(action: { PersistenceController.shared.populateTestData() - editedDataClosure() }, label: { Text("Add test data") .foregroundColor(theme.currentTheme.labelColor) @@ -120,7 +117,6 @@ struct SettingsView: View { theme.currentTheme.secondaryBGColor Button(action: { PersistenceController.shared.clearDB() - editedDataClosure() }, label: { Text("Clear DB") .foregroundColor(theme.currentTheme.labelColor) @@ -224,13 +220,9 @@ struct SettingsView: View { struct SettingsView_Previews: PreviewProvider { static var previews: some View { - SettingsView(editedDataClosure: { - - }) + SettingsView() - SettingsView(editedDataClosure: { - - }) + SettingsView() .preferredColorScheme(.dark) } } diff --git a/Shared/views/SharingTemplates/CurrentStreakTemplate.swift b/Shared/views/SharingTemplates/CurrentStreakTemplate.swift index a1f69e2..a993510 100644 --- a/Shared/views/SharingTemplates/CurrentStreakTemplate.swift +++ b/Shared/views/SharingTemplates/CurrentStreakTemplate.swift @@ -108,7 +108,6 @@ struct CurrentStreakTemplate: View, SharingTemplate { HStack(alignment: .center) { Button(action: { let _image = self.image - print(_image) self.shareImage.showFuckingSheet = true self.shareImage.fuckingWrappedShrable = _image }, label: { diff --git a/Shared/views/SharingTemplates/LongestStreakTemplate.swift b/Shared/views/SharingTemplates/LongestStreakTemplate.swift index e312a04..6599c16 100644 --- a/Shared/views/SharingTemplates/LongestStreakTemplate.swift +++ b/Shared/views/SharingTemplates/LongestStreakTemplate.swift @@ -182,7 +182,6 @@ struct LongestStreakTemplate: View, SharingTemplate { HStack(alignment: .center) { Button(action: { let _image = self.image - print(_image) self.shareImage.showFuckingSheet = true self.shareImage.fuckingWrappedShrable = _image }, label: { diff --git a/Shared/views/SwitchableView.swift b/Shared/views/SwitchableView.swift index 897508d..fec9e6e 100644 --- a/Shared/views/SwitchableView.swift +++ b/Shared/views/SwitchableView.swift @@ -30,6 +30,9 @@ struct SwitchableView: View { @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system @AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default + // store a value that gets changed when user updates custom colors to update the view since the moodTint doesn't change + @AppStorage(UserDefaultsStore.Keys.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0 + init(daysBack: Int, viewType: Binding, headerTypeChanged: @escaping ((MainSwitchableViewType) -> Void)) { self.daysBack = daysBack self.headerTypeChanged = headerTypeChanged @@ -39,9 +42,17 @@ struct SwitchableView: View { var body: some View { VStack { ZStack { + Text(String(customMoodTintUpdateNumber)) + .hidden() switch viewType { case .total: - HeaderStatsView(fakeData: false, backDays: daysBack, moodTint: moodTint) + HeaderStatsView(fakeData: false, backDays: daysBack, moodTint: [ + moodTint.color(forMood: .great), + moodTint.color(forMood: .good), + moodTint.color(forMood: .average), + moodTint.color(forMood: .bad), + moodTint.color(forMood: .horrible) + ]) .padding([.leading, .trailing], -15) .padding([.top, .bottom], 8) .allowsHitTesting(false)