annotate Simoleon/ContentView.swift @ 13:cdc5f728b105

Minor UI updates
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Tue, 13 Jul 2021 19:56:33 +0100
parents 81f4e0a3b1eb
children 03ce7421c6f4
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) {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
24 VStack(spacing: 20) {
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
25 SearchBar(text: $text, isEditing: $isEditing)
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
26 .padding(.vertical)
13
cdc5f728b105 Minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 12
diff changeset
27 .padding(.top)
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
28
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
29 if text.isEmpty {
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
30 ForEach(popularCurrencyPairsQuote, id: \.self) { currencyQuote in
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
31 CurrencyRow(currencyQuote: currencyQuote)
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
32 .onTapGesture { self.popularSelectedCurrencyPairQuote = currencyQuote }
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
33 .padding(.bottom)
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
34 }
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
35 } else {
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
36 SearchedCurrencyList(text: $text)
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
37 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
38 }
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
39 .sheet(item: self.$popularSelectedCurrencyPairQuote) { currencyQuote in
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
40 CurrencyConversion(currencyQuote: currencyQuote)
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 }
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
43 .navigationTitle("Simoleon")
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
44 .toolbar {
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()
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
58 .onAppear(perform: requestCurrencyPairsQuote)
11
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 /*
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
63 Request API
11
a62e5e4a4f02 Implementing networking
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 0
diff changeset
64 */
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
65 private func requestCurrencyPairsQuote() {
11
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
12
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
73 if let currencyPairsQuote = response.value {
81f4e0a3b1eb Finishing first version
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 11
diff changeset
74 self.popularCurrencyPairsQuote = currencyPairsQuote
11
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 }