Mercurial > public > lazybear
annotate LazyBear/Views/Profile/ProfileView.swift @ 408:f9611c94d636
Fixes #45
author | Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com> |
---|---|
date | Sun, 06 Jun 2021 17:39:22 +0200 |
parents | fd8df65927e9 |
children | e24c9ca71824 |
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 |
399
5c99883c7964
Implementing networking in CompanyView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
394
diff
changeset
|
18 |
5c99883c7964
Implementing networking in CompanyView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
394
diff
changeset
|
19 // Set recurrent price request |
5c99883c7964
Implementing networking in CompanyView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
394
diff
changeset
|
20 @State private var timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
21 |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
22 var body: some View { |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
23 if profile.showView { |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
24 NavigationView { |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
25 List { |
391
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
26 // Get Watchlist names -> Create rows for each watchlist -> in each row, show companies |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
27 let watchlists = Set(watchlistCompanies.map { $0.watchlist }) // Set -> avoid duplicates names |
394
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
28 |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
29 ForEach(Array(watchlists).sorted(), id: \.self) { listName in |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
30 let symbols = watchlistCompanies.filter({ $0.watchlist == listName }).map { $0.symbol } |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
31 |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
32 if let companies = profile.data.quotes { |
394
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
33 // Select from API requested companies only the ones withing the watchlist |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
34 let list = companies.filter({ symbols.contains($0.key) }) |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
35 StockRow(listName: listName, list: list, intradayPrices: profile.data.intradayPrices, addOnDelete: true) |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
36 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
37 } |
394
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
38 .listRowInsets(EdgeInsets()) |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
39 .onAppear { // Refresh API requested companies when Core Data changes |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
40 refreshList() |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
41 } |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
42 } |
399
5c99883c7964
Implementing networking in CompanyView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
394
diff
changeset
|
43 .onAppear { self.timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() } // Start timer |
5c99883c7964
Implementing networking in CompanyView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
394
diff
changeset
|
44 .onDisappear { self.timer.upstream.connect().cancel() } // Stop timer |
408
f9611c94d636
Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
405
diff
changeset
|
45 .onReceive(timer) { _ in |
f9611c94d636
Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
405
diff
changeset
|
46 if !showCreateNewWatchlist { |
f9611c94d636
Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
405
diff
changeset
|
47 prepareUrl(.streaming) |
f9611c94d636
Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
405
diff
changeset
|
48 } |
f9611c94d636
Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
405
diff
changeset
|
49 } |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
50 .navigationTitle("My profile") |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
51 .navigationBarTitleDisplayMode(.inline) |
388
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
52 .toolbar { |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
53 ToolbarItem(placement: .navigationBarTrailing) { |
391
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
54 Button(action: { showCreateNewWatchlist = true }) { |
388
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
55 Image(systemName: "plus") |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
56 } |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
57 } |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
58 } |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
59 } |
392
13f3578def61
Implement create watchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
391
diff
changeset
|
60 .fullScreenCover(isPresented: $showCreateNewWatchlist) { |
393
0a4c399170c4
Implementing WatchlistCreator
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
392
diff
changeset
|
61 WatchlistCreator() |
392
13f3578def61
Implement create watchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
391
diff
changeset
|
62 .environment(\.managedObjectContext, self.moc) |
391
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
63 } |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
64 } else { |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
65 ProgressView() |
408
f9611c94d636
Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
405
diff
changeset
|
66 .onAppear { |
f9611c94d636
Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
405
diff
changeset
|
67 print("Appeared") |
f9611c94d636
Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
405
diff
changeset
|
68 prepareUrl(.initial) } |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
69 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
70 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
71 |
393
0a4c399170c4
Implementing WatchlistCreator
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
392
diff
changeset
|
72 /* |
394
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
73 Get symbols in watchlists -> Prepare url -> Request |
393
0a4c399170c4
Implementing WatchlistCreator
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
392
diff
changeset
|
74 */ |
401
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
75 private func prepareUrl(_ requestType: RequestType) { |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
76 let symbols = watchlistCompanies.map { $0.symbol } |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
77 |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
78 var symbolString = "" |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
79 for (index, symbol) in symbols.enumerated() { |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
80 if index == 0 { |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
81 symbolString += symbol |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
82 } else { |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
83 symbolString += ",\(symbol)" |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
84 } |
401
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
85 } |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
86 |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
87 switch requestType { |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
88 case .initial: |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
89 let url = "https://api.lazybear.app/profile/type=init/symbols=\(symbolString)" |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
90 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
|
91 |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
92 default: |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
93 let url = "https://api.lazybear.app/profile/type=streaming/symbols=\(symbolString)" |
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
94 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
|
95 } |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
96 } |
401
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
97 |
394
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
98 |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
99 /* |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
100 When a company is added to a watchlist or a new watchlist is created -> call function |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
101 to make the API request and refresh correctly the list |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
102 */ |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
103 private func refreshList() { |
405
fd8df65927e9
Implementing CapsuleChart in insiders
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
401
diff
changeset
|
104 // print("Companies in watchlist -> \(watchlistCompanies.count)") |
fd8df65927e9
Implementing CapsuleChart in insiders
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
401
diff
changeset
|
105 // print("Companies requested -> \(profile.data.quotes!.count)") |
394
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
106 |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
107 if profile.data.quotes!.count < watchlistCompanies.count { |
401
f843c6382529
Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
399
diff
changeset
|
108 prepareUrl(.initial) |
394
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
109 } |
4c90e5b18632
Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
393
diff
changeset
|
110 } |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
111 } |
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 struct ProfileView_Previews: PreviewProvider { |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
114 static var previews: some View { |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
115 ProfileView() |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
116 } |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
117 } |