annotate Simoleon/ContentView.swift @ 14:03ce7421c6f4

Minor UI updates
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Wed, 14 Jul 2021 10:06:37 +0100
parents cdc5f728b105
children a02f463aa906
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
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
15 @State private var popularCurrencyPairsQuote = [CurrencyQuoteModel()]
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
16 @State private var popularSelectedCurrencyPairQuote: CurrencyQuoteModel? = nil
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
17
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
18 let currencyMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
19
0
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
20 var body: some View {
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
21 if showingView {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
22 NavigationView {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
23 ScrollView(showsIndicators: false) {
14
03ce7421c6f4 Minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 13
diff changeset
24 VStack(spacing: 30) {
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
25 SearchBar(text: $text, isEditing: $isEditing)
13
cdc5f728b105 Minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 12
diff changeset
26 .padding(.top)
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
27
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
28 if text.isEmpty {
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
29 ForEach(popularCurrencyPairsQuote, id: \.self) { currencyQuote in
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
30 CurrencyRow(currencyQuote: currencyQuote)
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
31 .onTapGesture { self.popularSelectedCurrencyPairQuote = currencyQuote }
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
32 }
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
33 } else {
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
34 SearchedCurrencyList(text: $text)
11
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 }
14
03ce7421c6f4 Minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 13
diff changeset
37 .padding(.vertical)
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
38 .sheet(item: self.$popularSelectedCurrencyPairQuote) { currencyQuote in
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
39 CurrencyConversion(currencyQuote: currencyQuote)
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
40 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
41 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
42 .navigationTitle("Simoleon")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
43 .toolbar {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
44 ToolbarItem(placement: .cancellationAction) {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
45 if isEditing {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
46 Button("Cancel", action: {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
47 text = ""
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
48 isEditing = false
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
49 UIApplication.shared.dismissKeyboard()
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
50 })
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 } else {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
56 ProgressView()
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
57 .onAppear(perform: requestCurrencyPairsQuote)
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
58 }
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 /*
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
62 Request API
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
63 */
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
64 private func requestCurrencyPairsQuote() {
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
65 let popularCurrencyPairsArray: [String] = parseJson("PopularCurrencyPairs.json")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
66 let popularCurrencyPairsString = popularCurrencyPairsArray.joined(separator: ",")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
67 let quotes = popularCurrencyPairsString.replacingOccurrences(of: "/", with: "-")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
68 let url = "https://api.simoleon.app/quotes=\(quotes)"
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
69
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
70 // Request popular currencies
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
71 AF.request(url).responseDecodable(of: [CurrencyQuoteModel].self) { response in
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
72 if let currencyPairsQuote = response.value {
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
73 self.popularCurrencyPairsQuote = currencyPairsQuote
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
74 self.showingView = true
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
75 } else {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
76 // Handle error
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
77 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
78 }
0
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
79 }
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
80 }
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
81 /*
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
82 Dismiss keyboard on cancel textfield
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
83 */
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
84 extension UIApplication {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
85 func dismissKeyboard() {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
86 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
87 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
88 }
0
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
89
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 struct ContentView_Previews: PreviewProvider {
e0c2bda6c51f first commit
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
92 static var previews: some View {
14
03ce7421c6f4 Minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 13
diff changeset
93 ContentView()
03ce7421c6f4 Minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 13
diff changeset
94 .environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
0
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 }