annotate Simoleon/ContentView.swift @ 12:81f4e0a3b1eb

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