Mercurial > public > simoleon
annotate Simoleon/FavoritesView.swift @ 170:f4e0c414cf6d
minor UI changes
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Thu, 23 Sep 2021 15:14:48 +0200 |
parents | e4cbb1eea394 |
children |
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 } |