annotate Simoleon/UI/CurrencyList.swift @ 157:8c3bbd640103

Implement Currency Selector
author Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
date Sat, 28 Aug 2021 11:15:41 +0100
parents
children 0c589138a6f3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
157
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 //
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
2 // CurrencyList.swift
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
3 // Simoleon
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
4 //
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
5 // Created by Dennis Concepción Martín on 24/8/21.
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
6 //
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
7
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
8 import SwiftUI
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
9
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
10 struct CurrencyList: View {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
11 var currencies: [String]
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
12 @Binding var selectedCurrency: String
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
13 @State private var searchCurrency = ""
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
14 @Environment(\.presentationMode) private var presentation
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
15 let currencyDetails: [String: CurrencyModel] = try! read(json: "Currencies.json")
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
16
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
17 var searchResults: [String] {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
18 if searchCurrency.isEmpty {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
19 return currencies.sorted()
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
20 } else {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
21 return currencies.filter {$0.contains(searchCurrency.uppercased())}
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
22 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
23 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
24
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
25 var body: some View {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
26 NavigationView {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
27 List {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
28 SearchBar(placeholder: "Search...", text: $searchCurrency)
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
29 .padding(.vertical)
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
30 .accessibilityIdentifier("CurrencySearchBar")
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
31
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
32 ForEach(searchResults, id: \.self) { symbol in
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
33 Button(action: {selectedCurrency = symbol; presentation.wrappedValue.dismiss()}) {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
34 let currency = currencyDetails[symbol]!
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
35 CurrencyRow(currency: currency)
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
36 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
37 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
38 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
39 .listStyle()
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
40 .navigationTitle("Currencies")
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
41 .navigationBarTitleDisplayMode(.inline)
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
42 .toolbar {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
43 ToolbarItem(placement: .cancellationAction) {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
44 Button(action: { presentation.wrappedValue.dismiss() }) {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
45 Text("Cancel")
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
46 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
47 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
48 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
49 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
50 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
51 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
52 extension View {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
53 func listStyle() -> some View {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
54 self.modifier(ListModifier())
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
55 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
56 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
57
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
58 struct CurrencyList_Previews: PreviewProvider {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
59 static var previews: some View {
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
60 CurrencyList(currencies: ["USD"], selectedCurrency: .constant("USD"))
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
61 }
8c3bbd640103 Implement Currency Selector
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
62 }