Mercurial > public > simoleon
annotate Simoleon/UI/FavoriteButton.swift @ 166:e4cbb1eea394
Implement FavoritesView
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Sat, 11 Sep 2021 16:30:32 +0200 |
parents | f5de15e06c77 |
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 { |
161
3913aff613e8
Fix bug that didn't request API on symbol change
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
160
diff
changeset
|
11 @ObservedObject var currencyConversion: CurrencyConversion |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
12 @State private var scale: CGFloat = 1 |
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 |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
14 @FetchRequest(sortDescriptors: []) private var favoritePairs: FetchedResults<FavoritePair> |
50
7a6a7c677851
Handle errors with alerts
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
47
diff
changeset
|
15 |
162
f5de15e06c77
Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
161
diff
changeset
|
16 let hapticsHelper = HapticsHelper() |
f5de15e06c77
Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
161
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 { |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
19 Button(action: { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
20 animate() |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
21 if isFavorite() { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
22 remove() |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
23 } else { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
24 add() |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
25 } |
162
f5de15e06c77
Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
161
diff
changeset
|
26 |
f5de15e06c77
Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
161
diff
changeset
|
27 hapticsHelper.simpleSuccess() |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
28 }) { |
27
d95582268b44
Fix bug CoreData and minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
26
diff
changeset
|
29 RoundedRectangle(cornerRadius: 15) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
30 .foregroundColor(Color(.secondarySystemBackground)) |
27
d95582268b44
Fix bug CoreData and minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
26
diff
changeset
|
31 .frame(width: 60, height: 60) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
32 .overlay( |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
33 VStack { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
34 if isFavorite() { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
35 Image(systemName: "star.fill") |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
36 } else { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
37 Image(systemName: "star") |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
38 } |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
39 } |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
40 .font(.system(size: 28)) |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
41 .foregroundColor(Color(.systemYellow)) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
42 ) |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
43 } |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
44 .scaleEffect(scale) |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
45 .animation(.linear(duration: 0.2), value: scale) |
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 |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
48 func add() { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
49 let favoritePair = FavoritePair(context: viewContext) |
161
3913aff613e8
Fix bug that didn't request API on symbol change
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
160
diff
changeset
|
50 favoritePair.baseSymbol = currencyConversion.baseSymbol |
3913aff613e8
Fix bug that didn't request API on symbol change
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
160
diff
changeset
|
51 favoritePair.quoteSymbol = currencyConversion.quoteSymbol |
42
d25b02d439d4
Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
27
diff
changeset
|
52 |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
53 do { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
54 try viewContext.save() |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
55 } catch { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
56 let nsError = error as NSError |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
57 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
21
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 |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
61 func remove() { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
62 let favoritePair = favoritePairs.first( |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
63 where: { |
161
3913aff613e8
Fix bug that didn't request API on symbol change
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
160
diff
changeset
|
64 $0.baseSymbol == currencyConversion.baseSymbol && $0.quoteSymbol == currencyConversion.quoteSymbol |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
65 }) |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
66 |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
67 viewContext.delete(favoritePair!) |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
68 |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
69 do { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
70 try viewContext.save() |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
71 } catch { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
72 let nsError = error as NSError |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
73 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
74 } |
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 |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
77 func isFavorite() -> Bool { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
78 let favoritePair = favoritePairs.first( |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
79 where: { |
161
3913aff613e8
Fix bug that didn't request API on symbol change
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
160
diff
changeset
|
80 $0.baseSymbol == currencyConversion.baseSymbol && $0.quoteSymbol == currencyConversion.quoteSymbol |
158
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
81 }) |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
82 |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
83 guard let _ = favoritePair else { return false } |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
84 |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
85 return true |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
86 } |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
87 |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
88 private func animate() { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
89 scale += 0.2 |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
90 DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { |
82bd84c5973c
Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
156
diff
changeset
|
91 scale -= 0.2 |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
92 } |
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 |
53
b0bce2c8e4a9
Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
50
diff
changeset
|
96 struct FavoriteButton_Previews: PreviewProvider { |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
97 static var previews: some View { |
161
3913aff613e8
Fix bug that didn't request API on symbol change
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
160
diff
changeset
|
98 FavoriteButton(currencyConversion: CurrencyConversion()) |
21
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
99 } |
c3dda63f50ed
Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff
changeset
|
100 } |