annotate Simoleon/UI/ConversionBox.swift @ 160:0c589138a6f3

Implement Conversion Box
author Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
date Sun, 29 Aug 2021 19:04:34 +0100
parents 84137052813d
children 3913aff613e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
156
84137052813d Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 //
160
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
2 // ConversionBox.swift
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
3 // Simoleon
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
4 //
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
5 // Created by Dennis Concepción Martín on 18/07/2021.
156
84137052813d Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
6 //
160
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
7
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
8 import SwiftUI
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
9
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
10 struct ConversionBox: View {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
11 @ObservedObject var currencyPair: CurrencyPair
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
12 @State private var amount = ""
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
13 @State private var isEditing = false
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
14 @State private var showingConversion = false
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
15 @State private var currencyQuote = CurrencyQuoteModel()
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
16 @State private var showingAlert = false
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
17
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
18 let networkHelper = NetworkHelper()
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
19 let currencyDetails: [String: CurrencyModel] = try! readJson(from: "Currencies.json")
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
20
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
21 var body: some View {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
22 VStack(alignment: .leading) {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
23 let baseCurrencyName = currencyDetails[currencyPair.baseSymbol]!.name
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
24 Text("\(baseCurrencyName) (\(currencyPair.baseSymbol))")
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
25 .font(.callout)
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
26 .fontWeight(.semibold)
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
27
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
28 ConversionTextfield(amount: $amount, isEditing: $isEditing)
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
29 Divider()
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
30
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
31 let quoteCurrencyName = currencyDetails[currencyPair.quoteSymbol]!.name
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
32 Text("\(quoteCurrencyName) (\(currencyPair.quoteSymbol))")
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
33 .font(.callout)
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
34 .fontWeight(.semibold)
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
35
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
36 if showingConversion {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
37 let conversion = convert()
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
38 Text("\(conversion, specifier: "%.2f")")
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
39 .font(Font.title.weight(.semibold))
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
40 .lineLimit(1)
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
41 } else {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
42 ProgressView()
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
43 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
44 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
45 .toolbar {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
46 ToolbarItem(placement: .navigationBarTrailing) {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
47 if isEditing {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
48 Button(action: {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
49 UIApplication.shared.dismissKeyboard()
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
50 isEditing = false
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
51 }) {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
52 Text("Done")
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
53 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
54 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
55 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
56 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
57
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
58 .onAppear {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
59 showingConversion = false
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
60 let pair = "\(currencyPair.baseSymbol)/\(currencyPair.quoteSymbol)"
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
61 let apiKey = readConfig(withKey: "API_KEY")!
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
62 let url = "https://api.1forge.com/quotes?pairs=\(pair)&api_key=\(apiKey)"
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
63 try? networkHelper.httpRequest(url: url, model: [CurrencyQuoteModel].self) { response in
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
64 if let currencyQuote = response.first {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
65 self.currencyQuote = currencyQuote
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
66 } else {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
67 showingAlert = true
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
68 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
69
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
70 showingConversion = true
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
71 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
72 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
73 .alert(isPresented: $showingAlert) {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
74 Alert(
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
75 title: Text("Currencies not supported."),
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
76 message: Text("Currently, we are unable to convert from \(currencyPair.baseSymbol) to \(currencyPair.quoteSymbol)."),
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
77 dismissButton: .default(Text("Dismiss")
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
78 )
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
79 )
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
80 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
81 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
82
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
83 private func convert() -> Double {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
84 guard let amount = Double(amount) else { return 0 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
85 guard let price = currencyQuote.price else { return 0 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
86
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
87 return amount * price
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
88 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
89 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
90
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
91 struct ConversionBox_Previews: PreviewProvider {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
92 static var previews: some View {
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
93 ConversionBox(currencyPair: CurrencyPair())
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
94 }
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
95 }