# HG changeset patch # User Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com> # Date 1612477740 -3600 # Node ID 4e920489a57e5d58ebc9cdef65549c5d18677052 # Parent 33e03e2863f6c534f27fd499c95fe8f25c137108 Implement BusinessNews module diff -r 33e03e2863f6 -r 4e920489a57e LazyBear.xcodeproj/project.pbxproj --- a/LazyBear.xcodeproj/project.pbxproj Thu Feb 04 20:36:33 2021 +0100 +++ b/LazyBear.xcodeproj/project.pbxproj Thu Feb 04 23:29:00 2021 +0100 @@ -24,6 +24,9 @@ 958B678525C42B2400BF9F89 /* ApiAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958B678425C42B2400BF9F89 /* ApiAccess.swift */; }; 9597CE0125C1DC0A004DDFED /* LogoModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9597CE0025C1DC0A004DDFED /* LogoModifier.swift */; }; 9597CE0425C1DFE7004DDFED /* LogoPlaceholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9597CE0325C1DFE7004DDFED /* LogoPlaceholder.swift */; }; + 959D28DC25CC99710029F689 /* NewsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 959D28DB25CC99710029F689 /* NewsModel.swift */; }; + 959D28DF25CC9A1A0029F689 /* News.swift in Sources */ = {isa = PBXBuildFile; fileRef = 959D28DE25CC9A1A0029F689 /* News.swift */; }; + 959D28E225CC9B370029F689 /* NewsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 959D28E125CC9B370029F689 /* NewsRow.swift */; }; 95AB4A7A259DCBAE0064C9C1 /* ReadJson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AB4A79259DCBAE0064C9C1 /* ReadJson.swift */; }; 95AB4A7D259DCC0C0064C9C1 /* CompanyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AB4A7C259DCC0C0064C9C1 /* CompanyModel.swift */; }; 95AB4A90259DD66D0064C9C1 /* CompanyRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AB4A8F259DD66D0064C9C1 /* CompanyRow.swift */; }; @@ -70,6 +73,9 @@ 958B678425C42B2400BF9F89 /* ApiAccess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ApiAccess.swift; path = lazybear/ApiAccess.swift; sourceTree = SOURCE_ROOT; }; 9597CE0025C1DC0A004DDFED /* LogoModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoModifier.swift; sourceTree = ""; }; 9597CE0325C1DFE7004DDFED /* LogoPlaceholder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoPlaceholder.swift; sourceTree = ""; }; + 959D28DB25CC99710029F689 /* NewsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = NewsModel.swift; path = lazybear/Models/NewsModel.swift; sourceTree = SOURCE_ROOT; }; + 959D28DE25CC9A1A0029F689 /* News.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = News.swift; path = lazybear/Views/News.swift; sourceTree = SOURCE_ROOT; }; + 959D28E125CC9B370029F689 /* NewsRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = NewsRow.swift; path = lazybear/Views/NewsRow.swift; sourceTree = SOURCE_ROOT; }; 95AB4A79259DCBAE0064C9C1 /* ReadJson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ReadJson.swift; path = LazyBear/Jobs/ReadJson.swift; sourceTree = SOURCE_ROOT; }; 95AB4A7C259DCC0C0064C9C1 /* CompanyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CompanyModel.swift; path = lazybear/Models/CompanyModel.swift; sourceTree = SOURCE_ROOT; }; 95AB4A8F259DD66D0064C9C1 /* CompanyRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompanyRow.swift; sourceTree = ""; }; @@ -135,6 +141,7 @@ 95FE646A25C30B880052832E /* ApiModel.swift */, 954DDF0325C456E800848A4B /* QuoteModel.swift */, 95363CE125C87CF000B74131 /* InsiderTransactionModel.swift */, + 959D28DB25CC99710029F689 /* NewsModel.swift */, ); path = Models; sourceTree = ""; @@ -162,6 +169,8 @@ 9520F0B425C7131300692610 /* LineChart.swift */, 95363CE525C87FEC00B74131 /* InsiderTransactions.swift */, 95363CE925C8858800B74131 /* TransactionRow.swift */, + 959D28DE25CC9A1A0029F689 /* News.swift */, + 959D28E125CC9B370029F689 /* NewsRow.swift */, ); path = Views; sourceTree = ""; @@ -312,8 +321,10 @@ 95F6F45C25C20D8D002AC66A /* Price.swift in Sources */, 9597CE0125C1DC0A004DDFED /* LogoModifier.swift in Sources */, 954DDF0425C456E800848A4B /* QuoteModel.swift in Sources */, + 959D28E225CC9B370029F689 /* NewsRow.swift in Sources */, 9520F0B525C7131300692610 /* LineChart.swift in Sources */, 9597CE0425C1DFE7004DDFED /* LogoPlaceholder.swift in Sources */, + 959D28DF25CC9A1A0029F689 /* News.swift in Sources */, 95FE646B25C30B880052832E /* ApiModel.swift in Sources */, 95363CE625C87FEC00B74131 /* InsiderTransactions.swift in Sources */, 95F6C30525BAF599003CF389 /* CompanyHeader.swift in Sources */, @@ -326,6 +337,7 @@ 95B04EB525212369000AD27F /* ContentView.swift in Sources */, 95AB4A90259DD66D0064C9C1 /* CompanyRow.swift in Sources */, 95F6C30125BAEC8B003CF389 /* CompanyView.swift in Sources */, + 959D28DC25CC99710029F689 /* NewsModel.swift in Sources */, 95F6C30925BAF7C2003CF389 /* DateSelection.swift in Sources */, 95F6C2F025BAE2ED003CF389 /* Company.swift in Sources */, 95F6F46125C20E63002AC66A /* ListHeader.swift in Sources */, diff -r 33e03e2863f6 -r 4e920489a57e LazyBear.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate Binary file LazyBear.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed diff -r 33e03e2863f6 -r 4e920489a57e lazybear/Models/NewsModel.swift --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Models/NewsModel.swift Thu Feb 04 23:29:00 2021 +0100 @@ -0,0 +1,17 @@ +// +// NewsModel.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 4/2/21. +// + +import SwiftUI + +struct NewsModel: Codable, Hashable { + var datetime: Int? + var headline: String? + var source: String? + var url: String? + var summary: String? + var image: String? +} diff -r 33e03e2863f6 -r 4e920489a57e lazybear/Views/Company.swift --- a/lazybear/Views/Company.swift Thu Feb 04 20:36:33 2021 +0100 +++ b/lazybear/Views/Company.swift Thu Feb 04 23:29:00 2021 +0100 @@ -13,9 +13,6 @@ let persistenceController = PersistenceController.shared - var views = ["Stock", "Insiders"] - @State private var selectedView = 0 - var body: some View { VStack { CompanyHeader(name: self.name, symbol: self.symbol) @@ -27,14 +24,14 @@ Stock(name: name, symbol: symbol, lineChartHeight: geo.size.height*0.2) .padding(.bottom) - + News(symbol: symbol) } .environment(\.managedObjectContext, persistenceController.container.viewContext) } } .tabItem { - Image(systemName: "1.circle") - Text("First") + Image(systemName: "chart.bar.fill") + Text("Stock") }.tag(0) // Second view @@ -42,8 +39,8 @@ InsiderTransactions(symbol: symbol) } .tabItem { - Image(systemName: "2.circle") - Text("Second") + Image(systemName: "chart.pie.fill") + Text("Insiders") }.tag(1) } } diff -r 33e03e2863f6 -r 4e920489a57e lazybear/Views/News.swift --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/News.swift Thu Feb 04 23:29:00 2021 +0100 @@ -0,0 +1,52 @@ +// +// News.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 4/2/21. +// + +import SwiftUI + +struct News: View { + var symbol: String + @EnvironmentObject var apiAccess: ApiAccess + + // <--------- API Job ---------> + @State private var url = String() { + didSet { request(url: url, model: [NewsModel].self) { self.news = $0 } }} + + @State private var news = [NewsModel]() + // <--------- API Job ---------> + + var body: some View { + Text("Business news") + .font(.title) + .fontWeight(.semibold) + .padding([.leading, .top]) + + Divider() + + VStack { + ForEach(news, id: \.self) { new in + NewsRow(new: new) + } + } + .onAppear { getUrl() } + } + + + private func getUrl() { + // 1 -> Sandbox / 2 -> Production + let baseUrl = apiAccess.results[2].url ?? "" + let token = apiAccess.results[2].key ?? "" + let path = "/stable/stock/\(symbol)/news/last/10?token=" + + self.url = baseUrl + path + token + } +} + +struct News_Previews: PreviewProvider { + static var previews: some View { + News(symbol: "aapl") + } +} diff -r 33e03e2863f6 -r 4e920489a57e lazybear/Views/NewsRow.swift --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/NewsRow.swift Thu Feb 04 23:29:00 2021 +0100 @@ -0,0 +1,54 @@ +// +// NewsRow.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 4/2/21. +// + +import SwiftUI + +struct NewsRow: View { + @State var new: NewsModel + + var body: some View { + VStack(alignment: .leading) { + Text(new.source ?? "-") + .font(.caption2) + + Text(new.headline ?? "-") + .font(.headline) + .fontWeight(.semibold) + .lineLimit(4) + + Text(new.summary ?? "-") + .lineLimit(3) + .font(.caption) + .padding(.top, 3) + + let (hours, minutes) = convertEpoch() + Text("\(hours) hours and \(minutes) minutes ago") + .font(.caption) + .fontWeight(.semibold) + .padding(.top, 3) + + Divider() + } + .padding([.leading, .trailing]) + } + + private func convertEpoch() -> (String, String) { + let now = Date() // Current date + let articlePublished = Date(timeIntervalSince1970: TimeInterval(new.datetime ?? 0)/1000) + + let calendar = Calendar.current + let components = calendar.dateComponents([.hour, .minute], from: articlePublished, to: now) + + return (String(components.hour ?? 0), String(components.minute ?? 0)) + } +} + +struct NewsRow_Previews: PreviewProvider { + static var previews: some View { + NewsRow(new: NewsModel(datetime: 248375623, headline: "Leak says Apple’s first mixed-reality headset will cost $3,000", source: "BGR", url: "", summary: "A new report lists the purported price and release date of Apple’s upcoming high-end mixed-reality (MR) glasses. The headset will supposedly retail for around $3,000 in 2022. The device will reportedly use cameras to track the wearer's hands, while internal sensors track eye movements. The headset is said to feature two 8K displays that will follow the eyes' movement, displaying the images that are in focus at high resolution, with objects in peripheral vision being shown at a lower resolution. Apple has been rumored more than once to be developing its own smart headgear that would work in tandem with other devices, like the iPhone or a Mac. The so-called Apple Glasses project has been the subject.", image: "")) + } +} diff -r 33e03e2863f6 -r 4e920489a57e lazybear/Views/Price.swift --- a/lazybear/Views/Price.swift Thu Feb 04 20:36:33 2021 +0100 +++ b/lazybear/Views/Price.swift Thu Feb 04 23:29:00 2021 +0100 @@ -14,8 +14,8 @@ @EnvironmentObject var apiAccess: ApiAccess // <--------- API Job ---------> + @State private var showingView = false @State private var url = String() { didSet { requestPrice() }} - @State private var showingView = false @State private var data = [QuoteModel]() { didSet { self.showingView = true }} // <--------- API Job --------->