Mercurial > public > simoleon
annotate Simoleon/Helpers/FavoriteButton.swift @ 150:6eac99e99b96
Add error handling to read json function
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Thu, 19 Aug 2021 19:12:56 +0100 |
parents | 081f0857af51 |
children |
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 |
131
501ea028ea5e
Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
53
diff
changeset
|
14 @FetchRequest(sortDescriptors: []) private var favorites: 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 { |
131
501ea028ea5e
Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
53
diff
changeset
|
19 let favoriteCurrencyPairs = favorites.map { $0.currencyPair } |
53
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 } |
138
081f0857af51
Fix test crashing
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
131
diff
changeset
|
30 .accessibilityIdentifier("AddToFavorites") |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
31 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
32 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
33 /* |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
34 If currency pair is favorite: |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
35 * Button action is to remove from favorites |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
36 else: |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
37 * 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
|
38 */ |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
39 private func favoriteAction(_ favoriteCurrencyPairs: [String]) { |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
40 if favoriteCurrencyPairs.contains(currencyPair) { |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
41 removeFromFavorites() |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
42 } else { |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
43 addToFavorites() |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
44 } |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
45 |
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
46 simpleSuccess() |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
47 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
48 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
49 /* |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
50 if currency pair is favorite: |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
51 * Return "star.fill" symbol |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
52 else: |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
53 * Return "star" |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
54 */ |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
55 private func generateStar(_ favoriteCurrencyPairs: [String]) -> String { |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
56 if favoriteCurrencyPairs.contains(currencyPair) { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
57 return "star.fill" |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
58 } else { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
59 return "star" |
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 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
62 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
63 /* |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
64 * 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
|
65 * Delete it |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
66 */ |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
67 private func removeFromFavorites() { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
68 withAnimation { |
131
501ea028ea5e
Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
53
diff
changeset
|
69 let favoriteObject = favorites.first(where: { $0.currencyPair == currencyPair }) |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
70 viewContext.delete(favoriteObject ?? Favorite()) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
71 |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
72 do { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
73 try viewContext.save() |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
74 } catch { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
75 let nsError = error as NSError |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
76 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
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 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
80 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
81 /* |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
82 * Create a favorite core data object |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
83 * Save it |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
84 */ |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
85 private func addToFavorites() { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
86 withAnimation { |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
87 let favorite = Favorite(context: viewContext) |
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
88 favorite.currencyPair = currencyPair |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
89 |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
90 do { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
91 try viewContext.save() |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
92 } catch { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
93 let nsError = error as NSError |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
94 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
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 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
99 |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
100 struct FavoriteButton_Previews: PreviewProvider { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
101 static var previews: some View { |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
102 FavoriteButton(currencyPair: "USD/GBP") |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
103 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
104 } |