# HG changeset patch # User Dennis Concepción Martín # Date 1626771281 -3600 # Node ID 699b5bb619dbd3a1ad80cc8eab9f44e864879f78 # Parent 3596690dda73d2f4fee2f64e43c39d71443b676f UserSettings CoreData implemented diff -r 3596690dda73 -r 699b5bb619db Simoleon.xcodeproj/project.pbxproj --- 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 = ""; }; 9585BB1126A6B71B00E3193E /* ReadConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadConfig.swift; sourceTree = ""; }; 9585BB1326A6B7F400E3193E /* Request.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = ""; }; + 9585BB1526A6BEA600E3193E /* UserSettings+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserSettings+CoreDataClass.swift"; sourceTree = ""; }; + 9585BB1626A6BEA600E3193E /* UserSettings+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserSettings+CoreDataProperties.swift"; sourceTree = ""; }; 95AEBC9426A03ECB00613729 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 95AEBC9A26A04A4200613729 /* CurrencyMetadataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyMetadataModel.swift; sourceTree = ""; }; 95AEBC9C26A04D4600613729 /* CurrencyRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyRow.swift; sourceTree = ""; }; @@ -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 */, diff -r 3596690dda73 -r 699b5bb619db Simoleon.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate Binary file Simoleon.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed diff -r 3596690dda73 -r 699b5bb619db Simoleon/Conversion.swift --- 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 + @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" + } + } } diff -r 3596690dda73 -r 699b5bb619db Simoleon/Models/UserSettings+CoreDataClass.swift --- /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 { + +} diff -r 3596690dda73 -r 699b5bb619db Simoleon/Models/UserSettings+CoreDataProperties.swift --- /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 { + return NSFetchRequest(entityName: "UserSettings") + } + + @NSManaged public var defaultCurrency: String? + +} + +extension UserSettings : Identifiable { + +} diff -r 3596690dda73 -r 699b5bb619db Simoleon/Settings.swift --- 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 + @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 { diff -r 3596690dda73 -r 699b5bb619db Simoleon/Simoleon.xcdatamodeld/Simoleon.xcdatamodel/contents --- 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 @@ + + + + - + \ No newline at end of file