Mercurial > public > simoleon
annotate Simoleon/ConversionView.swift @ 187:13d5a8deb6c2
add AboutView and FavoritesView
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Thu, 23 Dec 2021 16:12:22 +0100 |
parents | 1ebd1c5dd302 |
children | e4f5dcf4d596 |
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 |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
186
diff
changeset
|
14 @State var baseCurrency: SupportedCurrencyResult |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
186
diff
changeset
|
15 @State var quoteCurrency: SupportedCurrencyResult |
185
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 |
186
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
24 @State private var latestRate = CurrencyLatestRateResponse(message: [CurrencyLatestRateResult]()) |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
25 |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
26 // Update currency rates |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
27 @State private var timer = Timer.publish(every: 3, on: .main, in: .common).autoconnect() |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
28 |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
29 var body: some View { |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
30 ScrollView(showsIndicators: false) { |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
31 VStack(alignment: .leading, spacing: 20) { |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
32 // MARK: - Currency selector |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
33 HStack { |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
34 Button(action: { showCurrencyList(selecting: .baseCurrency) }) { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
35 CurrencySelectorLabel(currency: baseCurrency) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
36 } |
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 Button(action: { showCurrencyList(selecting: .quoteCurrency)}) { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
39 CurrencySelectorLabel(currency: quoteCurrency) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
40 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
41 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
42 // MARK: - Favorite button |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
186
diff
changeset
|
43 FavoriteButton(baseCurrency: $baseCurrency, quoteCurrency: $quoteCurrency) |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
44 |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
45 } |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
46 .padding(.bottom) |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
47 |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
48 // MARK: - Conversion box |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
49 Text("\(baseCurrency.code) - \(baseCurrency.name)") |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
50 .font(.callout) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
51 .fontWeight(.semibold) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
52 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
53 CurrencyTextfield(currencyCode: baseCurrency.code, amount: $amount) |
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 Divider() |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
56 Text("\(quoteCurrency.code) - \(quoteCurrency.name)") |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
57 .font(.callout) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
58 .fontWeight(.semibold) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
59 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
60 CurrencyConversion( |
186
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
61 latestRate: latestRate, |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
62 currencyCode: quoteCurrency.code, |
186
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
63 amount: $amount |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
64 ) |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
65 } |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
186
diff
changeset
|
66 .padding(.horizontal) |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
67 .sheet(isPresented: $showingCurrencyList) { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
68 CurrencyList(baseCurrency: $baseCurrency, quoteCurrency: $quoteCurrency, selecting: selecting) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
69 } |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
70 } |
186
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
71 .onAppear { |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
72 getConversion() |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
73 timer = Timer.publish(every: 3, on: .main, in: .common).autoconnect() |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
74 } |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
75 .onReceive(timer) { _ in |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
76 getConversion() |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
77 } |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
78 .onDisappear { |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
79 timer.upstream.connect().cancel() |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
80 } |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
81 .navigationTitle("Convert") |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
82 .if(UIDevice.current.userInterfaceIdiom == .phone && showNavigationView ?? true) { content in |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
83 NavigationView { content } |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
84 } |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
85 } |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
86 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
87 // Change selection and show CurrencyList() |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
88 private func showCurrencyList(selecting: Selection) { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
89 self.selecting = selecting |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
90 showingCurrencyList.toggle() |
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 // Request conversion |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
94 private func getConversion() { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
95 let currencyPair = "\(baseCurrency.code)\(quoteCurrency.code)" |
186
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
96 let url = "https://api.simoleon.app/fx/latest?symbols=\(currencyPair)" |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
97 httpRequest(url: url, model: CurrencyLatestRateResponse.self) { response in |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
98 latestRate = response |
1ebd1c5dd302
finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
99 if latestRate.message.isEmpty { |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
100 // Handle exception |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
101 } else { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
102 showConversion = true |
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 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
107 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
108 enum Selection { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
183
diff
changeset
|
109 case baseCurrency, quoteCurrency |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
110 } |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
111 |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
112 struct ConversionView_Previews: PreviewProvider { |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
113 static var previews: some View { |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
186
diff
changeset
|
114 ConversionView( |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
186
diff
changeset
|
115 baseCurrency: SupportedCurrencyResult(code: "EUR", name: "Euro", isCrypto: 0), |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
186
diff
changeset
|
116 quoteCurrency: SupportedCurrencyResult(code: "USD", name: "U.S. Dollar", isCrypto: 0) |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
186
diff
changeset
|
117 ) |
183
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
118 } |
d2398f02e1ce
implement unit currency selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
119 } |