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
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
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 }