annotate Simoleon/UI/FavoriteButton.swift @ 160:0c589138a6f3

Implement Conversion Box
author Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
date Sun, 29 Aug 2021 19:04:34 +0100
parents 82bd84c5973c
children 3913aff613e8
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 {
160
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 158
diff changeset
11 @ObservedObject var currencyPair: CurrencyPair
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
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
16 var body: some View {
158
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
17 Button(action: {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
18 animate()
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
19 if isFavorite() {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
20 remove()
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
21 } else {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
22 add()
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
23 }
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
24 }) {
27
d95582268b44 Fix bug CoreData and minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 26
diff changeset
25 RoundedRectangle(cornerRadius: 15)
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
26 .foregroundColor(Color(.secondarySystemBackground))
27
d95582268b44 Fix bug CoreData and minor UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 26
diff changeset
27 .frame(width: 60, height: 60)
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
28 .overlay(
158
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
29 VStack {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
30 if isFavorite() {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
31 Image(systemName: "star.fill")
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
32 } else {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
33 Image(systemName: "star")
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
34 }
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
35 }
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
36 .font(.system(size: 28))
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
37 .foregroundColor(Color(.systemYellow))
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
38 )
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
39 }
158
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
40 .scaleEffect(scale)
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
41 .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
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 func add() {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
45 let favoritePair = FavoritePair(context: viewContext)
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
46 favoritePair.baseSymbol = currencyPair.baseSymbol
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
47 favoritePair.quoteSymbol = currencyPair.quoteSymbol
42
d25b02d439d4 Minor updates subscription and legal requirements
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 27
diff changeset
48
158
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
49 do {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
50 try viewContext.save()
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
51 } catch {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
52 let nsError = error as NSError
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
53 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
54 }
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
55 }
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
56
158
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
57 func remove() {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
58 let favoritePair = favoritePairs.first(
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
59 where: {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
60 $0.baseSymbol == currencyPair.baseSymbol && $0.quoteSymbol == currencyPair.quoteSymbol
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
61 })
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
62
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
63 viewContext.delete(favoritePair!)
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
64
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
65 do {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
66 try viewContext.save()
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
67 } catch {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
68 let nsError = error as NSError
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
69 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
70 }
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
158
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
73 func isFavorite() -> Bool {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
74 let favoritePair = favoritePairs.first(
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
75 where: {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
76 $0.baseSymbol == currencyPair.baseSymbol && $0.quoteSymbol == currencyPair.quoteSymbol
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
77 })
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
78
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
79 guard let _ = favoritePair else { return false }
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
80
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
81 return true
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
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
84 private func animate() {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
85 scale += 0.2
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
86 DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
82bd84c5973c Implemented Favorite Button
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
87 scale -= 0.2
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 }
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
90 }
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
91
53
b0bce2c8e4a9 Refactor UK spelling to US
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 50
diff changeset
92 struct FavoriteButton_Previews: PreviewProvider {
21
c3dda63f50ed Added Core Data and UI changes
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
93 static var previews: some View {
160
0c589138a6f3 Implement Conversion Box
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 158
diff changeset
94 FavoriteButton(currencyPair: CurrencyPair())
21
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 }