annotate Simoleon/ContentView.swift @ 11:a62e5e4a4f02

Implementing networking
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Tue, 13 Jul 2021 12:14:42 +0100
parents e0c2bda6c51f
children 81f4e0a3b1eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 //
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
2 // ContentView.swift
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
3 // Simoleon
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
4 //
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
5 // Created by Dennis Concepción Martín on 08/07/2021.
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
6 //
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
7
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
8 import SwiftUI
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
9 import Alamofire
0
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
10
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
11 struct ContentView: View {
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
12 @State private var showingView = false
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
13 @State private var text = ""
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
14 @State private var isEditing = false
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
15 @State private var popularCurrencyPairs = [CurrencyQuoteModel()]
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
16 @State private var selectedCurrencyQuote: CurrencyQuoteModel? = nil
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
17 let currencyMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
18
0
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
19 var body: some View {
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
20 if showingView {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
21 NavigationView {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
22 ScrollView(showsIndicators: false) {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
23 VStack(spacing: 20) {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
24 SearchBar(text: $text, isEditing: $isEditing)
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
25 .padding(.vertical)
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
26
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
27 ForEach(popularCurrencyPairs, id: \.self) { currencyQuote in
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
28 CurrencyRow(currencyQuote: currencyQuote)
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
29 .onTapGesture { self.selectedCurrencyQuote = currencyQuote }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
30 .padding(.bottom)
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
31 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
32 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
33 .sheet(item: self.$selectedCurrencyQuote) { currencyQuote in
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
34 CurrencyConversion(currencyQuote: currencyQuote)
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
35 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
36 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
37 .navigationTitle("Simoleon")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
38 .toolbar {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
39 ToolbarItem(placement: .primaryAction) {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
40 Button(action: { }) {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
41 Image(systemName: "gearshape")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
42 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
43 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
44
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
45 ToolbarItem(placement: .cancellationAction) {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
46 if isEditing {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
47 Button("Cancel", action: {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
48 text = ""
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
49 isEditing = false
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
50 UIApplication.shared.dismissKeyboard()
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
51 })
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
52 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
53 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
54 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
55 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
56 } else {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
57 ProgressView()
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
58 .onAppear(perform: requestPopularCurrencies)
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
59 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
60 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
61
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
62 /*
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
63 Request API popular currency pairs
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
64 */
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
65 private func requestPopularCurrencies() {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
66 let popularCurrencyPairsArray: [String] = parseJson("PopularCurrencyPairs.json")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
67 let popularCurrencyPairsString = popularCurrencyPairsArray.joined(separator: ",")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
68 let quotes = popularCurrencyPairsString.replacingOccurrences(of: "/", with: "-")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
69 let url = "https://api.simoleon.app/quotes=\(quotes)"
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
70
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
71 // Request popular currencies
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
72 AF.request(url).responseDecodable(of: [CurrencyQuoteModel].self) { response in
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
73 if let popularCurrencyPairs = response.value {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
74 self.popularCurrencyPairs = popularCurrencyPairs
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
75 self.showingView = true
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
76 } else {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
77 // Handle error
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
78 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
79 }
0
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
80 }
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
81 }
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
82 /*
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
83 Dismiss keyboard on cancel textfield
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
84 */
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
85 extension UIApplication {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
86 func dismissKeyboard() {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
87 sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
88 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
89 }
0
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
90
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
91
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
92 struct ContentView_Previews: PreviewProvider {
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
93 static var previews: some View {
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
94 ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
95 }
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
96 }