Mercurial > public > lazybear
annotate LazyBear/Views/Profile/ProfileView.swift @ 452:bb69f9d1d20f
Implement HomeView in WatchOS
author | Dennis Concepción Martín <dennisconcepcionmartin@gmail.com> |
---|---|
date | Sat, 26 Jun 2021 18:45:31 +0200 |
parents | 417148200aaf |
children |
rev | line source |
---|---|
341
4e6c47a81b80
Testing UserProfile
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
1 // |
4e6c47a81b80
Testing UserProfile
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
2 // ProfileView.swift |
4e6c47a81b80
Testing UserProfile
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
3 // LazyBear |
4e6c47a81b80
Testing UserProfile
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
4 // |
4e6c47a81b80
Testing UserProfile
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
5 // Created by Dennis Concepción Martín on 4/4/21. |
4e6c47a81b80
Testing UserProfile
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
6 // |
4e6c47a81b80
Testing UserProfile
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
7 |
4e6c47a81b80
Testing UserProfile
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
8 import SwiftUI |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
9 import CoreData |
341
4e6c47a81b80
Testing UserProfile
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
10 |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
11 struct ProfileView: View { |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
12 @ObservedObject var profile = Profile() |
392
13f3578def61
Implement create watchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
391
diff
changeset
|
13 @Environment(\.managedObjectContext) private var moc |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
14 @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
15 var watchlistCompanies: FetchedResults<WatchlistCompany> |
394
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
16 |
391
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
17 @State private var showCreateNewWatchlist = false |
417
5f21f7c23c5e
Add comments and clean code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
410
diff
changeset
|
18 @State private var timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() /// Set recurrent price request |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
19 |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
20 var body: some View { |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
21 if profile.showView { |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
22 NavigationView { |
441
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
23 ScrollView(showsIndicators: false) { |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
24 VStack { |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
25 if let apiCompanies = profile.data.quotes { |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
26 let watchlistsNames = Array(Set(watchlistCompanies.map { $0.watchlistName })).sorted() /// Get watchlistsNames in Core Data |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
27 ForEach(watchlistsNames, id: \.self) { watchlistName in |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
28 let companies = createWatchlistRow(apiCompanies, watchlistCompanies, watchlistName) |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
29 ProfileStockRow(watchlistName: watchlistName, companies: companies) |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
30 } |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
31 .listRowInsets(EdgeInsets()) |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
32 .onAppear { /// Request API again when Core Data changes to update the list |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
33 refreshList() |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
34 } |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
35 } |
441
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
36 } |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
37 .onAppear { self.timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() } /// Start timer |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
38 .onDisappear { self.timer.upstream.connect().cancel() } /// Stop timer |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
39 .onReceive(timer) { _ in |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
40 if !showCreateNewWatchlist { |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
41 prepareUrl(.streaming) |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
42 } |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
43 } |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
44 .navigationTitle("My profile") |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
45 .toolbar { |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
46 ToolbarItem(placement: .navigationBarTrailing) { |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
47 Button(action: { showCreateNewWatchlist = true }) { |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
48 Image(systemName: "plus") |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
49 } |
427
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
50 } |
394
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
51 } |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
52 } |
441
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
53 .background(Color("customBackground").edgesIgnoringSafeArea(.all)) |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
54 .fullScreenCover(isPresented: $showCreateNewWatchlist) { |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
55 WatchlistCreator() |
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
56 .environment(\.managedObjectContext, self.moc) |
388
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
57 } |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
58 } |
441
417148200aaf
Change background color and minor UI updates
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
437
diff
changeset
|
59 .navigationViewStyle(StackNavigationViewStyle()) |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
60 } else { |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
61 ProgressView() |
410
e24c9ca71824
Remove console comments
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
408
diff
changeset
|
62 .onAppear { prepareUrl(.initial) } |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
63 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
64 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
65 |
393
0a4c399170c4
Implementing WatchlistCreator
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
392
diff
changeset
|
66 /* |
427
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
67 At this point, we have the API response with the watchlist companies data requested and received. Now, we have to extract from the API response |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
68 the companies within the selected watchlist. To do that, we should do the following: |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
69 1) Get an array of all the symbols within the specified watchlist. |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
70 2) Iterate over watchlistSymbols and return the company (QuoteModel object) from apiCompanies that matches. |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
71 3) Append this symbol to a new array. |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
72 */ |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
73 private func createWatchlistRow(_ apiCompanies: [CompanyModel], _ watchlistCompanies: FetchedResults<WatchlistCompany>, _ watchlistName: String) -> [CompanyModel] { |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
74 let watchlistSymbols = watchlistCompanies.filter({ $0.watchlistName == watchlistName }).map { $0.symbol } /// Get symbols contained in watchlistsName (Core Data) |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
75 |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
76 var companies = [CompanyModel]() |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
77 for watchlistSymbol in watchlistSymbols { |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
78 let company = apiCompanies.first(where: { $0.symbol == watchlistSymbol }) |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
79 companies.append(company!) |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
80 } |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
81 |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
82 return companies |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
83 } |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
84 |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
85 /* |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
86 When a company is added to a watchlist or a new watchlist is created -> call function |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
87 to make the API request and refresh correctly the list |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
88 */ |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
89 private func refreshList() { |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
90 if profile.data.quotes!.count < watchlistCompanies.count { |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
91 prepareUrl(.initial) |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
92 } |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
93 } |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
94 |
e707dbfc3115
Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
424
diff
changeset
|
95 /* |
417
5f21f7c23c5e
Add comments and clean code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
410
diff
changeset
|
96 Get symbols in watchlists (Core Data) -> Prepare url -> Request |
393
0a4c399170c4
Implementing WatchlistCreator
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
392
diff
changeset
|
97 */ |
401
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
98 private func prepareUrl(_ requestType: RequestType) { |
452
bb69f9d1d20f
Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
441
diff
changeset
|
99 let symbols = Set(watchlistCompanies.map { $0.symbol }) |
bb69f9d1d20f
Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
441
diff
changeset
|
100 let symbolsString = symbols.joined(separator:",") |
401
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
101 |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
102 switch requestType { |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
103 case .initial: |
452
bb69f9d1d20f
Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
441
diff
changeset
|
104 let url = "https://api.lazybear.app/profile/type=initial/symbols=\(symbolsString)" |
401
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
105 profile.request(url, .initial) |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
106 |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
107 default: |
452
bb69f9d1d20f
Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
441
diff
changeset
|
108 let url = "https://api.lazybear.app/profile/type=streaming/symbols=\(symbolsString)" |
401
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
109 profile.request(url, .streaming) |
390
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
110 } |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
111 } |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
112 } |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
113 |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
114 struct ProfileView_Previews: PreviewProvider { |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
115 static var previews: some View { |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
116 ProfileView() |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
117 } |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
118 } |