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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }