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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }