Mercurial > public > simoleon
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