diff Simoleon/UI/CurrencySelector.swift @ 157:8c3bbd640103

Implement Currency Selector
author Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
date Sat, 28 Aug 2021 11:15:41 +0100
parents
children 35628bac01f5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Simoleon/UI/CurrencySelector.swift	Sat Aug 28 11:15:41 2021 +0100
@@ -0,0 +1,89 @@
+//
+//  CurrencySelector.swift
+//  Simoleon
+//
+//  Created by Dennis Concepción Martín on 27/8/21.
+//
+
+import SwiftUI
+
+struct CurrencySelector: View {
+    @State var currencyPair: CurrencyPairModel
+    @State private var showingList = false
+    @State private var modalSelection: ModalType? = nil
+    let currencyPairsSupported: [String] = try! read(json: "CurrencyPairsSupported.json")
+    
+    private enum ModalType {
+        case allCurrencies, compatibleCurrencies
+    }
+    
+    var body: some View {
+        HStack {
+            Button(action: {
+                showingList = true
+                modalSelection = .allCurrencies
+            }) {
+                CurrencyButton(selectedCurrency: currencyPair.baseSymbol)
+            }
+            
+            Button(action: {
+                showingList = true
+                modalSelection = .compatibleCurrencies
+            }) {
+                CurrencyButton(selectedCurrency: currencyPair.quoteSymbol)
+            }
+        }
+        .onChange(of: currencyPair.baseSymbol) { _ in
+            // If the previous quote symbol is not compatible anymore with base symbol
+            // return the first symbol of the new compatible symbols list
+            let compatibleCurrencies = get(currencyType: .compatible(with: currencyPair.baseSymbol), from: currencyPairsSupported)
+            if !compatibleCurrencies.contains(currencyPair.quoteSymbol) {
+                currencyPair.quoteSymbol = compatibleCurrencies.sorted().first!
+            }
+        }
+        .sheet(isPresented: $showingList) {
+            if modalSelection == .allCurrencies {
+                let currencies = get(currencyType: .all, from: currencyPairsSupported)
+                CurrencyList(currencies: currencies, selectedCurrency: $currencyPair.baseSymbol)
+            } else {
+                let currencies = get(currencyType: .compatible(with: currencyPair.baseSymbol), from: currencyPairsSupported)
+                CurrencyList(currencies: currencies, selectedCurrency: $currencyPair.quoteSymbol)
+            }
+        }
+    }
+    
+    enum CurrencyType {
+        case all
+        case compatible(with: String)
+    }
+    
+    func get(currencyType: CurrencyType, from currencyPairsSupported: [String]) -> [String] {
+        var currencies = Set<String>()
+        
+        switch currencyType {
+        case .all:
+            for currencyPairSupported in currencyPairsSupported {
+                let currency = currencyPairSupported.components(separatedBy: "/")[0]
+                currencies.insert(currency)
+            }
+            
+            return Array(currencies)
+            
+        case .compatible(with: let symbol):
+            for currencyPairSupported in currencyPairsSupported {
+                if currencyPairSupported.hasPrefix(symbol) {
+                    let compatibleCurrency = currencyPairSupported.components(separatedBy: "/")[1]
+                    currencies.insert(compatibleCurrency)
+                }
+            }
+            
+            return Array(currencies)
+        }
+    }
+}
+
+struct CurrencySelector_Previews: PreviewProvider {
+    static var previews: some View {
+        CurrencySelector(currencyPair: CurrencyPairModel(baseSymbol: "USD", quoteSymbol: "EUR"))
+    }
+}