From 2590a77bffbfc0c4c555b8324e5578037c165393 Mon Sep 17 00:00:00 2001 From: Trey t Date: Wed, 2 Mar 2022 11:22:20 -0600 Subject: [PATCH 1/7] custom mood tint --- Shared/Models/MoodTintable.swift | 103 ++++++++++++++--- Shared/Models/UserDefaultsStore.swift | 26 +++++ Shared/Persisence/PersistenceGET.swift | 2 +- .../views/CustomizeView/CustomizeView.swift | 107 +++++++++++++----- Shared/views/HomeView/HomeView.swift | 9 +- Shared/views/MonthView/MonthView.swift | 15 ++- 6 files changed, 209 insertions(+), 53 deletions(-) diff --git a/Shared/Models/MoodTintable.swift b/Shared/Models/MoodTintable.swift index d616719..20b9607 100644 --- a/Shared/Models/MoodTintable.swift +++ b/Shared/Models/MoodTintable.swift @@ -14,21 +14,22 @@ protocol MoodTintable { enum MoodTints: Int, CaseIterable { case Default - case AllRed case Neon - case MonoChrome case Pastel + case Custom + + static var defaultOptions: [MoodTints] { + return [Default, Neon, Pastel] + } func color(forMood mood: Mood) -> Color { switch self { case .Default: return DefaultMoodTint.color(forMood: mood) - case .AllRed: - return AllRedMoodTint.color(forMood: mood) + case .Custom: + return CustomMoodTint.color(forMood: mood) case .Neon: return NeonMoodTint.color(forMood: mood) - case .MonoChrome: - return MonoChromeTint.color(forMood: mood) case .Pastel: return PastelTint.color(forMood: mood) } @@ -38,12 +39,10 @@ enum MoodTints: Int, CaseIterable { switch self { case .Default: return DefaultMoodTint.secondary(forMood: mood) - case .AllRed: - return AllRedMoodTint.secondary(forMood: mood) + case .Custom: + return CustomMoodTint.secondary(forMood: mood) case .Neon: return NeonMoodTint.secondary(forMood: mood) - case .MonoChrome: - return MonoChromeTint.secondary(forMood: mood) case .Pastel: return PastelTint.secondary(forMood: mood) } @@ -53,18 +52,94 @@ enum MoodTints: Int, CaseIterable { switch self { case .Default: return DefaultMoodTint.self - case .AllRed: - return AllRedMoodTint.self + case .Custom: + return CustomMoodTint.self case .Neon: return NeonMoodTint.self - case .MonoChrome: - return MonoChromeTint.self case .Pastel: return PastelTint.self } } } +final class SavedMoodTint: NSObject, ObservableObject, Codable { + @Published var colorOne: Color + @Published var colorTwo: Color + @Published var colorThree: Color + @Published var colorFour: Color + @Published var colorFive: Color + + override init() { + colorOne = Color(hex: "a92b26") + colorTwo = Color(hex: "a92b26") + colorThree = Color(hex: "a92b26") + colorFour = Color(hex: "a92b26") + colorFive = Color(hex: "a92b26") + } + + enum CodingKeys: CodingKey { + case colorOne, colorTwo, colorThree, colorFour, colorFive + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + colorOne = try container.decode(Color.self, forKey: .colorOne) + colorTwo = try container.decode(Color.self, forKey: .colorTwo) + colorThree = try container.decode(Color.self, forKey: .colorThree) + colorFour = try container.decode(Color.self, forKey: .colorFour) + colorFive = try container.decode(Color.self, forKey: .colorFive) + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(colorOne, forKey: .colorOne) + try container.encode(colorTwo, forKey: .colorTwo) + try container.encode(colorThree, forKey: .colorThree) + try container.encode(colorFour, forKey: .colorFour) + try container.encode(colorFive, forKey: .colorFive) + } +} + +final class CustomMoodTint: MoodTintable { + static func color(forMood mood: Mood) -> Color { + switch mood { + case .horrible: + return UserDefaultsStore.getCustomMoodTint().colorFive + case .bad: + return UserDefaultsStore.getCustomMoodTint().colorFour + case .average: + return UserDefaultsStore.getCustomMoodTint().colorThree + case .good: + return UserDefaultsStore.getCustomMoodTint().colorTwo + case .great: + return UserDefaultsStore.getCustomMoodTint().colorOne + case .missing: + return Color(uiColor: UIColor.lightGray) + case .placeholder: + return Color(uiColor: UIColor.lightGray) + } + } + + static func secondary(forMood mood: Mood) -> Color { + switch mood { + case .horrible: + return UserDefaultsStore.getCustomMoodTint().colorFive + case .bad: + return UserDefaultsStore.getCustomMoodTint().colorFour + case .average: + return UserDefaultsStore.getCustomMoodTint().colorThree + case .good: + return UserDefaultsStore.getCustomMoodTint().colorTwo + case .great: + return UserDefaultsStore.getCustomMoodTint().colorOne + case .missing: + return Color(uiColor: UIColor.lightGray) + case .placeholder: + return Color(uiColor: UIColor.lightGray) + } + } +} + final class DefaultMoodTint: MoodTintable { static func color(forMood mood: Mood) -> Color { switch mood { diff --git a/Shared/Models/UserDefaultsStore.swift b/Shared/Models/UserDefaultsStore.swift index f50d5e2..cd59f9c 100644 --- a/Shared/Models/UserDefaultsStore.swift +++ b/Shared/Models/UserDefaultsStore.swift @@ -19,6 +19,8 @@ class UserDefaultsStore { case moodTint case personalityPack case customWidget + case customMoodTint + case customMoodTintUpdateNumber case contentViewCurrentSelectedHeaderViewBackDays case contentViewHeaderTag @@ -173,5 +175,29 @@ class UserDefaultsStore { fatalError("error saving") } } + + static func getCustomMoodTint() -> SavedMoodTint { + if let data = GroupUserDefaults.groupDefaults.object(forKey: UserDefaultsStore.Keys.customMoodTint.rawValue) as? Data{ + do { + let model = try JSONDecoder().decode(SavedMoodTint.self, from: data) + return model + } catch { + print(error) + } + } + return SavedMoodTint() + } + + @discardableResult + static func saveCustomMoodTint(customTint: SavedMoodTint) -> SavedMoodTint { + do { + let data = try JSONEncoder().encode(customTint) + GroupUserDefaults.groupDefaults.set(data, forKey: UserDefaultsStore.Keys.customMoodTint.rawValue) + return UserDefaultsStore.getCustomMoodTint() + } catch { + print(error) + fatalError("error saving") + } + } } diff --git a/Shared/Persisence/PersistenceGET.swift b/Shared/Persisence/PersistenceGET.swift index 425945d..36f0742 100644 --- a/Shared/Persisence/PersistenceGET.swift +++ b/Shared/Persisence/PersistenceGET.swift @@ -25,7 +25,7 @@ extension PersistenceController { public func getData(startDate: Date, endDate: Date, includedDays: [Int]) -> [MoodEntry] { try! viewContext.setQueryGenerationFrom(.current) - viewContext.refreshAllObjects() +// viewContext.refreshAllObjects() var includedDays16 = [Int16]() diff --git a/Shared/views/CustomizeView/CustomizeView.swift b/Shared/views/CustomizeView/CustomizeView.swift index 4b57b80..557b645 100644 --- a/Shared/views/CustomizeView/CustomizeView.swift +++ b/Shared/views/CustomizeView/CustomizeView.swift @@ -9,10 +9,17 @@ import SwiftUI struct CustomizeView: View { @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system + @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.personalityPack.rawValue, store: GroupUserDefaults.groupDefaults) private var personalityPack: PersonalityPack = .Default + @AppStorage(UserDefaultsStore.Keys.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0 + + @StateObject private var customMoodTint = UserDefaultsStore.getCustomMoodTint() + class StupidAssCustomWidgetObservableObject: ObservableObject { @Published var fuckingWrapped: CustomWidgetModel? = nil @Published var showFuckingSheet = false @@ -28,12 +35,6 @@ struct CustomizeView: View { var body: some View { ScrollView { VStack { - Text(String(localized: "customize_view_title")) - .font(.title) - .foregroundColor(theme.currentTheme.labelColor) - .padding([.trailing, .leading], 55) - .padding([.top], 15) - createCustomWidget changeIcon themePicker @@ -58,11 +59,6 @@ struct CustomizeView: View { ZStack { theme.currentTheme.secondaryBGColor VStack { - Text(String(localized: "customize_view_view_change_icon")) - .font(.body) - .foregroundColor(theme.currentTheme.labelColor) - .padding(.top) - ScrollView(.horizontal) { HStack { Button(action: { @@ -102,10 +98,6 @@ struct CustomizeView: View { ZStack { theme.currentTheme.secondaryBGColor VStack { - Text(String(localized: "customize_view_background_title")) - .font(.body) - .foregroundColor(theme.currentTheme.labelColor) - HStack { Spacer() ForEach(Theme.allCases, id:\.rawValue) { aTheme in @@ -143,10 +135,6 @@ struct CustomizeView: View { ZStack { theme.currentTheme.secondaryBGColor VStack { - Text(String(localized: "customize_view_custom_widget_title")) - .font(.body) - .foregroundColor(theme.currentTheme.labelColor) - .padding(.top) ScrollView(.horizontal) { HStack { ForEach(UserDefaultsStore.getCustomWidgets(), id: \.uuid) { widget in @@ -173,6 +161,9 @@ struct CustomizeView: View { .background(RoundedRectangle(cornerRadius: 10).fill().foregroundColor(theme.currentTheme.bgColor)) .padding() .cornerRadius(10) + + Text("[How to add widget](https://support.apple.com/guide/iphone/add-widgets-iphb8f1bf206/ios)") + .padding(.bottom) } } .fixedSize(horizontal: false, vertical: true) @@ -227,7 +218,7 @@ struct CustomizeView: View { ZStack { theme.currentTheme.secondaryBGColor VStack { - ForEach(MoodTints.allCases, id: \.rawValue) { tint in + ForEach(MoodTints.defaultOptions, id: \.rawValue) { tint in HStack { ForEach(Mood.allValues, id: \.self) { mood in Circle() @@ -250,10 +241,68 @@ struct CustomizeView: View { impactMed.impactOccurred() moodTint = tint } - if tint.rawValue != (MoodTints.allCases.sorted(by: { $0.rawValue > $1.rawValue }).first?.rawValue) ?? 0 { - Divider() - } + Divider() } + + ZStack { + Color.clear + + Rectangle() + .frame(height: 35) + .frame(minWidth: 0, maxWidth: .infinity) + .foregroundColor(.clear) + .contentShape(Rectangle()) + .onTapGesture { + moodTint = .Custom + let impactMed = UIImpactFeedbackGenerator(style: .heavy) + impactMed.impactOccurred() + } + + HStack { + ColorPicker("", selection: $customMoodTint.colorOne) + .onChange(of: customMoodTint.colorOne, perform: { _ in + saveCustomMoodTint() + }) + .labelsHidden() + .frame(minWidth: 0, maxWidth: .infinity) + + ColorPicker("", selection: $customMoodTint.colorTwo) + .labelsHidden() + .frame(minWidth: 0, maxWidth: .infinity) + .onChange(of: customMoodTint.colorTwo, perform: { _ in + saveCustomMoodTint() + }) + + ColorPicker("", selection: $customMoodTint.colorThree) + .labelsHidden() + .frame(minWidth: 0, maxWidth: .infinity) + .onChange(of: customMoodTint.colorThree, perform: { _ in + saveCustomMoodTint() + }) + + ColorPicker("", selection: $customMoodTint.colorFour) + .labelsHidden() + .frame(minWidth: 0, maxWidth: .infinity) + .onChange(of: customMoodTint.colorFour, perform: { _ in + saveCustomMoodTint() + }) + + ColorPicker("", selection: $customMoodTint.colorFive) + .labelsHidden() + .frame(minWidth: 0, maxWidth: .infinity) + .onChange(of: customMoodTint.colorFive, perform: { _ in + saveCustomMoodTint() + }) + } + .background( + Color.clear + ) + } + .background( + RoundedRectangle(cornerRadius: 10, style: .continuous) + .fill(moodTint == .Custom ? theme.currentTheme.bgColor : .clear) + .padding([.top, .bottom], -3) + ) } .padding() } @@ -261,6 +310,12 @@ struct CustomizeView: View { .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } + private func saveCustomMoodTint() { + UserDefaultsStore.saveCustomMoodTint(customTint: customMoodTint) + moodTint = .Custom + customMoodTintUpdateNumber += 1 + } + private var pickPeronsalityPack: some View { ZStack { theme.currentTheme.secondaryBGColor @@ -303,9 +358,3 @@ struct CustomizeView: View { .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } } - -struct CustomizeView_Previews: PreviewProvider { - static var previews: some View { - CustomizeView() - } -} diff --git a/Shared/views/HomeView/HomeView.swift b/Shared/views/HomeView/HomeView.swift index 2e74d2f..0e64e95 100644 --- a/Shared/views/HomeView/HomeView.swift +++ b/Shared/views/HomeView/HomeView.swift @@ -124,7 +124,7 @@ struct HomeView: View { Spacer() } .opacity(headerOpacity) - + VStack { SmallRollUpHeaderView(entries: getBackEntries(), viewType: $currentSelectedHeaderViewViewType) @@ -134,14 +134,13 @@ struct HomeView: View { theme.currentTheme.secondaryBGColor ) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) - + Spacer() } .opacity(1 - headerOpacity) } .frame(height: headerHeight + 20) - listView .padding(.top, -25) } @@ -200,7 +199,7 @@ struct HomeView: View { .frame(height: headerHeight) .frame(minWidth: 0, maxWidth: .infinity) .contentShape(Rectangle()) - + SwitchableView(daysBack: 7, viewType: $secondSwichableHeaderViewType, headerTypeChanged: { viewType in @@ -218,7 +217,7 @@ struct HomeView: View { currentSelectedHeaderViewBackDays = 30 currentSelectedHeaderViewViewType = firstSwichableHeaderViewType } - + if value == 2 { currentSelectedHeaderViewBackDays = 7 currentSelectedHeaderViewViewType = secondSwichableHeaderViewType diff --git a/Shared/views/MonthView/MonthView.swift b/Shared/views/MonthView/MonthView.swift index 78bafa2..7497a60 100644 --- a/Shared/views/MonthView/MonthView.swift +++ b/Shared/views/MonthView/MonthView.swift @@ -11,8 +11,11 @@ struct MonthView: View { @AppStorage(UserDefaultsStore.Keys.needsOnboarding.rawValue, store: GroupUserDefaults.groupDefaults) private var needsOnboarding = true @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.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0 + @ObservedObject var viewModel = HomeViewViewModel(addMonthStartWeekdayPadding: true) @StateObject private var selectedDetail = StupidAssDetailViewObservableObject() @@ -125,10 +128,14 @@ extension MonthView { // view that make up the list body extension MonthView { private func homeViewTwoSectionHeaderView(month: Int, year: Int) -> some View { - Text("\(Random.monthName(fromMonthInt: month)) \(String(year))") - .font(.body) - .foregroundColor(theme.currentTheme.labelColor) - .frame(maxWidth: .infinity, alignment: .leading) + ZStack { + Text("\(Random.monthName(fromMonthInt: month)) \(String(year))") + .font(.body) + .foregroundColor(theme.currentTheme.labelColor) + .frame(maxWidth: .infinity, alignment: .leading) + Text(String(customMoodTintUpdateNumber)) + .hidden() + } } private func homeViewTwoMonthListView(month: Int, year: Int, entries: [MoodEntry]) -> some View { From 39a974bdf491b9689ff6f300ab49e3f5c7ab7eaf Mon Sep 17 00:00:00 2001 From: Trey t Date: Wed, 2 Mar 2022 16:28:45 -0600 Subject: [PATCH 2/7] add code to create darker custom colors --- Shared/Models/MoodTintable.swift | 10 ++++----- Shared/Random.swift | 38 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/Shared/Models/MoodTintable.swift b/Shared/Models/MoodTintable.swift index 20b9607..0ebcc00 100644 --- a/Shared/Models/MoodTintable.swift +++ b/Shared/Models/MoodTintable.swift @@ -123,15 +123,15 @@ final class CustomMoodTint: MoodTintable { static func secondary(forMood mood: Mood) -> Color { switch mood { case .horrible: - return UserDefaultsStore.getCustomMoodTint().colorFive + return UserDefaultsStore.getCustomMoodTint().colorFive.darker(by: 40) case .bad: - return UserDefaultsStore.getCustomMoodTint().colorFour + return UserDefaultsStore.getCustomMoodTint().colorFour.darker(by: 40) case .average: - return UserDefaultsStore.getCustomMoodTint().colorThree + return UserDefaultsStore.getCustomMoodTint().colorThree.darker(by: 40) case .good: - return UserDefaultsStore.getCustomMoodTint().colorTwo + return UserDefaultsStore.getCustomMoodTint().colorTwo.darker(by: 40) case .great: - return UserDefaultsStore.getCustomMoodTint().colorOne + return UserDefaultsStore.getCustomMoodTint().colorOne.darker(by: 40) case .missing: return Color(uiColor: UIColor.lightGray) case .placeholder: diff --git a/Shared/Random.swift b/Shared/Random.swift index 099e5e9..1d9d0e4 100644 --- a/Shared/Random.swift +++ b/Shared/Random.swift @@ -132,6 +132,9 @@ extension Color { blue: .random(in: 0...1) ) } + + public func lighter(by amount: CGFloat = 0.2) -> Self { Self(UIColor(self).lighter(by: amount)) } + public func darker(by amount: CGFloat = 0.2) -> Self { Self(UIColor(self).darker(by: amount)) } } extension String { @@ -151,3 +154,38 @@ extension String { return image ?? UIImage() } } + +extension UIColor { + + func lighter(by percentage: CGFloat = 10.0) -> UIColor { + return self.adjust(by: abs(percentage)) + } + + func darker(by percentage: CGFloat = 10.0) -> UIColor { + return self.adjust(by: -abs(percentage)) + } + + func adjust(by percentage: CGFloat) -> UIColor { + var alpha, hue, saturation, brightness, red, green, blue, white : CGFloat + (alpha, hue, saturation, brightness, red, green, blue, white) = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) + + let multiplier = percentage / 100.0 + + if self.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) { + let newBrightness: CGFloat = max(min(brightness + multiplier*brightness, 1.0), 0.0) + return UIColor(hue: hue, saturation: saturation, brightness: newBrightness, alpha: alpha) + } + else if self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) { + let newRed: CGFloat = min(max(red + multiplier*red, 0.0), 1.0) + let newGreen: CGFloat = min(max(green + multiplier*green, 0.0), 1.0) + let newBlue: CGFloat = min(max(blue + multiplier*blue, 0.0), 1.0) + return UIColor(red: newRed, green: newGreen, blue: newBlue, alpha: alpha) + } + else if self.getWhite(&white, alpha: &alpha) { + let newWhite: CGFloat = (white + multiplier*white) + return UIColor(white: newWhite, alpha: alpha) + } + + return self + } +} From 746337b6a265eac2d24cb53683da830707f88a18 Mon Sep 17 00:00:00 2001 From: Trey t Date: Wed, 2 Mar 2022 17:25:06 -0600 Subject: [PATCH 3/7] update top header graph view when custom color changes code cleanup --- Shared/FeelsApp.swift | 4 +-- Shared/Persisence/Persistence.swift | 26 ++++++++++------ Shared/Persisence/PersistenceADD.swift | 2 +- Shared/Persisence/PersistenceDELETE.swift | 4 +-- Shared/Persisence/PersistenceHelper.swift | 31 ++++++++++--------- Shared/Persisence/PersistenceUPDATE.swift | 2 +- Shared/views/HeaderStatsView.swift | 16 +++++++--- Shared/views/HomeView/HomeView.swift | 13 +++++--- Shared/views/HomeView/HomeViewViewModel.swift | 16 +++++----- Shared/views/MainTabView.swift | 1 - Shared/views/MonthView/MonthView.swift | 7 ++--- Shared/views/SettingsView/SettingsView.swift | 14 ++------- .../CurrentStreakTemplate.swift | 1 - .../LongestStreakTemplate.swift | 1 - Shared/views/SwitchableView.swift | 13 +++++++- 15 files changed, 82 insertions(+), 69 deletions(-) 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) From 348229fe6087cef7496048f39f8d0011c77712e1 Mon Sep 17 00:00:00 2001 From: Trey t Date: Thu, 3 Mar 2022 09:45:46 -0600 Subject: [PATCH 4/7] fix crash when updating an existing entry code clean up --- Shared/Persisence/Persistence.swift | 14 +++++++--- Shared/Persisence/PersistenceADD.swift | 8 +----- Shared/Persisence/PersistenceDELETE.swift | 11 +------- Shared/Persisence/PersistenceGET.swift | 1 + Shared/Persisence/PersistenceHelper.swift | 3 +- Shared/Persisence/PersistenceUPDATE.swift | 28 ++----------------- Shared/views/HomeView/HomeViewViewModel.swift | 7 ++--- 7 files changed, 20 insertions(+), 52 deletions(-) diff --git a/Shared/Persisence/Persistence.swift b/Shared/Persisence/Persistence.swift index f6d2eda..e178bf2 100644 --- a/Shared/Persisence/Persistence.swift +++ b/Shared/Persisence/Persistence.swift @@ -59,12 +59,18 @@ class PersistenceController { editedDataClosure.append(closure) } - public func runDataListeners() { - for closure in editedDataClosure { - closure() + public func saveAndRunDataListerners() { + do { + try viewContext.save() + + for closure in editedDataClosure { + closure() + } + } catch { + print(error) } } - + private func setupContainer() -> NSPersistentContainer { if useCloudKit { container = NSPersistentCloudKitContainer(name: "Feels") diff --git a/Shared/Persisence/PersistenceADD.swift b/Shared/Persisence/PersistenceADD.swift index cbd516d..b8a8897 100644 --- a/Shared/Persisence/PersistenceADD.swift +++ b/Shared/Persisence/PersistenceADD.swift @@ -23,13 +23,7 @@ extension PersistenceController { newItem.canDelete = true newItem.entryType = Int16(entryType.rawValue) - do { - try viewContext.save() - runDataListeners() - } catch { - let nsError = error as NSError - fatalError("Unresolved error \(nsError), \(nsError.userInfo)") - } + saveAndRunDataListerners() } func fillInMissingDates() { diff --git a/Shared/Persisence/PersistenceDELETE.swift b/Shared/Persisence/PersistenceDELETE.swift index 4699a79..cc1550f 100644 --- a/Shared/Persisence/PersistenceDELETE.swift +++ b/Shared/Persisence/PersistenceDELETE.swift @@ -14,18 +14,9 @@ extension PersistenceController { do { try viewContext.executeAndMergeChanges(using: deleteRequest) - try viewContext.save() - runDataListeners() + saveAndRunDataListerners() } catch let error as NSError { fatalError("Unresolved error \(error), \(error.userInfo)") } } - - func delete(forDate: Date) { - if let entry = PersistenceController.shared.getEntry(byDate: forDate) { - viewContext.delete(entry) - try! viewContext.save() - runDataListeners() - } - } } diff --git a/Shared/Persisence/PersistenceGET.swift b/Shared/Persisence/PersistenceGET.swift index 36f0742..98e3497 100644 --- a/Shared/Persisence/PersistenceGET.swift +++ b/Shared/Persisence/PersistenceGET.swift @@ -79,6 +79,7 @@ extension PersistenceController { let items = PersistenceController.shared.getData(startDate: startDateOfMonth, endDate: startDateOfMonth.endOfMonth, includedDays: [1,2,3,4,5,6,7]) + if !items.isEmpty { allMonths[month] = items } diff --git a/Shared/Persisence/PersistenceHelper.swift b/Shared/Persisence/PersistenceHelper.swift index b50bfc6..85b6722 100644 --- a/Shared/Persisence/PersistenceHelper.swift +++ b/Shared/Persisence/PersistenceHelper.swift @@ -75,8 +75,7 @@ extension PersistenceController { newItem.weekDay = Int16(Calendar.current.component(.weekday, from: date)) } - try viewContext.save() - runDataListeners() + saveAndRunDataListerners() } 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 9d9dea9..4babc10 100644 --- a/Shared/Persisence/PersistenceUPDATE.swift +++ b/Shared/Persisence/PersistenceUPDATE.swift @@ -10,34 +10,12 @@ import Foundation extension PersistenceController { @discardableResult public func update(entryDate: Date, withModd mood: Mood) -> Bool { - do { - if let entry = PersistenceController.shared.getEntry(byDate: entryDate) { - viewContext.delete(entry) - } - - try viewContext.save() - } 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. - let nsError = error as NSError - fatalError("Unresolved error \(nsError), \(nsError.userInfo)") + guard let existingEntry = getEntry(byDate: entryDate) else { return false } - - - do { - add(mood: mood, forDate: entryDate, entryType: .listView) - try viewContext.save() - } 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. - let nsError = error as NSError - fatalError("Unresolved error \(nsError), \(nsError.userInfo)") - return false - } - - runDataListeners() + existingEntry.setValue(mood.rawValue, forKey: "moodValue") + saveAndRunDataListerners() return true } } diff --git a/Shared/views/HomeView/HomeViewViewModel.swift b/Shared/views/HomeView/HomeViewViewModel.swift index c2be984..708fe14 100644 --- a/Shared/views/HomeView/HomeViewViewModel.swift +++ b/Shared/views/HomeView/HomeViewViewModel.swift @@ -52,12 +52,11 @@ class HomeViewViewModel: ObservableObject { } private func getGroupedData(addMonthStartWeekdayPadding: Bool) { - grouped = PersistenceController.shared.splitIntoYearMonth() - + var newStuff = PersistenceController.shared.splitIntoYearMonth() if addMonthStartWeekdayPadding { - grouped = MoodEntryFunctions.padMoodEntriesForCalendar(entries: grouped) + newStuff = MoodEntryFunctions.padMoodEntriesForCalendar(entries: grouped) } -// + grouped = newStuff numberOfItems = numberOfEntries } From 29bae8008c98100a356e2f2301af762f0dfa53a6 Mon Sep 17 00:00:00 2001 From: Trey t Date: Thu, 3 Mar 2022 09:51:30 -0600 Subject: [PATCH 5/7] fix month view being nil --- Shared/views/HomeView/HomeViewViewModel.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Shared/views/HomeView/HomeViewViewModel.swift b/Shared/views/HomeView/HomeViewViewModel.swift index 708fe14..718edcf 100644 --- a/Shared/views/HomeView/HomeViewViewModel.swift +++ b/Shared/views/HomeView/HomeViewViewModel.swift @@ -54,14 +54,12 @@ class HomeViewViewModel: ObservableObject { private func getGroupedData(addMonthStartWeekdayPadding: Bool) { var newStuff = PersistenceController.shared.splitIntoYearMonth() if addMonthStartWeekdayPadding { - newStuff = MoodEntryFunctions.padMoodEntriesForCalendar(entries: grouped) + newStuff = MoodEntryFunctions.padMoodEntriesForCalendar(entries: newStuff) } grouped = newStuff numberOfItems = numberOfEntries } - - public func updateData() { getGroupedData(addMonthStartWeekdayPadding: self.addMonthStartWeekdayPadding) } From c83697cfb2b0c035400bc5dbbbf7de6b228f1ebd Mon Sep 17 00:00:00 2001 From: Trey t Date: Thu, 3 Mar 2022 09:59:16 -0600 Subject: [PATCH 6/7] fix weird stuttering bug with month view --- Shared/views/MonthView/MonthView.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Shared/views/MonthView/MonthView.swift b/Shared/views/MonthView/MonthView.swift index 6908baf..daa5456 100644 --- a/Shared/views/MonthView/MonthView.swift +++ b/Shared/views/MonthView/MonthView.swift @@ -49,7 +49,7 @@ struct MonthView: View { } } else { ScrollView { - LazyVStack(spacing: 5, pinnedViews: [.sectionHeaders]) { + VStack(spacing: 5) { ForEach(viewModel.grouped.sorted(by: { $0.key < $1.key }), id: \.key) { year, months in // for reach month @@ -73,10 +73,9 @@ struct MonthView: View { onDismiss: didDismiss) { selectedDetail.fuckingWrapped } - .edgesIgnoringSafeArea(.top) } } - .padding(.top) + .padding([.top, .bottom]) .background( theme.currentTheme.bg .edgesIgnoringSafeArea(.all) From f5966a57b3a4e4ff5e0ff10c48f5a35a8478b30a Mon Sep 17 00:00:00 2001 From: Trey t Date: Thu, 3 Mar 2022 10:05:11 -0600 Subject: [PATCH 7/7] fix missing color and update icon --- Shared/Models/MoodImagable.swift | 8 ++++---- Shared/Models/MoodTintable.swift | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Shared/Models/MoodImagable.swift b/Shared/Models/MoodImagable.swift index b10b6ab..3bf0e0d 100644 --- a/Shared/Models/MoodImagable.swift +++ b/Shared/Models/MoodImagable.swift @@ -75,9 +75,9 @@ final class EmojiMoodImages: MoodImagable { case .great: return Image(uiImage: "😀".textToImage()!) case .missing: - return Image(uiImage: "X".textToImage()!) + return Image("missing", bundle: .main) case .placeholder: - return Image(uiImage: "X".textToImage()!) + return Image("missing", bundle: .main) } } } @@ -96,9 +96,9 @@ final class HandEmojiMoodImages: MoodImagable { case .great: return Image(uiImage: "🙏".textToImage()!) case .missing: - return Image(uiImage: "X".textToImage()!) + return Image("missing", bundle: .main) case .placeholder: - return Image(uiImage: "X".textToImage()!) + return Image("missing", bundle: .main) } } } diff --git a/Shared/Models/MoodTintable.swift b/Shared/Models/MoodTintable.swift index 0ebcc00..c8620fb 100644 --- a/Shared/Models/MoodTintable.swift +++ b/Shared/Models/MoodTintable.swift @@ -133,9 +133,9 @@ final class CustomMoodTint: MoodTintable { case .great: return UserDefaultsStore.getCustomMoodTint().colorOne.darker(by: 40) case .missing: - return Color(uiColor: UIColor.lightGray) + return Color(uiColor: UIColor.lightGray).darker(by: 40) case .placeholder: - return Color(uiColor: UIColor.lightGray) + return Color(uiColor: UIColor.lightGray).darker(by: 40) } } }