Mercurial > public > simoleon
annotate Simoleon/Helpers/FavoriteButton.swift @ 53:b0bce2c8e4a9
Refactor UK spelling to US
author | Dennis Concepción Martín <dennisconcepcionmartin@gmail.com> |
---|---|
date | Tue, 27 Jul 2021 09:44:51 +0100 |
parents | Simoleon/Helpers/FavouriteButton.swift@7a6a7c677851 |
children | 529feb1fc8d5 501ea028ea5e |
rev | line source |
---|---|
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
1 // |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
2 // FavoriteButton.swift |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
3 // Simoleon |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
4 // |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
5 // Created by Dennis Concepción Martín on 19/07/2021. |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
6 // |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
7 |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
8 import SwiftUI |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
9 |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
10 struct FavoriteButton: View { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
11 var currencyPair: String |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
12 |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
13 @Environment(\.managedObjectContext) private var viewContext |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
14 @FetchRequest(sortDescriptors: []) private var favorite: FetchedResults<Favorite> |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
15 |
50
7a6a7c677851
Handle errors with alerts
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
47
diff
changeset
|
16 @State private var starSymbol = "star" |
7a6a7c677851
Handle errors with alerts
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
47
diff
changeset
|
17 |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
18 var body: some View { |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
19 let favoriteCurrencyPairs = favorite.map { $0.currencyPair } |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
20 Button(action: { favoriteAction(favoriteCurrencyPairs) }) { |
27
d95582268b44
Fix bug CoreData and minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
26
diff
changeset
|
21 RoundedRectangle(cornerRadius: 15) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
22 .foregroundColor(Color(.secondarySystemBackground)) |
27
d95582268b44
Fix bug CoreData and minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
26
diff
changeset
|
23 .frame(width: 60, height: 60) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
24 .overlay( |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
25 Image(systemName: generateStar(favoriteCurrencyPairs)) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
26 .font(.system(size: 28)) |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
27 .foregroundColor(Color(.systemYellow)) |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
28 ) |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
29 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
30 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
31 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
32 /* |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
33 If currency pair is favorite: |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
34 * Button action is to remove from favorites |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
35 else: |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
36 * Button action is to add to favorites |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
37 */ |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
38 private func favoriteAction(_ favoriteCurrencyPairs: [String]) { |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
39 if favoriteCurrencyPairs.contains(currencyPair) { |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
40 removeFromFavorites() |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
41 } else { |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
42 addToFavorites() |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
43 } |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
44 |
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
45 simpleSuccess() |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
46 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
47 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
48 /* |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
49 if currency pair is favorite: |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
50 * Return "star.fill" symbol |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
51 else: |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
52 * Return "star" |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
53 */ |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
54 private func generateStar(_ favoriteCurrencyPairs: [String]) -> String { |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
55 if favoriteCurrencyPairs.contains(currencyPair) { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
56 return "star.fill" |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
57 } else { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
58 return "star" |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
59 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
60 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
61 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
62 /* |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
63 * Get first favorite core data object that matches the specified currency pair |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
64 * Delete it |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
65 */ |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
66 private func removeFromFavorites() { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
67 withAnimation { |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
68 let favoriteObject = favorite.first(where: { $0.currencyPair == currencyPair }) |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
69 viewContext.delete(favoriteObject ?? Favorite()) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
70 |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
71 do { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
72 try viewContext.save() |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
73 } catch { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
74 let nsError = error as NSError |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
75 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
76 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
77 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
78 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
79 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
80 /* |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
81 * Create a favorite core data object |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
82 * Save it |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
83 */ |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
84 private func addToFavorites() { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
85 withAnimation { |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
86 let favorite = Favorite(context: viewContext) |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
87 favorite.currencyPair = currencyPair |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
88 |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
89 do { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
90 try viewContext.save() |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
91 } catch { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
92 let nsError = error as NSError |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
93 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
94 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
95 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
96 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
97 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
98 |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
99 struct FavoriteButton_Previews: PreviewProvider { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
100 static var previews: some View { |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
101 FavoriteButton(currencyPair: "USD/GBP") |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
102 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
103 } |