Mercurial > public > simoleon
annotate Simoleon/Helpers/FavouriteButton.swift @ 47:75c1a05176f6
Refactor code
author | Dennis Concepción Martín <dennisconcepcionmartin@gmail.com> |
---|---|
date | Mon, 26 Jul 2021 20:08:20 +0100 |
parents | d25b02d439d4 |
children | 7a6a7c677851 |
rev | line source |
---|---|
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
1 // |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
2 // FavouriteButton.swift |
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 |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
10 struct FavouriteButton: View { |
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 |
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
13 @State private var starSymbol = "star" |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
14 @Environment(\.managedObjectContext) private var viewContext |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
15 @FetchRequest(sortDescriptors: []) private var favourite: FetchedResults<Favourite> |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
16 |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
17 var body: some View { |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
18 let favouriteCurrencyPairs = favourite.map { $0.currencyPair } |
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
19 Button(action: { favouriteAction(favouriteCurrencyPairs) }) { |
27
d95582268b44
Fix bug CoreData and minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
26
diff
changeset
|
20 RoundedRectangle(cornerRadius: 15) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
21 .foregroundColor(Color(.secondarySystemBackground)) |
27
d95582268b44
Fix bug CoreData and minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
26
diff
changeset
|
22 .frame(width: 60, height: 60) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
23 .overlay( |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
24 Image(systemName: generateStar(favouriteCurrencyPairs)) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
25 .font(.system(size: 28)) |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
26 .foregroundColor(Color(.systemYellow)) |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
27 ) |
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 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
31 /* |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
32 If currency pair is favourite: |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
33 * Button action is to remove from favourites |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
34 else: |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
35 * Button action is to add to favourites |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
36 */ |
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
37 private func favouriteAction(_ favouriteCurrencyPairs: [String]) { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
38 if favouriteCurrencyPairs.contains(currencyPair) { |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
39 removeFromFavourites() |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
40 } else { |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
41 addToFavourites() |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
42 } |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
43 |
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
44 simpleSuccess() |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
45 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
46 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
47 /* |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
48 if currency pair is favourite: |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
49 * Return "star.fill" symbol |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
50 else: |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
51 * Return "star" |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
52 */ |
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
53 private func generateStar(_ favouriteCurrencyPairs: [String]) -> String { |
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
54 if favouriteCurrencyPairs.contains(currencyPair) { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
55 return "star.fill" |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
56 } else { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
57 return "star" |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
58 } |
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 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
61 /* |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
62 * Get first favourite core data object that matches the specified currency pair |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
63 * Delete it |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
64 */ |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
65 private func removeFromFavourites() { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
66 withAnimation { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
67 let favouriteObject = favourite.first(where: { $0.currencyPair == currencyPair }) |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
68 viewContext.delete(favouriteObject ?? Favourite()) |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
69 |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
70 do { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
71 try viewContext.save() |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
72 } catch { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
73 let nsError = error as NSError |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
74 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
75 } |
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 |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
79 /* |
47
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
80 * Create a favourite core data object |
75c1a05176f6
Refactor code
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
42
diff
changeset
|
81 * Save it |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
82 */ |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
83 private func addToFavourites() { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
84 withAnimation { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
85 let favourite = Favourite(context: viewContext) |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
86 favourite.currencyPair = currencyPair |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
87 |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
88 do { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
89 try viewContext.save() |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
90 } catch { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
91 let nsError = error as NSError |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
92 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
93 } |
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 struct FavouriteButton_Previews: PreviewProvider { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
99 static var previews: some View { |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
100 FavouriteButton(currencyPair: "USD/GBP") |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
101 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
102 } |