annotate Simoleon/Conversion.swift @ 25:933d9ab04374

Fixes Cloudkit sync
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Tue, 20 Jul 2021 12:23:32 +0100
parents bda6a55d027a
children d95582268b44
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 //
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
2 // Conversion.swift
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
3 // Simoleon
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
4 //
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
5 // Created by Dennis Concepción Martín on 18/07/2021.
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
6 //
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
7
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
8 import SwiftUI
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
9
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
10 struct Conversion: View {
24
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
11 var fetchUserSettings: Bool
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
12 @State var currencyPair: String
23
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
13
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
14 @State private var amountToConvert = "1000"
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
15 @State private var price: Double = 1.00
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
16 @State private var showingConversion = false
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
17 @State private var showingCurrencySelector = false
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
18 @State private var isEditing = false
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
19
24
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
20 @Environment(\.managedObjectContext) private var viewContext
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
21 @FetchRequest(sortDescriptors: []) private var userSettings: FetchedResults<UserSettings>
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
22 let currencyMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
23
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
24 var body: some View {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
25 ScrollView(showsIndicators: false) {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
26 VStack(alignment: .leading) {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
27 HStack {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
28 Button(action: { showingCurrencySelector = true }) {
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
29 RoundedRectangle(cornerRadius: 25)
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
30 .foregroundColor(Color(.secondarySystemBackground))
22
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
31 .frame(height: 65)
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
32 .overlay(CurrencyRow(currencyPair: currencyPair).padding(.horizontal))
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
33 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
34
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
35 FavouriteButton(currencyPair: currencyPair)
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
36 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
37
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
38 ConversionBox(
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
39 currencyPair: $currencyPair,
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
40 amountToConvert: $amountToConvert,
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
41 price: $price,
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
42 showingConversion: $showingConversion,
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
43 showingCurrencySelector: $showingCurrencySelector,
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
44 isEditing: $isEditing
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
45 )
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
46 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
47 .padding()
23
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
48 .onAppear {
24
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
49 if fetchUserSettings {
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
50 fetchingUserSettings()
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
51 }
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
52
23
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
53 request(currencyPair)
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
54 }
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
55 .onChange(of: showingCurrencySelector, perform: { showingCurrencySelector in
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
56 if !showingCurrencySelector {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
57 request(currencyPair)
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
58 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
59 })
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
60 .sheet(isPresented: $showingCurrencySelector) {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
61 CurrencySelector(currencyPair: $currencyPair, showingCurrencySelector: $showingCurrencySelector)
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
62 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
63 }
22
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
64 .navigationTitle("Conversion")
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
65 .toolbar {
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
66 ToolbarItem(placement: .cancellationAction) {
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
67 if isEditing {
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
68 Button("Cancel", action: {
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
69 UIApplication.shared.dismissKeyboard()
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
70 isEditing = false
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
71 })
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
72 }
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
73 }
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
74 }
24
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
75 .if(UIDevice.current.userInterfaceIdiom == .phone && fetchUserSettings) { content in
22
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
76 NavigationView { content }
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
77 }
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
78 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
79
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
80 private func request(_ currencyPair: String) {
22
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
81 let url = "\(readConfig("API_URL")!)quotes?pairs=\(currencyPair)&api_key=\(readConfig("API_KEY")!)"
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
82
22
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
83 Simoleon.request(url: url, model: [CurrencyQuoteModel].self) { response in
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
84 self.showingConversion = false
22
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
85 if let price = response.first?.price {
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
86 self.price = price
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
87 self.showingConversion = true
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
88 } else {
22
3596690dda73 Add Config files and implementing Settings
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 21
diff changeset
89 // Handle error
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
90 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
91 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
92 }
23
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
93
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
94 /*
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
95 1) Fetch default currency from User Settings
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
96 2) Change State var currencyPair
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
97 */
24
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
98 private func fetchingUserSettings() {
23
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
99 if let userSettings = userSettings.first {
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
100 self.currencyPair = userSettings.defaultCurrency ?? "USD/GBP"
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
101 }
699b5bb619db UserSettings CoreData implemented
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 22
diff changeset
102 }
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
103 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
104
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
105
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
106 struct Conversion_Previews: PreviewProvider {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
107 static var previews: some View {
24
bda6a55d027a Add Conversion to Favourites
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 23
diff changeset
108 Conversion(fetchUserSettings: true, currencyPair: "USD/GBP")
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
109 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
110 }