Mercurial > public > lazybear
annotate LazyBear/Views/Profile/ProfileView.swift @ 392:13f3578def61
Implement create watchlist
author | Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com> |
---|---|
date | Sat, 01 May 2021 13:11:32 +0200 |
parents | 8ec37b2baafd |
children | 0a4c399170c4 |
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 |
13f3578def61
Implement create watchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
391
diff
changeset
|
14 @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
|
15 @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
16 var watchlistCompanies: FetchedResults<WatchlistCompany> |
391
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
17 |
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
18 @State private var showCreateNewWatchlist = false |
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 { |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
23 List { |
391
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
24 |
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
25 // 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
|
26 let watchlists = Set(watchlistCompanies.map { $0.watchlist }) // Set -> avoid duplicates names |
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
|
27 |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
28 ForEach(Array(watchlists), id: \.self) { watchlist in |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
29 let symbols = watchlistCompanies.filter({ $0.watchlist == watchlist }).map { $0.symbol } |
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
|
30 |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
31 if let companies = profile.data.quotes { |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
32 let filteredCompanies = companies.filter({ symbols.contains($0.key) }) |
387
c206bd0bdb4e
Implementing RenameSheet.swift
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
379
diff
changeset
|
33 StockRow(listName: watchlist, |
c206bd0bdb4e
Implementing RenameSheet.swift
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
379
diff
changeset
|
34 list: filteredCompanies, |
c206bd0bdb4e
Implementing RenameSheet.swift
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
379
diff
changeset
|
35 intradayPrices: profile.data.intradayPrices, |
c206bd0bdb4e
Implementing RenameSheet.swift
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
379
diff
changeset
|
36 addOnDelete: true |
c206bd0bdb4e
Implementing RenameSheet.swift
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
379
diff
changeset
|
37 ) |
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
|
38 .onAppear { updateRows(symbols.count, filteredCompanies.count) } |
387
c206bd0bdb4e
Implementing RenameSheet.swift
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
379
diff
changeset
|
39 .listRowInsets(EdgeInsets()) |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
40 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
41 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
42 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
43 .navigationTitle("My profile") |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
44 .navigationBarTitleDisplayMode(.inline) |
388
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
45 .toolbar { |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
46 ToolbarItem(placement: .navigationBarTrailing) { |
391
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
47 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
|
48 Image(systemName: "plus") |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
49 } |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
50 } |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
51 } |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
52 } |
392
13f3578def61
Implement create watchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
391
diff
changeset
|
53 .fullScreenCover(isPresented: $showCreateNewWatchlist) { |
391
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
54 CreateNewWatchlist() |
392
13f3578def61
Implement create watchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
391
diff
changeset
|
55 .environment(\.managedObjectContext, self.moc) |
391
8ec37b2baafd
Implementing CreateNewWatchlist
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
390
diff
changeset
|
56 } |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
57 } else { |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
58 ProgressView() |
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
|
59 .onAppear { prepareUrl(isInitRequest: true) } |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
60 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
61 } |
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
62 |
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
|
63 private func prepareUrl(isInitRequest: Bool) { |
388
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
64 if watchlistCompanies.isEmpty { |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
65 profile.showView = true |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
66 } else { |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
67 let symbols = watchlistCompanies.map { $0.symbol } // Get symbols in watchlists |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
68 var url = "https://api.lazybear.app/profile/type=init/symbols=" |
378
6802c2393203
Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
377
diff
changeset
|
69 |
388
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
70 var counter = 0 |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
71 for symbol in symbols { |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
72 counter += 1 |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
73 if counter == 1 { |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
74 url += symbol |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
75 } else { |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
76 url += ",\(symbol)" |
79c39987aaa4
Implementing Watchlists in ProfileView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
387
diff
changeset
|
77 } |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
78 } |
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
|
79 profile.request(url, isInitRequest: isInitRequest) |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
80 } |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
81 } |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
82 |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
83 /* |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
84 If Core Data changes, companies is not updated because the API request is not called -> |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
85 Check if symbols.count (Core Data) is equal to filteredCompanies -> if not -> call API |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
86 */ |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
87 private func updateRows(_ numberOfCoreDataCompanies: Int, _ numberOfApiRequestedCompanies: Int) { |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
88 if numberOfCoreDataCompanies != numberOfApiRequestedCompanies { |
6303385b3629
Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
389
diff
changeset
|
89 prepareUrl(isInitRequest: true) // Call API |
377
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
90 } |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
91 } |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
92 } |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
93 |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
94 struct ProfileView_Previews: PreviewProvider { |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
95 static var previews: some View { |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
96 ProfileView() |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
97 } |
d01859776fe6
ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
375
diff
changeset
|
98 } |