annotate Simoleon/Helpers/CurrencyConversion.swift @ 17:4a81e39186f1 v1.0

Minor UI changes
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Thu, 15 Jul 2021 20:24:13 +0100
parents aec2e86e5dbd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 //
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
2 // CurrencyConversion.swift
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
3 // Simoleon
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
4 //
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
5 // Created by Dennis Concepción Martín on 15/07/2021.
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
6 //
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
7
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
8 import SwiftUI
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
9 import Alamofire
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
10
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
11 struct CurrencyConversion: View {
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
12 var currency: String
17
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
13 @State private var price: Double = 1.00
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
14 @State private var amountToConvert = "100"
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
15 @State private var isEditing = false
17
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
16 @State private var showConversion = false
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
17 let currencyMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
18
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
19 var body: some View {
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
20 let currencies = currency.components(separatedBy: "/")
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
21 let mainCurrency = String(currencies[0])
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
22 let secondaryCurrency = String(currencies[1])
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
23
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
24 ScrollView(showsIndicators: false) {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
25 VStack(spacing: 20) {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
26 ZStack {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
27 Rectangle()
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
28 .foregroundColor(Color(.secondarySystemBackground))
15
a02f463aa906 Testing three column ipad navigation
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 14
diff changeset
29
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
30 HStack {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
31 Image(currencyMetadata[mainCurrency]!.flag)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
32 .resizable()
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
33 .aspectRatio(contentMode: .fill)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
34 .frame(width: 30, height: 30)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
35 .clipShape(Circle())
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
36 .overlay(Circle().stroke(Color(.systemGray), lineWidth: 1))
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
37
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
38 TextField("Amount", text: $amountToConvert) { startedEditing in
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
39 if startedEditing {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
40 withAnimation {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
41 isEditing = true
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
42 }
15
a02f463aa906 Testing three column ipad navigation
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 14
diff changeset
43 }
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
44 }
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
45 onCommit: {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
46 withAnimation {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
47 isEditing = false
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
48 }
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
49 }
17
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
50 .keyboardType(.decimalPad)
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
51 .lineLimit(1)
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
52 .padding(.horizontal)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
53
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
54 Text("\(mainCurrency)")
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
55 .fontWeight(.semibold)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
56 }
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
57 .padding(.horizontal)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
58 }
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
59 .frame(height: 50)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
60 .cornerRadius(13)
15
a02f463aa906 Testing three column ipad navigation
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 14
diff changeset
61
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
62 ZStack {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
63 Rectangle()
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
64 .foregroundColor(Color(.secondarySystemBackground))
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
65
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
66 HStack {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
67 Image(currencyMetadata[secondaryCurrency]!.flag)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
68 .resizable()
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
69 .aspectRatio(contentMode: .fill)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
70 .frame(width: 30, height: 30)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
71 .clipShape(Circle())
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
72 .overlay(Circle().stroke(Color(.systemGray), lineWidth: 1))
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
73
17
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
74 if showConversion {
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
75 Text("\(makeConversion(), specifier: "%.4f")")
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
76 .lineLimit(1)
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
77 .padding(.horizontal)
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
78 } else {
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
79 ProgressView()
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
80 .padding(.horizontal)
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
81 }
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
82
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
83 Spacer()
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
84 Text("\(secondaryCurrency)")
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
85 .fontWeight(.semibold)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
86 }
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
87 .padding(.horizontal)
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
88 }
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
89 .frame(height: 50)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
90 .cornerRadius(13)
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
91
17
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
92 if showConversion {
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
93 Text("From \(currencyMetadata[mainCurrency]!.name) to \(currencyMetadata[secondaryCurrency]!.name) at \(price, specifier: "%.4f") exchange rate.")
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
94 .multilineTextAlignment(.center)
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
95 }
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
96
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
97 }
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
98 .padding()
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
99 }
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
100 .onAppear { requestApi(mainCurrency, secondaryCurrency) }
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
101 .navigationTitle("Conversion")
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
102 }
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
103
17
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
104 private func makeConversion() -> Double {
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
105 if amountToConvert.isEmpty { /// Avoid nil error when string is empty
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
106 return 0
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
107 } else {
17
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
108 let conversion = Double(amountToConvert)! * price
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
109
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
110 return conversion
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
111 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
112 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
113
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
114 private func requestApi(_ mainCurrency: String, _ secondaryCurrency: String) {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
115 let url = "https://api.simoleon.app/quotes=\(mainCurrency)-\(secondaryCurrency)"
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
116 AF.request(url).responseDecodable(of: [CurrencyQuoteModel].self) { response in
17
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
117 if let currencyQuotes = response.value {
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
118 if let price = currencyQuotes[0].price {
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
119 self.price = price
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
120 }
4a81e39186f1 Minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 16
diff changeset
121 self.showConversion = true
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
122 } else {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
123 // Handle error
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
124 }
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
125 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
126 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
127 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
128
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
129 struct CurrencyConversion_Previews: PreviewProvider {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
130 static var previews: some View {
16
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
131 NavigationView {
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
132 CurrencyConversion(currency: "USD/GBP")
aec2e86e5dbd Change design and icon
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 15
diff changeset
133 }
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
134 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
135 }