annotate Simoleon/FavoritesView.swift @ 166:e4cbb1eea394

Implement FavoritesView
author Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
date Sat, 11 Sep 2021 16:30:32 +0200
parents 84137052813d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
156
84137052813d Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 //
166
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
2 // FavoritesView.swift
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
3 // Simoleon
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
4 //
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
5 // Created by Dennis Concepción Martín on 19/07/2021.
156
84137052813d Refactor code
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
6 //
166
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
7
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
8 import SwiftUI
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
9
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
10 struct FavoritesView: View {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
11 @Environment(\.managedObjectContext) private var viewContext
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
12 @FetchRequest(
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
13 sortDescriptors: [NSSortDescriptor(keyPath: \FavoritePair.baseSymbol, ascending: true)],
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
14 animation: .default)
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
15 private var favoritePairs: FetchedResults<FavoritePair>
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
16
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
17 var body: some View {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
18 VStack {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
19 if favoritePairs.isEmpty {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
20 FavoritesPlaceholder()
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
21 } else {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
22 List {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
23 ForEach(favoritePairs, id:\.self) { favoritePair in
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
24 FavoritePairRow(favoritePair: favoritePair)
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
25 .padding(.vertical, 4)
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
26 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
27 .onDelete(perform: removeFromFavorites)
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
28 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
29 .listStyle(InsetGroupedListStyle())
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
30 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
31 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
32 .navigationTitle("Favorites")
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
33 .toolbar {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
34 #if os(iOS)
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
35 EditButton()
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
36 #endif
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
37 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
38 .if(UIDevice.current.userInterfaceIdiom == .phone) { content in
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
39 NavigationView { content }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
40 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
41 .onAppear {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
42 #if SCREENSHOTS
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
43 generateFavoritesForScreenshots()
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
44 #endif
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
45 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
46 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
47
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
48 private func removeFromFavorites(offsets: IndexSet) {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
49 withAnimation {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
50 offsets.map { favoritePairs[$0] }.forEach(viewContext.delete)
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
51
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
52 do {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
53 try viewContext.save()
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
54 } catch {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
55 let nsError = error as NSError
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
56 fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
57 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
58 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
59 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
60
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
61 #if SCREENSHOTS
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
62 /*
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
63 Save currencies to favourites to take screenshots for the App Store
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
64 */
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
65 private func generateFavoritesForScreenshots() {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
66 let pairs = ["EUR/USD", "BTC/USD", "USD/HKD", "USD/JPY", "AUD/USD",
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
67 "XAU/GBP", "DASH/ETH", "EUR/USD", "XAG/CAD"]
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
68
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
69 for pair in pairs {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
70 let symbols = pair.components(separatedBy: "/")
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
71 let favoritePair = favoritePairs.first(
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
72 where: {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
73 $0.baseSymbol == symbols[0] && $0.quoteSymbol == symbols[1]
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
74 })
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
75
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
76 if let _ = favoritePair {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
77 // Do not save to core data again
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
78 } else {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
79 let favoritePair = FavoritePair(context: viewContext)
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
80 favoritePair.baseSymbol = symbols[0]
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
81 favoritePair.quoteSymbol = symbols[1]
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
82 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
83
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
84 do {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
85 try viewContext.save()
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
86 } catch {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
87 let nsError = error as NSError
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
88 fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
89 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
90 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
91 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
92 #endif
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
93 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
94
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
95 struct FavoritesView_Previews: PreviewProvider {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
96 static var previews: some View {
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
97 FavoritesView()
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
98 .environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
99 }
e4cbb1eea394 Implement FavoritesView
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents: 156
diff changeset
100 }