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