annotate Simoleon/Conversion.swift @ 21:c3dda63f50ed v1.1

Added Core Data and UI changes - Implement Watchlist - Change conversion design - Improve UX
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Mon, 19 Jul 2021 19:27:12 +0100
parents 94fd7ac93060
children 3596690dda73
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 //
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
2 // Conversion.swift
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
3 // Simoleon
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
4 //
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
5 // Created by Dennis Concepción Martín on 18/07/2021.
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
6 //
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
7
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
8 import SwiftUI
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
9 import Alamofire
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
10
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
11 struct Conversion: View {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
12 @State private var currencyPair = "USD/GBP"
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
13 @State private var amountToConvert = "1000"
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
14 @State private var price: Double = 1.00
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
15 @State private var showingConversion = false
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
16 @State private var showingCurrencySelector = false
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
17 @State private var isEditing = false
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
18
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
19 let currencyMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
20
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
21 var body: some View {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
22 ScrollView(showsIndicators: false) {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
23 VStack(alignment: .leading) {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
24 HStack {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
25 Button(action: { showingCurrencySelector = true }) {
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
26 RoundedRectangle(cornerRadius: 25)
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
27 .foregroundColor(Color(.secondarySystemBackground))
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
28 .frame(height: 75)
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
29 .overlay(CurrencyRow(currencyPair: currencyPair).padding(.horizontal))
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
30 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
31
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
32 FavouriteButton(currencyPair: currencyPair)
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
33 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
34
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
35 ConversionBox(
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
36 currencyPair: $currencyPair,
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
37 amountToConvert: $amountToConvert,
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
38 price: $price,
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
39 showingConversion: $showingConversion,
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
40 showingCurrencySelector: $showingCurrencySelector,
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
41 isEditing: $isEditing
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
42 )
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
43 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
44 .padding()
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
45 .onAppear { request(currencyPair) }
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
46 .onChange(of: showingCurrencySelector, perform: { showingCurrencySelector in
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
47 if !showingCurrencySelector {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
48 request(currencyPair)
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
49 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
50 })
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
51 .sheet(isPresented: $showingCurrencySelector) {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
52 CurrencySelector(currencyPair: $currencyPair, showingCurrencySelector: $showingCurrencySelector)
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
53 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
54 }
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
55 .if(UIDevice.current.userInterfaceIdiom == .phone) { content in
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
56 NavigationView {
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
57 content
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
58 .navigationTitle("Conversion")
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
59 .toolbar {
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
60 ToolbarItem(placement: .cancellationAction) {
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
61 if isEditing {
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
62 Button("Cancel", action: {
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
63 UIApplication.shared.dismissKeyboard()
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
64 isEditing = false
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
65 })
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
66 }
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
67 }
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
68 }
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
69 }
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
70 }
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
71 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
72
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
73 private func request(_ currencyPair: String) {
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
74 let url = "https://api.1forge.com/quotes?pairs=\(currencyPair)&api_key=BFWeJQ3jJtqqpDv5ArNis59pAlFcQ4KF"
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
75
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
76 AF.request(url).responseDecodable(of: [CurrencyQuoteModel].self) { response in
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
77 self.showingConversion = false
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
78
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
79 if let currencyQuotes = response.value {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
80 if let price = currencyQuotes.first?.price {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
81 self.price = price
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
82 self.showingConversion = true
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
83 } else {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
84 // Handle error
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
85 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
86 } else {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
87 // Handle error
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
88 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
89 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
90 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
91 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
92
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
93
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
94 struct Conversion_Previews: PreviewProvider {
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
95 static var previews: some View {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 19
diff changeset
96 Conversion()
19
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
97 }
94fd7ac93060 Redesign
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
98 }