view Simoleon/Helpers/CurrencyConversion.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 Simoleon/CurrencyConversion.swift@cdc5f728b105
children a02f463aa906
line wrap: on
line source

//
//  CurrencyConversion.swift
//  Simoleon
//
//  Created by Dennis Concepción Martín on 12/07/2021.
//

import SwiftUI

struct CurrencyConversion: View {
    var currencyQuote: CurrencyQuoteModel
    let currenciesMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
    @State private var inputAmount: String = "100"
    @Environment(\.presentationMode) private var currencyConversionPresentation
    
    var body: some View {
        NavigationView {
            ScrollView(showsIndicators: false) {
                VStack(spacing: 20) {
                    let symbols = currencyQuote.symbol!.split(separator: "/")
                    // MARK: - First currency row
                    VStack {
                        RoundedRectangle(cornerRadius: 10)
                            .rectangleModifier(Color("Shadow"), 65)
                        
                        RoundedRectangle(cornerRadius: 10)
                            .rectangleModifier(Color(.systemBackground), 65)
                            .overlay(
                                HStack {
                                    SingleFlag(flag: currenciesMetadata[String(symbols[0])]!.flag)
                                    Text(String(symbols[0]))
                                        .fontWeight(.semibold)
                                        .padding(.leading)
                                    
                                    TextField("Amount", text: $inputAmount)
                                        .keyboardType(.decimalPad)
                                        .padding(.leading)
                                }
                                .padding(.horizontal)
                            )
                            .offset(x: -6.0, y: -80.0)
                            .padding(.bottom, -80)
                    }
                    .padding(.leading, 6)
                    .padding(.horizontal)
                    
                    // MARK: - Second currency row
                    VStack {
                        RoundedRectangle(cornerRadius: 10)
                            .rectangleModifier(Color("Shadow"), 65)

                        RoundedRectangle(cornerRadius: 10)
                            .rectangleModifier(Color(.systemBackground), 65)
                            .overlay(
                                HStack {
                                    SingleFlag(flag: currenciesMetadata[String(symbols[1])]!.flag)
                                    Text(String(symbols[1]))
                                        .fontWeight(.semibold)
                                        .padding(.leading)
                                    
                                    Text("\(makeConversion(inputAmount), specifier: "%.2f")")
                                        .padding(.leading)
                                    Spacer()
                                }
                                .padding(.horizontal)
                            )
                            .offset(x: -6, y: -80)
                            .padding(.bottom, -80)
                    }
                    .padding(.leading, 6)
                    .padding(.horizontal)
                    
                }
                .padding(.vertical)
            }
            .padding(.top)
            .navigationTitle("Conversion")
            .toolbar {
                ToolbarItem(placement: .cancellationAction) {
                    Button("Cancel", action: { currencyConversionPresentation.wrappedValue.dismiss() })
                }
            }
        }
    }
    
    /*
     Make currency conversion
     */
    private func makeConversion(_ inputAmount: String) -> Float {
        if inputAmount.isEmpty {  /// Avoid nil error when string is empty
            return 0
        } else {
            let conversion = Float(inputAmount)!  * currencyQuote.price!
            
            return conversion
        }
    }
}

struct CurrencyConversion_Previews: PreviewProvider {
    static var previews: some View {
        let currencyQuote: CurrencyQuoteModel = parseJson("CurrencyQuoteData.json")
        
        CurrencyConversion(currencyQuote: currencyQuote)
    }
}