changeset 27:d95582268b44

Fix bug CoreData and minor UI changes
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Wed, 21 Jul 2021 12:36:10 +0100
parents 337816652bfe
children 4f862c618b44
files Simoleon.xcodeproj/project.pbxproj Simoleon.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate Simoleon/Conversion.swift Simoleon/Favourites.swift Simoleon/Helpers/FavouriteButton.swift Simoleon/Models/DefaultCurrency+CoreDataClass.swift Simoleon/Models/DefaultCurrency+CoreDataProperties.swift Simoleon/Models/UserSettings+CoreDataClass.swift Simoleon/Models/UserSettings+CoreDataProperties.swift Simoleon/Settings.swift Simoleon/Simoleon.xcdatamodeld/Simoleon.xcdatamodel/contents
diffstat 11 files changed, 88 insertions(+), 86 deletions(-) [+]
line wrap: on
line diff
--- a/Simoleon.xcodeproj/project.pbxproj	Tue Jul 20 12:23:37 2021 +0100
+++ b/Simoleon.xcodeproj/project.pbxproj	Wed Jul 21 12:36:10 2021 +0100
@@ -7,13 +7,13 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		950A377726A820F800CAB175 /* DefaultCurrency+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950A377626A820F400CAB175 /* DefaultCurrency+CoreDataProperties.swift */; };
+		950A377826A820F800CAB175 /* DefaultCurrency+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950A377526A820F400CAB175 /* DefaultCurrency+CoreDataClass.swift */; };
 		9555933A269B0AB8000FD726 /* ParseJson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95559339269B0AB8000FD726 /* ParseJson.swift */; };
 		9555933D269B0E0A000FD726 /* CurrencyMetadata.json in Resources */ = {isa = PBXBuildFile; fileRef = 9555933C269B0E0A000FD726 /* CurrencyMetadata.json */; };
 		957065E226A5FE0400523E68 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 957065E126A5FE0400523E68 /* Settings.swift */; };
 		9585BB1226A6B71B00E3193E /* ReadConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9585BB1126A6B71B00E3193E /* ReadConfig.swift */; };
 		9585BB1426A6B7F400E3193E /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9585BB1326A6B7F400E3193E /* Request.swift */; };
-		9585BB1726A6BEA600E3193E /* UserSettings+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9585BB1526A6BEA600E3193E /* UserSettings+CoreDataClass.swift */; };
-		9585BB1826A6BEA600E3193E /* UserSettings+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9585BB1626A6BEA600E3193E /* UserSettings+CoreDataProperties.swift */; };
 		9585BB1A26A6E8FD00E3193E /* SimpleSuccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9585BB1926A6E8FD00E3193E /* SimpleSuccess.swift */; };
 		95AEBC9526A03ECB00613729 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AEBC9426A03ECB00613729 /* ContentView.swift */; };
 		95AEBC9B26A04A4200613729 /* CurrencyMetadataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AEBC9A26A04A4200613729 /* CurrencyMetadataModel.swift */; };
@@ -60,6 +60,8 @@
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
+		950A377526A820F400CAB175 /* DefaultCurrency+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DefaultCurrency+CoreDataClass.swift"; sourceTree = "<group>"; };
+		950A377626A820F400CAB175 /* DefaultCurrency+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DefaultCurrency+CoreDataProperties.swift"; sourceTree = "<group>"; };
 		95559339269B0AB8000FD726 /* ParseJson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseJson.swift; sourceTree = "<group>"; };
 		9555933C269B0E0A000FD726 /* CurrencyMetadata.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = CurrencyMetadata.json; sourceTree = "<group>"; };
 		957065E126A5FE0400523E68 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = "<group>"; };
@@ -67,8 +69,6 @@
 		9585BB1026A6B5ED00E3193E /* ConfigTemplate.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ConfigTemplate.xcconfig; sourceTree = "<group>"; };
 		9585BB1126A6B71B00E3193E /* ReadConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadConfig.swift; sourceTree = "<group>"; };
 		9585BB1326A6B7F400E3193E /* Request.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = "<group>"; };
-		9585BB1526A6BEA600E3193E /* UserSettings+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserSettings+CoreDataClass.swift"; sourceTree = "<group>"; };
-		9585BB1626A6BEA600E3193E /* UserSettings+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserSettings+CoreDataProperties.swift"; sourceTree = "<group>"; };
 		9585BB1926A6E8FD00E3193E /* SimpleSuccess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleSuccess.swift; sourceTree = "<group>"; };
 		95AEBC9426A03ECB00613729 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
 		95AEBC9A26A04A4200613729 /* CurrencyMetadataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyMetadataModel.swift; sourceTree = "<group>"; };
@@ -133,8 +133,8 @@
 		95559331269B094A000FD726 /* Models */ = {
 			isa = PBXGroup;
 			children = (
-				9585BB1526A6BEA600E3193E /* UserSettings+CoreDataClass.swift */,
-				9585BB1626A6BEA600E3193E /* UserSettings+CoreDataProperties.swift */,
+				950A377526A820F400CAB175 /* DefaultCurrency+CoreDataClass.swift */,
+				950A377626A820F400CAB175 /* DefaultCurrency+CoreDataProperties.swift */,
 				95C5179A26A5EFBE00BC2B24 /* Favourite+CoreDataClass.swift */,
 				95C5179B26A5EFBE00BC2B24 /* Favourite+CoreDataProperties.swift */,
 				95AEBC9A26A04A4200613729 /* CurrencyMetadataModel.swift */,
@@ -396,18 +396,18 @@
 			files = (
 				95C5179926A5EC9F00BC2B24 /* FavouriteButton.swift in Sources */,
 				95C5179C26A5EFBE00BC2B24 /* Favourite+CoreDataClass.swift in Sources */,
+				950A377826A820F800CAB175 /* DefaultCurrency+CoreDataClass.swift in Sources */,
 				95C5B2312697752700941585 /* Persistence.swift in Sources */,
 				9585BB1226A6B71B00E3193E /* ReadConfig.swift in Sources */,
 				95AEBC9526A03ECB00613729 /* ContentView.swift in Sources */,
 				95AEBC9B26A04A4200613729 /* CurrencyMetadataModel.swift in Sources */,
+				950A377726A820F800CAB175 /* DefaultCurrency+CoreDataProperties.swift in Sources */,
 				9585BB1A26A6E8FD00E3193E /* SimpleSuccess.swift in Sources */,
 				9555933A269B0AB8000FD726 /* ParseJson.swift in Sources */,
 				95C5179D26A5EFBE00BC2B24 /* Favourite+CoreDataProperties.swift in Sources */,
 				95C5179F26A5F34200BC2B24 /* Favourites.swift in Sources */,
 				95C5B2282697752600941585 /* SimoleonApp.swift in Sources */,
 				95B54F4A26A4A450001DC0D8 /* ConversionBox.swift in Sources */,
-				9585BB1826A6BEA600E3193E /* UserSettings+CoreDataProperties.swift in Sources */,
-				9585BB1726A6BEA600E3193E /* UserSettings+CoreDataClass.swift in Sources */,
 				95C517A126A5F6C000BC2B24 /* ResignKeyboard.swift in Sources */,
 				95AEBC9D26A04D4600613729 /* CurrencyRow.swift in Sources */,
 				95AEBCA326A0900E00613729 /* CurrencyQuoteModel.swift in Sources */,
@@ -579,7 +579,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = Simoleon/Simoleon.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 5;
 				DEVELOPMENT_ASSET_PATHS = "\"Simoleon/Preview Content\"";
 				DEVELOPMENT_TEAM = MTX83R5H8X;
 				ENABLE_PREVIEWS = YES;
@@ -604,7 +604,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = Simoleon/Simoleon.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 5;
 				DEVELOPMENT_ASSET_PATHS = "\"Simoleon/Preview Content\"";
 				DEVELOPMENT_TEAM = MTX83R5H8X;
 				ENABLE_PREVIEWS = YES;
Binary file Simoleon.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed
--- a/Simoleon/Conversion.swift	Tue Jul 20 12:23:37 2021 +0100
+++ b/Simoleon/Conversion.swift	Wed Jul 21 12:36:10 2021 +0100
@@ -18,7 +18,7 @@
     @State private var isEditing = false
     
     @Environment(\.managedObjectContext) private var viewContext
-    @FetchRequest(sortDescriptors: []) private var userSettings: FetchedResults<UserSettings>
+    @FetchRequest(sortDescriptors: []) private var defaultCurrency: FetchedResults<DefaultCurrency>
     let currencyMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
     
     var body: some View {
@@ -26,9 +26,9 @@
             VStack(alignment: .leading) {
                 HStack {
                     Button(action: { showingCurrencySelector = true }) {
-                        RoundedRectangle(cornerRadius: 25)
+                        RoundedRectangle(cornerRadius: 15)
                             .foregroundColor(Color(.secondarySystemBackground))
-                            .frame(height: 65)
+                            .frame(height: 60)
                             .overlay(CurrencyRow(currencyPair: currencyPair).padding(.horizontal))
                     }
                     
@@ -96,8 +96,8 @@
      2) Change State var currencyPair
      */
     private func fetchingUserSettings() {
-        if let userSettings = userSettings.first {
-            self.currencyPair = userSettings.defaultCurrency ?? "USD/GBP"
+        if let defaultCurrency = defaultCurrency.first {
+            self.currencyPair = defaultCurrency.pair ?? "USD/GBP"
         }
     }
 }
--- a/Simoleon/Favourites.swift	Tue Jul 20 12:23:37 2021 +0100
+++ b/Simoleon/Favourites.swift	Wed Jul 21 12:36:10 2021 +0100
@@ -15,13 +15,24 @@
     private var favourite: FetchedResults<Favourite>
     
     var body: some View {
-        List {
-            ForEach(favourite) { favourite in
-                NavigationLink(destination: Conversion(fetchUserSettings: false, currencyPair: favourite.currencyPair)) {
-                    CurrencyRow(currencyPair: favourite.currencyPair)
+        VStack {
+            if favourite.isEmpty {
+                Group {
+                    Text("Tap ") + Text(Image(systemName: "star"))
+                    Text("to add a currency pair to favourites")
+                        .padding(.top, 5)
+                }
+                .foregroundColor(Color(.systemGray))
+            } else {
+                List {
+                    ForEach(favourite) { favourite in
+                        NavigationLink(destination: Conversion(fetchUserSettings: false, currencyPair: favourite.currencyPair)) {
+                            CurrencyRow(currencyPair: favourite.currencyPair)
+                        }
+                    }
+                    .onDelete(perform: removeFromFavourites)
                 }
             }
-            .onDelete(perform: removeFromFavourites)
         }
         .navigationTitle("Favourites")
         .toolbar {
--- a/Simoleon/Helpers/FavouriteButton.swift	Tue Jul 20 12:23:37 2021 +0100
+++ b/Simoleon/Helpers/FavouriteButton.swift	Wed Jul 21 12:36:10 2021 +0100
@@ -22,9 +22,9 @@
                 simpleSuccess()
             }
         }) {
-            RoundedRectangle(cornerRadius: 25)
+            RoundedRectangle(cornerRadius: 15)
                 .foregroundColor(Color(.secondarySystemBackground))
-                .frame(width: 65, height: 65)
+                .frame(width: 60, height: 60)
                 .overlay(
                     Image(systemName: generateStar())
                         .font(.system(size: 28))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Simoleon/Models/DefaultCurrency+CoreDataClass.swift	Wed Jul 21 12:36:10 2021 +0100
@@ -0,0 +1,15 @@
+//
+//  DefaultCurrency+CoreDataClass.swift
+//  Simoleon
+//
+//  Created by Dennis Concepción Martín on 21/07/2021.
+//
+//
+
+import Foundation
+import CoreData
+
+@objc(DefaultCurrency)
+public class DefaultCurrency: NSManagedObject {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Simoleon/Models/DefaultCurrency+CoreDataProperties.swift	Wed Jul 21 12:36:10 2021 +0100
@@ -0,0 +1,21 @@
+//
+//  DefaultCurrency+CoreDataProperties.swift
+//  Simoleon
+//
+//  Created by Dennis Concepción Martín on 21/07/2021.
+//
+//
+
+import Foundation
+import CoreData
+
+
+extension DefaultCurrency {
+
+    @nonobjc public class func fetchRequest() -> NSFetchRequest<DefaultCurrency> {
+        return NSFetchRequest<DefaultCurrency>(entityName: "DefaultCurrency")
+    }
+
+    @NSManaged public var pair: String?
+
+}
--- a/Simoleon/Models/UserSettings+CoreDataClass.swift	Tue Jul 20 12:23:37 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-//
-//  UserSettings+CoreDataClass.swift
-//  Simoleon
-//
-//  Created by Dennis Concepción Martín on 20/07/2021.
-//
-//
-
-import Foundation
-import CoreData
-
-@objc(UserSettings)
-public class UserSettings: NSManagedObject {
-
-}
--- a/Simoleon/Models/UserSettings+CoreDataProperties.swift	Tue Jul 20 12:23:37 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-//
-//  UserSettings+CoreDataProperties.swift
-//  Simoleon
-//
-//  Created by Dennis Concepción Martín on 20/07/2021.
-//
-//
-
-import Foundation
-import CoreData
-
-
-extension UserSettings {
-
-    @nonobjc public class func fetchRequest() -> NSFetchRequest<UserSettings> {
-        return NSFetchRequest<UserSettings>(entityName: "UserSettings")
-    }
-
-    @NSManaged public var defaultCurrency: String?
-
-}
-
-extension UserSettings : Identifiable {
-
-}
--- a/Simoleon/Settings.swift	Tue Jul 20 12:23:37 2021 +0100
+++ b/Simoleon/Settings.swift	Wed Jul 21 12:36:10 2021 +0100
@@ -9,14 +9,14 @@
 
 struct Settings: View {
     @Environment(\.managedObjectContext) private var viewContext
-    @FetchRequest(sortDescriptors: []) private var userSettings: FetchedResults<UserSettings>
-    @State private var selectedCurrencyPair = "USD/GBP"
+    @FetchRequest(sortDescriptors: []) private var defaultCurrency: FetchedResults<DefaultCurrency>
+    @State private var selectedDefaultCurrency = ""
     let currencyPairs: [String] = parseJson("CurrencyPairs.json")
     
     var body: some View {
         List {
             Section(header: Text("Preferences")) {
-                Picker("Default currency", selection: $selectedCurrencyPair) {
+                Picker("Default currency", selection: $selectedDefaultCurrency) {
                     ForEach(currencyPairs.sorted(), id: \.self) { currencyPair in
                         Text(currencyPair)
                     }
@@ -60,10 +60,7 @@
                 Link("Privacy Policy", destination: URL(string: "https://dennistech.io")!)
             }
         }
-        .onChange(of: selectedCurrencyPair, perform: { selectedCurrencyPair in
-            setDefaultCurrency()
-        })
-        .onAppear(perform: fetchUserSettings)
+        .onAppear(perform: setCurrency)
         .listStyle(InsetGroupedListStyle())
         .navigationTitle("Settings")
         .if(UIDevice.current.userInterfaceIdiom == .phone) { content in
@@ -71,28 +68,26 @@
         }
     }
     
-    /*
-     1) Fetch default currency from User Settings
-     2) Change State var currencyPair
-     */
-    private func fetchUserSettings() {
-        if let userSettings = userSettings.first {
-            self.selectedCurrencyPair = userSettings.defaultCurrency ?? "USD/GBP"
+    private func setCurrency() {
+        if selectedDefaultCurrency == "" {
+            self.selectedDefaultCurrency = defaultCurrency.first?.pair ?? "USD/GBP"
+        } else {
+            setCoreData()
         }
     }
     
-    private func setDefaultCurrency() {
-        if self.userSettings.isEmpty {  /// If it's empty -> add record
-            let userSettings = UserSettings(context: viewContext)
-            userSettings.defaultCurrency = selectedCurrencyPair
+    private func setCoreData() {
+        if self.defaultCurrency.isEmpty {  // If it's empty -> add record
+            let defaultCurrency = DefaultCurrency(context: viewContext)
+            defaultCurrency.pair = selectedDefaultCurrency
             
             do {
                 try viewContext.save()
             } catch {
                 print(error.localizedDescription)
             }
-        } else {  /// If not, update record
-            self.userSettings.first?.defaultCurrency = selectedCurrencyPair
+        } else {  // If not, update record
+            self.defaultCurrency.first?.pair = selectedDefaultCurrency
             try? viewContext.save()
         }
     }
--- a/Simoleon/Simoleon.xcdatamodeld/Simoleon.xcdatamodel/contents	Tue Jul 20 12:23:37 2021 +0100
+++ b/Simoleon/Simoleon.xcdatamodeld/Simoleon.xcdatamodel/contents	Wed Jul 21 12:36:10 2021 +0100
@@ -1,17 +1,17 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="18154" systemVersion="20F71" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithCloudKit="YES" userDefinedModelVersionIdentifier="">
+    <entity name="DefaultCurrency" representedClassName="DefaultCurrency" syncable="YES">
+        <attribute name="pair" optional="YES" attributeType="String"/>
+    </entity>
     <entity name="Favourite" representedClassName="Favourite" syncable="YES">
         <attribute name="currencyPair" optional="YES" attributeType="String"/>
     </entity>
     <entity name="Item" representedClassName="Item" syncable="YES" codeGenerationType="class">
         <attribute name="timestamp" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
     </entity>
-    <entity name="UserSettings" representedClassName="UserSettings" syncable="YES">
-        <attribute name="defaultCurrency" optional="YES" attributeType="String"/>
-    </entity>
     <elements>
         <element name="Favourite" positionX="-63" positionY="-9" width="128" height="44"/>
         <element name="Item" positionX="-63" positionY="-18" width="128" height="44"/>
-        <element name="UserSettings" positionX="-63" positionY="-9" width="128" height="44"/>
+        <element name="DefaultCurrency" positionX="-54" positionY="0" width="128" height="44"/>
     </elements>
 </model>
\ No newline at end of file