annotate LazyBearWatchOS Extension/Views/Home/HomeView.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 8621ba6fd457
children 37c13ebda381
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
447
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
1 //
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
2 // HomeView.swift
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
3 // LazyBearWatchOS Extension
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
4 //
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
5 // Created by Dennis Concepción Martín on 22/6/21.
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
6 //
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
7
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
8 import SwiftUI
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
9 import CoreData
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
10
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
11 struct HomeView: View {
452
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
12 @ObservedObject var profile = Profile()
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
13
447
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
14 @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: [])
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
15 var watchlistCompanies: FetchedResults<WatchlistCompany>
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
16
452
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
17 @State private var timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() /// Set recurrent price request
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
18
447
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
19 var body: some View {
452
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
20 if profile.showView {
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
21 NavigationView {
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
22 ScrollView {
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
23 VStack {
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
24 if let companies = profile.data.quotes {
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
25 ForEach(companies, id: \.self) { company in
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
26 CompanyRow(company: company)
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
27 }
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
28 }
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
29 }
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
30 }
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
31 .navigationTitle("Lazybear")
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
32 .onAppear { self.timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() } /// Start timer
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
33 .onDisappear { self.timer.upstream.connect().cancel() } /// Stop timer
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
34 .onReceive(timer) { _ in prepareUrl(.streaming) }
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
35 }
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
36 } else {
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
37 ProgressView()
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
38 .onAppear { prepareUrl(.initial) }
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
39 }
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
40 }
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
41
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
42 /*
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
43 Get symbols in watchlists (Core Data) -> Prepare url -> Request
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
44 */
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
45 private func prepareUrl(_ requestType: RequestType) {
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
46 let symbols = Set(watchlistCompanies.map { $0.symbol })
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
47 let symbolsString = symbols.joined(separator:",")
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
48
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
49 switch requestType {
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
50 case .initial:
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
51 let url = "https://api.lazybear.app/profile/type=initial/symbols=\(symbolsString)"
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
52 profile.request(url, .initial)
447
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
53
452
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
54 default:
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
55 let url = "https://api.lazybear.app/profile/type=streaming/symbols=\(symbolsString)"
bb69f9d1d20f Implement HomeView in WatchOS
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents: 447
diff changeset
56 profile.request(url, .streaming)
447
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
57 }
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
58 }
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
59 }
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
60
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
61 struct HomeView_Previews: PreviewProvider {
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
62 static var previews: some View {
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
63 HomeView()
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
64 }
8621ba6fd457 Fixes #48
Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
parents:
diff changeset
65 }