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