changeset 23:699b5bb619db

UserSettings CoreData implemented
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Tue, 20 Jul 2021 09:54:41 +0100
parents 3596690dda73
children bda6a55d027a
files Simoleon.xcodeproj/project.pbxproj Simoleon.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate Simoleon/Conversion.swift Simoleon/Models/UserSettings+CoreDataClass.swift Simoleon/Models/UserSettings+CoreDataProperties.swift Simoleon/Settings.swift Simoleon/Simoleon.xcdatamodeld/Simoleon.xcdatamodel/contents
diffstat 7 files changed, 112 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/Simoleon.xcodeproj/project.pbxproj	Tue Jul 20 09:02:51 2021 +0100
+++ b/Simoleon.xcodeproj/project.pbxproj	Tue Jul 20 09:54:41 2021 +0100
@@ -12,6 +12,8 @@
 		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 */; };
 		95AEBC9526A03ECB00613729 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AEBC9426A03ECB00613729 /* ContentView.swift */; };
 		95AEBC9B26A04A4200613729 /* CurrencyMetadataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AEBC9A26A04A4200613729 /* CurrencyMetadataModel.swift */; };
 		95AEBC9D26A04D4600613729 /* CurrencyRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AEBC9C26A04D4600613729 /* CurrencyRow.swift */; };
@@ -64,6 +66,8 @@
 		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>"; };
 		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>"; };
 		95AEBC9C26A04D4600613729 /* CurrencyRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyRow.swift; sourceTree = "<group>"; };
@@ -127,6 +131,8 @@
 		95559331269B094A000FD726 /* Models */ = {
 			isa = PBXGroup;
 			children = (
+				9585BB1526A6BEA600E3193E /* UserSettings+CoreDataClass.swift */,
+				9585BB1626A6BEA600E3193E /* UserSettings+CoreDataProperties.swift */,
 				95C5179A26A5EFBE00BC2B24 /* Favourite+CoreDataClass.swift */,
 				95C5179B26A5EFBE00BC2B24 /* Favourite+CoreDataProperties.swift */,
 				95AEBC9A26A04A4200613729 /* CurrencyMetadataModel.swift */,
@@ -396,6 +402,8 @@
 				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 */,
Binary file Simoleon.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed
--- a/Simoleon/Conversion.swift	Tue Jul 20 09:02:51 2021 +0100
+++ b/Simoleon/Conversion.swift	Tue Jul 20 09:54:41 2021 +0100
@@ -9,6 +9,9 @@
 import Alamofire
 
 struct Conversion: View {
+    @Environment(\.managedObjectContext) private var viewContext
+    @FetchRequest(sortDescriptors: []) private var userSettings: FetchedResults<UserSettings>
+    
     @State private var currencyPair = "USD/GBP"
     @State private var amountToConvert = "1000"
     @State private var price: Double = 1.00
@@ -42,7 +45,10 @@
                 )
             }
             .padding()
-            .onAppear { request(currencyPair) }
+            .onAppear {
+                fetchUserSettings()
+                request(currencyPair)
+            }
             .onChange(of: showingCurrencySelector, perform: { showingCurrencySelector in
                 if !showingCurrencySelector {
                     request(currencyPair)
@@ -81,6 +87,16 @@
             }
         }
     }
+    
+    /*
+     1) Fetch default currency from User Settings
+     2) Change State var currencyPair
+     */
+    private func fetchUserSettings() {
+        if let userSettings = userSettings.first {
+            self.currencyPair = userSettings.defaultCurrency ?? "USD/GBP"
+        }
+    }
 }
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Simoleon/Models/UserSettings+CoreDataClass.swift	Tue Jul 20 09:54:41 2021 +0100
@@ -0,0 +1,15 @@
+//
+//  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 {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Simoleon/Models/UserSettings+CoreDataProperties.swift	Tue Jul 20 09:54:41 2021 +0100
@@ -0,0 +1,25 @@
+//
+//  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 09:02:51 2021 +0100
+++ b/Simoleon/Settings.swift	Tue Jul 20 09:54:41 2021 +0100
@@ -8,8 +8,10 @@
 import SwiftUI
 
 struct Settings: View {
+    @Environment(\.managedObjectContext) private var viewContext
+    @FetchRequest(sortDescriptors: []) private var userSettings: FetchedResults<UserSettings>
+    @State private var selectedCurrencyPair = "USD/GBP"
     let currencyPairs: [String] = parseJson("CurrencyPairs.json")
-    @State private var selectedCurrencyPair = "USD/GBP"
     
     var body: some View {
         List {
@@ -19,15 +21,20 @@
                         Text(currencyPair)
                     }
                 }
+                .onChange(of: selectedCurrencyPair, perform: { selectedCurrencyPair in
+                    setDefaultCurrency()
+                })
             }
             
             Section(header: Text("Stay in touch")) {
-                HStack {
-                    Image(systemName: "heart.fill")
-                        .foregroundColor(Color(.systemRed))
-                        .imageScale(.large)
-                    
-                    Text("Rate Simoleon")
+                Link(destination: URL(string: "https://itunes.apple.com/app/id1576390953?action=write-review")!) {
+                    HStack {
+                        Image(systemName: "heart.fill")
+                            .foregroundColor(Color(.systemRed))
+                            .imageScale(.large)
+                        
+                        Text("Rate Simoleon")
+                    }
                 }
                 
                 Link(destination: URL(string: "https://dennistech.io")!) {
@@ -54,14 +61,42 @@
             Section(header: Text("About")) {
                 Link("Website", destination: URL(string: "https://dennistech.io")!)
                 Link("Privacy Policy", destination: URL(string: "https://dennistech.io")!)
+                Link("Developer's Twitter", destination: URL(string: "https://twitter.com/dennisconcep")!)
             }
         }
+        .onAppear(perform: fetchUserSettings)
         .listStyle(InsetGroupedListStyle())
         .navigationTitle("Settings")
         .if(UIDevice.current.userInterfaceIdiom == .phone) { content in
             NavigationView { content }
         }
     }
+    
+    /*
+     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 setDefaultCurrency() {
+        if self.userSettings.isEmpty {  /// If it's empty -> add record
+            let userSettings = UserSettings(context: viewContext)
+            userSettings.defaultCurrency = selectedCurrencyPair
+            
+            do {
+                try viewContext.save()
+            } catch {
+                print(error.localizedDescription)
+            }
+        } else {  /// If not, update record
+            self.userSettings.first?.defaultCurrency = selectedCurrencyPair
+            try? viewContext.save()
+        }
+    }
 }
 
 struct Settings_Previews: PreviewProvider {
--- a/Simoleon/Simoleon.xcdatamodeld/Simoleon.xcdatamodel/contents	Tue Jul 20 09:02:51 2021 +0100
+++ b/Simoleon/Simoleon.xcdatamodeld/Simoleon.xcdatamodel/contents	Tue Jul 20 09:54:41 2021 +0100
@@ -6,8 +6,12 @@
     <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="Favourite" positionX="-63" positionY="-9" width="128" height="44"/>
+        <element name="UserSettings" positionX="-63" positionY="-9" width="128" height="44"/>
     </elements>
 </model>
\ No newline at end of file