Mercurial > public > simoleon
annotate Simoleon/ConversionView.swift @ 185:2fc95efcb1ee
connect backend
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Wed, 22 Dec 2021 16:12:23 +0100 |
parents | d2398f02e1ce |
children | 1ebd1c5dd302 |
rev | line source |
---|---|
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
1 // |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
2 // ConversionView.swift |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
3 // Simoleon |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
4 // |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
5 // Created by Dennis Concepción Martín on 8/12/21. |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
6 // |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
7 |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
8 import SwiftUI |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
9 |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
10 struct ConversionView: View { |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
11 var showNavigationView: Bool? |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
12 |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
13 // CurrencySelector variables |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
14 @State private var baseCurrency = SupportedCurrencyResult(code: "EUR", name: "Euro", isCrypto: 0) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
15 @State private var quoteCurrency = SupportedCurrencyResult(code: "CHF", name: "Swiss Franc", isCrypto: 0) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
16 @State private var showingCurrencyList = false |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
17 @State private var selecting: Selection = .baseCurrency |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
18 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
19 // CurrencyTextfield variables |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
20 @State private var amount = "1" |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
21 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
22 // CurrencyConversion variables |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
23 @State private var showConversion = false |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
24 @State private var conversion = CurrencyConversionResponse(message: [CurrencyConversionResult]()) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
25 |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
26 var body: some View { |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
27 ScrollView(showsIndicators: false) { |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
28 VStack(alignment: .leading, spacing: 20) { |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
29 // MARK: - Currency selector |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
30 HStack { |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
31 Button(action: { showCurrencyList(selecting: .baseCurrency) }) { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
32 CurrencySelectorLabel(currency: baseCurrency) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
33 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
34 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
35 Button(action: { showCurrencyList(selecting: .quoteCurrency)}) { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
36 CurrencySelectorLabel(currency: quoteCurrency) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
37 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
38 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
39 // MARK: - Favorite button |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
40 FavoriteButton() |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
41 |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
42 } |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
43 .padding(.bottom) |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
44 |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
45 // MARK: - Conversion box |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
46 Text("\(baseCurrency.code) - \(baseCurrency.name)") |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
47 .font(.callout) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
48 .fontWeight(.semibold) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
49 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
50 CurrencyTextfield(currencyCode: baseCurrency.code, amount: $amount) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
51 .onChange(of: amount) { _ in |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
52 showConversion = false |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
53 getConversion() |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
54 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
55 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
56 Divider() |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
57 Text("\(quoteCurrency.code) - \(quoteCurrency.name)") |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
58 .font(.callout) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
59 .fontWeight(.semibold) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
60 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
61 CurrencyConversion( |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
62 conversion: conversion, |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
63 currencyCode: quoteCurrency.code, |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
64 showConversion: $showConversion |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
65 ) |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
66 } |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
67 .padding() |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
68 .sheet(isPresented: $showingCurrencyList) { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
69 CurrencyList(baseCurrency: $baseCurrency, quoteCurrency: $quoteCurrency, selecting: selecting) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
70 } |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
71 } |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
72 .onAppear(perform: getConversion) |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
73 .navigationTitle("Convert") |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
74 .if(UIDevice.current.userInterfaceIdiom == .phone && showNavigationView ?? true) { content in |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
75 NavigationView { content } |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
76 } |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
77 } |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
78 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
79 // Change selection and show CurrencyList() |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
80 private func showCurrencyList(selecting: Selection) { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
81 self.selecting = selecting |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
82 showingCurrencyList.toggle() |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
83 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
84 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
85 // Request conversion |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
86 private func getConversion() { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
87 guard let amount = Float(amount) else { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
88 amount = "" |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
89 showConversion = true |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
90 return |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
91 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
92 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
93 let currencyPair = "\(baseCurrency.code)\(quoteCurrency.code)" |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
94 let url = "https://api.simoleon.app/fx/convert?symbols=\(currencyPair)&amount=\(amount)" |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
95 httpRequest(url: url, model: CurrencyConversionResponse.self) { response in |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
96 conversion = response |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
97 if conversion.message.isEmpty { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
98 // Handle exception |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
99 } else { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
100 showConversion = true |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
101 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
102 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
103 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
104 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
105 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
106 enum Selection { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
107 case baseCurrency, quoteCurrency |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
108 } |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
109 |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
110 struct ConversionView_Previews: PreviewProvider { |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
111 static var previews: some View { |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
112 ConversionView(showNavigationView: true) |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
113 } |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
114 } |