annotate LazyBear/Views/Profile/ProfileView.swift @ 432:3ca32ff79630

Fixes RenameSheetList bug
author Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
date Sat, 19 Jun 2021 20:13:25 +0200
parents e707dbfc3115
children 5ca468751db2
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 {
6802c2393203 Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 377
diff changeset
23 List {
427
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
24 if let apiCompanies = profile.data.quotes {
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
25 let watchlistsNames = Array(Set(watchlistCompanies.map { $0.watchlistName })).sorted() /// Get watchlistsNames in Core Data
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
26 ForEach(watchlistsNames, id: \.self) { watchlistName in
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
27 let companies = createWatchlistRow(apiCompanies, watchlistCompanies, watchlistName)
432
3ca32ff79630 Fixes RenameSheetList bug
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 427
diff changeset
28 ProfileStockRow(watchlistName: watchlistName, companies: companies)
378
6802c2393203 Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 377
diff changeset
29 }
427
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
30 .listRowInsets(EdgeInsets())
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
31 .onAppear { /// Request API again when Core Data changes to update the list
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
32 refreshList()
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
33 }
394
4c90e5b18632 Fixes #46
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 393
diff changeset
34 }
378
6802c2393203 Implementing ProfileView (Watchlists)
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 377
diff changeset
35 }
424
6dd97877f575 Improve code, reorganize files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 417
diff changeset
36 .onAppear { self.timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() } /// Start timer
6dd97877f575 Improve code, reorganize files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 417
diff changeset
37 .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
38 .onReceive(timer) { _ in
f9611c94d636 Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 405
diff changeset
39 if !showCreateNewWatchlist {
f9611c94d636 Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 405
diff changeset
40 prepareUrl(.streaming)
f9611c94d636 Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 405
diff changeset
41 }
f9611c94d636 Fixes #45
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 405
diff changeset
42 }
378
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) {
393
0a4c399170c4 Implementing WatchlistCreator
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 392
diff changeset
54 WatchlistCreator()
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()
410
e24c9ca71824 Remove console comments
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 408
diff changeset
59 .onAppear { prepareUrl(.initial) }
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
393
0a4c399170c4 Implementing WatchlistCreator
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 392
diff changeset
63 /*
427
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
64 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
65 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
66 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
67 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
68 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
69 */
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
70 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
71 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
72
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
73 var companies = [CompanyModel]()
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
74 for watchlistSymbol in watchlistSymbols {
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
75 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
76 companies.append(company!)
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
77 }
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
78
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
79 return companies
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 /*
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
83 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
84 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
85 */
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
86 private func refreshList() {
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
87 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
88 prepareUrl(.initial)
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
89 }
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
90 }
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
91
e707dbfc3115 Fixing weird animation .onDelete
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 424
diff changeset
92 /*
417
5f21f7c23c5e Add comments and clean code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 410
diff changeset
93 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
94 */
401
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
95 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
96 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
97
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
98 var symbolString = ""
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
99 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
100 if index == 0 {
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
101 symbolString += symbol
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
102 } else {
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
103 symbolString += ",\(symbol)"
377
d01859776fe6 ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 375
diff changeset
104 }
401
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
105 }
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 switch requestType {
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
108 case .initial:
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
109 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
110 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
111
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
112 default:
f843c6382529 Add Enumeration to Networks files
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 399
diff changeset
113 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
114 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
115 }
6303385b3629 Companies added to watchlists now are correctly updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 389
diff changeset
116 }
377
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
d01859776fe6 ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 375
diff changeset
119 struct ProfileView_Previews: PreviewProvider {
d01859776fe6 ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 375
diff changeset
120 static var previews: some View {
d01859776fe6 ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 375
diff changeset
121 ProfileView()
d01859776fe6 ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 375
diff changeset
122 }
d01859776fe6 ProfileView updated
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 375
diff changeset
123 }