Mercurial > public > simoleon
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 |
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 } |