Mercurial > public > simoleon
annotate Simoleon/Helpers/FavoriteButton.swift @ 187:13d5a8deb6c2
add AboutView and FavoritesView
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Thu, 23 Dec 2021 16:12:22 +0100 |
parents | 2fc95efcb1ee |
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 // FavoriteButton.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 |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
9 import CoreData |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
10 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
11 struct FavoriteButton: View { |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
12 @Binding var baseCurrency: SupportedCurrencyResult |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
13 @Binding var quoteCurrency: SupportedCurrencyResult |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
14 @State private var scale: CGFloat = 1 |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
15 @Environment(\.managedObjectContext) private var viewContext |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
16 @FetchRequest(sortDescriptors: []) private var favoritePairs: FetchedResults<FavoritePair> |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
17 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
18 var body: some View { |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
19 Button(action: { |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
20 animate() |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
21 if isFavorite() { remove() } |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
22 else { add() } |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
23 }) { |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
24 RoundedRectangle(cornerRadius: 15) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
25 .foregroundColor(Color(.secondarySystemBackground)) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
26 .frame(width: 60, height: 60) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
27 .overlay( |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
28 VStack { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
29 if isFavorite() { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
30 Image(systemName: "star.fill") |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
31 } else { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
32 Image(systemName: "star") |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
33 } |
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 .font(.system(size: 28)) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
36 .foregroundColor(Color(.systemYellow)) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
37 ) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
38 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
39 .scaleEffect(scale) |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
40 .animation(.linear(duration: 0.2), value: scale) |
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 // Add currency conversion to favorites |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
44 private func add() { |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
45 let favoritePair = FavoritePair(context: viewContext) |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
46 favoritePair.baseCurrency = baseCurrency.code |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
47 favoritePair.quoteCurrency = quoteCurrency.code |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
48 |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
49 do { |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
50 try viewContext.save() |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
51 } catch { |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
52 // Replace this implementation with code to handle the error appropriately. |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
53 // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
54 let nsError = error as NSError |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
55 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
56 } |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
57 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
58 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
59 // Remove currency conversion from favorites |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
60 private func remove() { |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
61 let favoritePair = favoritePairs.first( |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
62 where: { |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
63 $0.baseCurrency == baseCurrency.code && $0.quoteCurrency == quoteCurrency.code |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
64 }) |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
65 |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
66 viewContext.delete(favoritePair!) |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
67 |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
68 do { |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
69 try viewContext.save() |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
70 } catch { |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
71 // Replace this implementation with code to handle the error appropriately. |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
72 // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
73 let nsError = error as NSError |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
74 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
75 } |
185
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 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
78 // Check if currency conversion is in favorites |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
79 private func isFavorite() -> Bool { |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
80 let favoritePair = favoritePairs.first( |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
81 where: { |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
82 $0.baseCurrency == baseCurrency.code && $0.quoteCurrency == quoteCurrency.code |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
83 }) |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
84 |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
85 guard let _ = favoritePair else { return false } |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
86 |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
87 return true |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
88 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
89 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
90 // Animate favorite button |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
91 private func animate() { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
92 scale += 0.2 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
93 DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
94 scale -= 0.2 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
95 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
96 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
97 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
98 |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
99 struct FavoriteButton_Previews: PreviewProvider { |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
100 static var previews: some View { |
187
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
101 FavoriteButton( |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
102 baseCurrency: .constant(SupportedCurrencyResult(code: "EUR", name: "Euro", isCrypto: 0)), |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
103 quoteCurrency: .constant(SupportedCurrencyResult(code: "USD", name: "U.S. Dollar", isCrypto: 0)) |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
104 ) |
13d5a8deb6c2
add AboutView and FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
185
diff
changeset
|
105 .environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) |
185
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
106 } |
2fc95efcb1ee
connect backend
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
107 } |