annotate Simoleon/Helpers/CurrencyConversion.swift @ 188:e4f5dcf4d596

add keyboard resign option
author Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
date Thu, 23 Dec 2021 16:23:16 +0100
parents 13d5a8deb6c2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 //
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
2 // CurrencyConversion.swift
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
3 // Simoleon
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
4 //
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
5 // Created by Dennis Concepción Martín on 21/12/21.
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
6 //
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
7
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
8 import SwiftUI
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
9
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
10 struct CurrencyConversion: View {
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
11 var latestRate: CurrencyLatestRateResponse
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
12 var currencyCode: String
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
13 @Binding var amount: String
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
14
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
15 var body: some View {
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
16 VStack {
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
17 RoundedRectangle(cornerRadius: 15)
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
18 .frame(height: 60)
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
19 .foregroundColor(Color(.secondarySystemBackground))
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
20 .overlay(
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
21 VStack {
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
22 if latestRate.message.isEmpty {
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
23 ProgressView()
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
24 } else {
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
25 let conversion = convert(amount: amount)
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
26 let formattedAmount = format(currency: conversion)
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
27 Text(formattedAmount)
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
28 .font(.title2)
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
29 }
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
30 }
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
31 .padding(.leading, 15)
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
32
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
33 , alignment: .leading
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
34 )
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
35
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
36 if !latestRate.message.isEmpty {
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
37 let timestamp = latestRate.message.first!.timestamp
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
38 Text("Last updated: \(converToDate(epoch: timestamp))")
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
39 .font(.caption)
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
40 .opacity(0.6)
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
41 }
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
42 }
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
43 }
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
44
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
45 // Format conversion to specific currency format
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
46 private func format(currency: Double) -> String {
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
47 let formatter = NumberFormatter()
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
48 formatter.currencyCode = currencyCode
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
49 formatter.numberStyle = .currency
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
50
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
51 return formatter.string(from: NSNumber(value: currency))!
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
52 }
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
53
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
54 // Convert epoch to date
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
55 private func converToDate(epoch: Int) -> String {
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
56 let dateFormatter = DateFormatter()
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
57 dateFormatter.timeStyle = DateFormatter.Style.medium
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
58 dateFormatter.dateStyle = DateFormatter.Style.medium
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
59 let date = Date(timeIntervalSince1970: TimeInterval(epoch/1000))
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
60
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
61 return dateFormatter.string(from: date)
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
62 }
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
63
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
64 // Compute conversion
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
65 private func convert(amount: String) -> Double {
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
66 guard let amount = Double(amount) else {
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
67 return Double()
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
68 }
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
69
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
70 let rate = latestRate.message.first!.rate
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
71 let conversion = amount * rate
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
72
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
73 return conversion
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
74 }
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
75 }
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
76
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
77 struct CurrencyConversion_Previews: PreviewProvider {
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
78 static var previews: some View {
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
79 CurrencyConversion(
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
80 latestRate:
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
81 CurrencyLatestRateResponse(
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
82 message: [
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
83 CurrencyLatestRateResult(
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
84 rate: 1.31,
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
85 timestamp: 1288282222000
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
86 )
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
87 ]
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
88 ),
187
13d5a8deb6c2 add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 186
diff changeset
89 currencyCode: "USD",
186
1ebd1c5dd302 finish ConversionView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 185
diff changeset
90 amount: .constant("1")
185
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
91 )
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
92 }
2fc95efcb1ee connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
93 }