update top header graph view when custom color changes

code cleanup
This commit is contained in:
Trey t
2022-03-02 17:25:06 -06:00
parent 39a974bdf4
commit 746337b6a2
15 changed files with 82 additions and 69 deletions

View File

@@ -30,14 +30,12 @@ struct FeelsApp: App {
.environment(\.managedObjectContext, persistenceController.viewContext) .environment(\.managedObjectContext, persistenceController.viewContext)
}.onChange(of: scenePhase) { phase in }.onChange(of: scenePhase) { phase in
if phase == .background { if phase == .background {
BGTask.scheduleBackgroundProcessing() // BGTask.scheduleBackgroundProcessing()
WidgetCenter.shared.reloadAllTimelines() WidgetCenter.shared.reloadAllTimelines()
} }
if phase == .active { if phase == .active {
UIApplication.shared.applicationIconBadgeNumber = 0 UIApplication.shared.applicationIconBadgeNumber = 0
print("UserDefaultsStore input day", UserDefaultsStore.getOnboarding().inputDay)
print("UserDefaultsStore input date", UserDefaultsStore.getOnboarding().date)
} }
} }
} }

View File

@@ -13,8 +13,6 @@ class PersistenceController {
static let shared = PersistenceController.persistenceController static let shared = PersistenceController.persistenceController
public var listeners = [(() -> Void)]()
private static var persistenceController: PersistenceController { private static var persistenceController: PersistenceController {
return PersistenceController(inMemory: false) return PersistenceController(inMemory: false)
} }
@@ -23,8 +21,14 @@ class PersistenceController {
return PersistenceController.shared.container.viewContext return PersistenceController.shared.container.viewContext
} }
public lazy var childContext: NSManagedObjectContext = {
NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
}()
public var switchContainerListeners = [(() -> Void)]() public var switchContainerListeners = [(() -> Void)]()
private var editedDataClosure = [() -> Void]()
public var earliestEntry: MoodEntry? { public var earliestEntry: MoodEntry? {
let fetchRequest = NSFetchRequest<MoodEntry>(entityName: "MoodEntry") let fetchRequest = NSFetchRequest<MoodEntry>(entityName: "MoodEntry")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "forDate", ascending: true)] fetchRequest.sortDescriptors = [NSSortDescriptor(key: "forDate", ascending: true)]
@@ -51,6 +55,16 @@ class PersistenceController {
} }
} }
public func addNewDataListener(closure: @escaping (() -> Void)) {
editedDataClosure.append(closure)
}
public func runDataListeners() {
for closure in editedDataClosure {
closure()
}
}
private func setupContainer() -> NSPersistentContainer { private func setupContainer() -> NSPersistentContainer {
if useCloudKit { if useCloudKit {
container = NSPersistentCloudKitContainer(name: "Feels") container = NSPersistentCloudKitContainer(name: "Feels")
@@ -79,12 +93,6 @@ class PersistenceController {
init(inMemory: Bool = false) { init(inMemory: Bool = false) {
container = setupContainer() container = setupContainer()
} }
func updateListeners() {
for listener in listeners {
listener()
}
}
} }
extension NSManagedObjectContext { extension NSManagedObjectContext {

View File

@@ -25,7 +25,7 @@ extension PersistenceController {
do { do {
try viewContext.save() try viewContext.save()
updateListeners() runDataListeners()
} catch { } catch {
let nsError = error as NSError let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)") fatalError("Unresolved error \(nsError), \(nsError.userInfo)")

View File

@@ -15,7 +15,7 @@ extension PersistenceController {
do { do {
try viewContext.executeAndMergeChanges(using: deleteRequest) try viewContext.executeAndMergeChanges(using: deleteRequest)
try viewContext.save() try viewContext.save()
updateListeners() runDataListeners()
} catch let error as NSError { } catch let error as NSError {
fatalError("Unresolved error \(error), \(error.userInfo)") fatalError("Unresolved error \(error), \(error.userInfo)")
} }
@@ -25,7 +25,7 @@ extension PersistenceController {
if let entry = PersistenceController.shared.getEntry(byDate: forDate) { if let entry = PersistenceController.shared.getEntry(byDate: forDate) {
viewContext.delete(entry) viewContext.delete(entry)
try! viewContext.save() try! viewContext.save()
updateListeners() runDataListeners()
} }
} }
} }

View File

@@ -8,10 +8,6 @@
import CoreData import CoreData
extension PersistenceController { extension PersistenceController {
private var childContext: NSManagedObjectContext {
return NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
}
public func randomEntries(count: Int) -> [MoodEntry] { public func randomEntries(count: Int) -> [MoodEntry] {
var entries = [MoodEntry]() var entries = [MoodEntry]()
@@ -63,6 +59,10 @@ extension PersistenceController {
} }
func populateTestData() { func populateTestData() {
do {
self.clearDB()
try viewContext.save()
for idx in 1..<120 { for idx in 1..<120 {
let newItem = MoodEntry(context: viewContext) let newItem = MoodEntry(context: viewContext)
newItem.timestamp = Date() newItem.timestamp = Date()
@@ -74,8 +74,9 @@ extension PersistenceController {
newItem.forDate = date newItem.forDate = date
newItem.weekDay = Int16(Calendar.current.component(.weekday, from: date)) newItem.weekDay = Int16(Calendar.current.component(.weekday, from: date))
} }
do {
try viewContext.save() try viewContext.save()
runDataListeners()
} catch { } catch {
// Replace this implementation with code to handle the error appropriately. // 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. // 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.

View File

@@ -37,7 +37,7 @@ extension PersistenceController {
return false return false
} }
updateListeners() runDataListeners()
return true return true
} }
} }

View File

@@ -11,10 +11,16 @@ import Charts
struct HeaderStatsView : UIViewRepresentable { struct HeaderStatsView : UIViewRepresentable {
//Bar chart accepts data as array of BarChartDataEntry objects //Bar chart accepts data as array of BarChartDataEntry objects
var entries : [BarChartDataEntry] var entries : [BarChartDataEntry]
var moodTint: MoodTints var moodTints: [Color]
init(fakeData: Bool, backDays: Int, moodTint: MoodTints) { var tmpHolderToMakeViewDiffefrent: Color
self.moodTint = moodTint
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]() entries = [BarChartDataEntry]()
var moodEntries: [MoodEntry]? var moodEntries: [MoodEntry]?
@@ -98,7 +104,7 @@ struct HeaderStatsView : UIViewRepresentable {
let dataSet = BarChartDataSet(entries: entries) let dataSet = BarChartDataSet(entries: entries)
// change bars color to green // 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.secondaryTextColor = UIColor.systemGray
dataSet.valueColors = [.white] dataSet.valueColors = [.white]
dataSet.highlightAlpha = 0.0 dataSet.highlightAlpha = 0.0
@@ -122,6 +128,6 @@ struct HeaderStatsView : UIViewRepresentable {
struct HeaderStatsView_Previews: PreviewProvider { struct HeaderStatsView_Previews: PreviewProvider {
static var previews: some View { 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)
} }
} }

View File

@@ -24,6 +24,9 @@ struct HomeView: View {
@AppStorage(UserDefaultsStore.Keys.moodImages.rawValue, store: GroupUserDefaults.groupDefaults) private var imagePack: MoodImages = .FontAwesome @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 @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 // MARK: top header storage
@AppStorage(UserDefaultsStore.Keys.contentViewCurrentSelectedHeaderViewBackDays.rawValue, store: GroupUserDefaults.groupDefaults) private var currentSelectedHeaderViewBackDays: Int = 30 @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 @AppStorage(UserDefaultsStore.Keys.contentViewHeaderTagViewOneViewType.rawValue, store: GroupUserDefaults.groupDefaults) private var firstSwichableHeaderViewType: MainSwitchableViewType = .total
@@ -119,6 +122,10 @@ struct HomeView: View {
Spacer() Spacer()
} else { } else {
ZStack { ZStack {
Text(String(customMoodTintUpdateNumber))
.hidden()
VStack { VStack {
headerView headerView
Spacer() Spacer()
@@ -167,11 +174,7 @@ struct HomeView: View {
.foregroundColor(Color(UIColor.darkGray)) .foregroundColor(Color(UIColor.darkGray))
.font(.system(size: 20)) .font(.system(size: 20))
}).sheet(isPresented: $showingSheet) { }).sheet(isPresented: $showingSheet) {
SettingsView(editedDataClosure: { SettingsView()
withAnimation{
viewModel.updateData()
}
})
}.padding(.trailing) }.padding(.trailing)
} }
} }

View File

@@ -41,10 +41,12 @@ class HomeViewViewModel: ObservableObject {
PersistenceController.shared.switchContainerListeners.append { PersistenceController.shared.switchContainerListeners.append {
self.getGroupedData(addMonthStartWeekdayPadding: self.addMonthStartWeekdayPadding) self.getGroupedData(addMonthStartWeekdayPadding: self.addMonthStartWeekdayPadding)
} }
PersistenceController.shared.listeners.append { [weak self] in
self?.updateData() PersistenceController.shared.addNewDataListener {
withAnimation{
self.updateData()
}
} }
updateData() updateData()
} }
@@ -55,7 +57,7 @@ class HomeViewViewModel: ObservableObject {
if addMonthStartWeekdayPadding { if addMonthStartWeekdayPadding {
grouped = MoodEntryFunctions.padMoodEntriesForCalendar(entries: grouped) grouped = MoodEntryFunctions.padMoodEntriesForCalendar(entries: grouped)
} }
//
numberOfItems = numberOfEntries numberOfItems = numberOfEntries
} }
@@ -67,12 +69,11 @@ class HomeViewViewModel: ObservableObject {
public func add(mood: Mood, forDate date: Date, entryType: EntryType) { public func add(mood: Mood, forDate date: Date, entryType: EntryType) {
PersistenceController.shared.add(mood: mood, forDate: date, entryType: entryType) PersistenceController.shared.add(mood: mood, forDate: date, entryType: entryType)
updateData()
} }
public func update(entry: MoodEntry, toMood mood: Mood) { public func update(entry: MoodEntry, toMood mood: Mood) {
if PersistenceController.shared.update(entryDate: entry.forDate!, withModd: mood) { if !PersistenceController.shared.update(entryDate: entry.forDate!, withModd: mood) {
updateData() #warning("show error")
} }
} }
@@ -96,7 +97,6 @@ class HomeViewViewModel: ObservableObject {
do { do {
try PersistenceController.shared.viewContext.save() try PersistenceController.shared.viewContext.save()
updateData()
} catch { } catch {
// Replace this implementation with code to handle the error appropriately. // 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. // 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.

View File

@@ -66,7 +66,6 @@ struct MainTabView: View {
} }
}) })
.onChange(of: theme, perform: { value in .onChange(of: theme, perform: { value in
print("changed to ", value)
switch theme { switch theme {
case .system: case .system:
UIApplication.shared.windows.first?.overrideUserInterfaceStyle = .unspecified UIApplication.shared.windows.first?.overrideUserInterfaceStyle = .unspecified

View File

@@ -14,6 +14,7 @@ struct MonthView: View {
@AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default @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 @AppStorage(UserDefaultsStore.Keys.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0
@ObservedObject var viewModel = HomeViewViewModel(addMonthStartWeekdayPadding: true) @ObservedObject var viewModel = HomeViewViewModel(addMonthStartWeekdayPadding: true)
@@ -111,11 +112,7 @@ extension MonthView {
.foregroundColor(Color(UIColor.darkGray)) .foregroundColor(Color(UIColor.darkGray))
.font(.system(size: 20)) .font(.system(size: 20))
}).sheet(isPresented: $showingSheet) { }).sheet(isPresented: $showingSheet) {
SettingsView(editedDataClosure: { SettingsView()
withAnimation{
viewModel.updateData()
}
})
} }
.padding(.top, 60) .padding(.top, 60)
.padding(.trailing) .padding(.trailing)

View File

@@ -11,8 +11,6 @@ import CloudKitSyncMonitor
struct SettingsView: View { struct SettingsView: View {
@Environment(\.dismiss) var dismiss @Environment(\.dismiss) var dismiss
let editedDataClosure: (() -> Void)
@State private var showOnboarding = false @State private var showOnboarding = false
@State private var showSpecialThanks = false @State private var showSpecialThanks = false
@@ -104,7 +102,6 @@ struct SettingsView: View {
theme.currentTheme.secondaryBGColor theme.currentTheme.secondaryBGColor
Button(action: { Button(action: {
PersistenceController.shared.populateTestData() PersistenceController.shared.populateTestData()
editedDataClosure()
}, label: { }, label: {
Text("Add test data") Text("Add test data")
.foregroundColor(theme.currentTheme.labelColor) .foregroundColor(theme.currentTheme.labelColor)
@@ -120,7 +117,6 @@ struct SettingsView: View {
theme.currentTheme.secondaryBGColor theme.currentTheme.secondaryBGColor
Button(action: { Button(action: {
PersistenceController.shared.clearDB() PersistenceController.shared.clearDB()
editedDataClosure()
}, label: { }, label: {
Text("Clear DB") Text("Clear DB")
.foregroundColor(theme.currentTheme.labelColor) .foregroundColor(theme.currentTheme.labelColor)
@@ -224,13 +220,9 @@ struct SettingsView: View {
struct SettingsView_Previews: PreviewProvider { struct SettingsView_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
SettingsView(editedDataClosure: { SettingsView()
}) SettingsView()
SettingsView(editedDataClosure: {
})
.preferredColorScheme(.dark) .preferredColorScheme(.dark)
} }
} }

View File

@@ -108,7 +108,6 @@ struct CurrentStreakTemplate: View, SharingTemplate {
HStack(alignment: .center) { HStack(alignment: .center) {
Button(action: { Button(action: {
let _image = self.image let _image = self.image
print(_image)
self.shareImage.showFuckingSheet = true self.shareImage.showFuckingSheet = true
self.shareImage.fuckingWrappedShrable = _image self.shareImage.fuckingWrappedShrable = _image
}, label: { }, label: {

View File

@@ -182,7 +182,6 @@ struct LongestStreakTemplate: View, SharingTemplate {
HStack(alignment: .center) { HStack(alignment: .center) {
Button(action: { Button(action: {
let _image = self.image let _image = self.image
print(_image)
self.shareImage.showFuckingSheet = true self.shareImage.showFuckingSheet = true
self.shareImage.fuckingWrappedShrable = _image self.shareImage.fuckingWrappedShrable = _image
}, label: { }, label: {

View File

@@ -30,6 +30,9 @@ struct SwitchableView: View {
@AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system @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 @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<MainSwitchableViewType>, headerTypeChanged: @escaping ((MainSwitchableViewType) -> Void)) { init(daysBack: Int, viewType: Binding<MainSwitchableViewType>, headerTypeChanged: @escaping ((MainSwitchableViewType) -> Void)) {
self.daysBack = daysBack self.daysBack = daysBack
self.headerTypeChanged = headerTypeChanged self.headerTypeChanged = headerTypeChanged
@@ -39,9 +42,17 @@ struct SwitchableView: View {
var body: some View { var body: some View {
VStack { VStack {
ZStack { ZStack {
Text(String(customMoodTintUpdateNumber))
.hidden()
switch viewType { switch viewType {
case .total: 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([.leading, .trailing], -15)
.padding([.top, .bottom], 8) .padding([.top, .bottom], 8)
.allowsHitTesting(false) .allowsHitTesting(false)