Mercurial > public > lazybear
changeset 259:23e48c2d153d
Change url API management
author | Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com> |
---|---|
date | Sat, 13 Mar 2021 14:18:46 +0100 |
parents | 471906e56feb |
children | deb436f21e88 |
files | LazyBear/CompanyOption.swift LazyBear/CompanyType.swift LazyBear/Functions/GetUrl.swift LazyBear/Tests/TestSafari.swift LazyBear/UI/ChartView.swift LazyBear/UI/CompanyView.swift LazyBear/UI/InsiderSummary.swift LazyBear/UI/InsiderTransactions.swift LazyBear/UI/NewsView.swift LazyBear/UI/PriceView.swift |
diffstat | 10 files changed, 108 insertions(+), 81 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LazyBear/CompanyOption.swift Sat Mar 13 14:18:46 2021 +0100 @@ -0,0 +1,20 @@ +// +// CompanyOption.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 13/3/21. +// + +import SwiftUI + +struct CompanyOption: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +struct CompanyOption_Previews: PreviewProvider { + static var previews: some View { + CompanyOption() + } +}
--- a/LazyBear/CompanyType.swift Fri Mar 12 20:48:42 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -// -// CompanyType.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 12/3/21. -// - -import SwiftUI - -class CompanyType: ObservableObject { - @Published var view = ViewType.stock -} - -enum ViewType { - case stock, insiders -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LazyBear/Functions/GetUrl.swift Sat Mar 13 14:18:46 2021 +0100 @@ -0,0 +1,34 @@ +// +// GetUrl.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 13/3/21. +// + +import SwiftUI + +enum Endpoint { + case quote + case news + case historicalPrices + case insiderTransactions + case insiderSummary +} + +func getUrl(endpoint: Endpoint, symbol: String, range: String = "") -> String { + let baseUrl = Bundle.main.infoDictionary?["IEX_URL"] as? String ?? "Empty url" + let apiKey = Bundle.main.infoDictionary?["IEX_API"] as? String ?? "Empty key" + + switch endpoint { + case .quote: + return "\(baseUrl)/stock/\(symbol)/quote?token=\(apiKey)" + case .news: + return "\(baseUrl)/stock/\(symbol)/news/last/30?token=\(apiKey)" + case .historicalPrices: + return "\(baseUrl)/stock/\(symbol)/chart/\(range)?chartCloseOnly=true&token=\(apiKey)" + case .insiderTransactions: + return "\(baseUrl)/stock/\(symbol)/insider-transactions?token=\(apiKey)" + case .insiderSummary: + return "\(baseUrl)/stock/\(symbol)/insider-roster?token=\(apiKey)" + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LazyBear/Tests/TestSafari.swift Sat Mar 13 14:18:46 2021 +0100 @@ -0,0 +1,20 @@ +// +// TestSafari.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 13/3/21. +// + +import SwiftUI + +struct TestSafari: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +struct TestSafari_Previews: PreviewProvider { + static var previews: some View { + TestSafari() + } +}
--- a/LazyBear/UI/ChartView.swift Fri Mar 12 20:48:42 2021 +0100 +++ b/LazyBear/UI/ChartView.swift Sat Mar 13 14:18:46 2021 +0100 @@ -22,7 +22,8 @@ DateSelection(period: period, selectedperiod: $selectedPeriod) .padding(.horizontal) .onChange(of: selectedPeriod, perform: { (value) in - request(url: getUrl(range: period[value]), model: [HistoricalPriceModel].self) { self.historicalPrices = $0 } + let url = getUrl(endpoint: .historicalPrices, symbol: symbol, range: period[value]) + request(url: url, model: [HistoricalPriceModel].self) { self.historicalPrices = $0 } }) let (colour, prices) = prepareChart() @@ -34,18 +35,11 @@ endPoint: .bottom))) } .onAppear { - request(url: getUrl(range: "3m"), model: [HistoricalPriceModel].self) { self.historicalPrices = $0 } + let url = getUrl(endpoint: .historicalPrices, symbol: symbol, range: "3m") + request(url: url, model: [HistoricalPriceModel].self) { self.historicalPrices = $0 } } } - private func getUrl(range: String) -> String { - let baseUrl = Bundle.main.infoDictionary?["IEX_URL"] as? String ?? "Empty url" - let apiKey = Bundle.main.infoDictionary?["IEX_API"] as? String ?? "Empty key" - let url = "\(baseUrl)/stock/\(symbol)/chart/\(range)?chartCloseOnly=true&token=\(apiKey)" - - return url - } - private func prepareChart() -> (Color, [Double]) { if !historicalPrices.isEmpty { // Historical is been requested and successfully received
--- a/LazyBear/UI/CompanyView.swift Fri Mar 12 20:48:42 2021 +0100 +++ b/LazyBear/UI/CompanyView.swift Sat Mar 13 14:18:46 2021 +0100 @@ -7,37 +7,41 @@ import SwiftUI +enum ViewType { + case stock, insiders +} + struct CompanyView: View { var name: String var symbol: String - @EnvironmentObject var hudManager: HudManager - @EnvironmentObject var companyType: CompanyType - @FetchRequest(entity: Company.entity(), sortDescriptors: []) var companies: FetchedResults<Company> + @EnvironmentObject var companyOption: CompanyOption @Environment(\.managedObjectContext) private var moc + @FetchRequest(entity: Company.entity(), sortDescriptors: []) + var companies: FetchedResults<Company> var body: some View { GeometryReader { geo in ScrollView { - if companyType.view == .stock { + if companyOption.view == .stock { PriceView(symbol: symbol) ChartView(symbol: symbol, chartHeight: geo.size.width / 2) NewsView(symbol: symbol) - } else if companyType.view == .insiders { + } else if companyOption.view == .insiders { InsiderSummary(symbol: symbol) InsiderTransactions(symbol: symbol) } } - .onAppear { companyType.view = .stock } + .onAppear { companyOption.view = .stock } } .toolbar { ToolbarItem(placement: .principal) { Button(action: { self.hudManager.showAction.toggle() }) { HStack { - if companyType.view == .stock { + if companyOption.view == .stock { Text("Stock") - } else if companyType.view == .insiders { + } else if companyOption.view == .insiders { Text("Insiders") } Image(systemName: "chevron.down") @@ -79,7 +83,7 @@ NavigationView { CompanyView(name: "apple inc", symbol: "aapl") .environmentObject(HudManager()) - .environmentObject(CompanyType()) + .environmentObject(CompanyOption()) .navigationTitle("APPL") } .navigationViewStyle(StackNavigationViewStyle())
--- a/LazyBear/UI/InsiderSummary.swift Fri Mar 12 20:48:42 2021 +0100 +++ b/LazyBear/UI/InsiderSummary.swift Sat Mar 13 14:18:46 2021 +0100 @@ -44,16 +44,9 @@ } } - private func getUrl() -> String { - let baseUrl = Bundle.main.infoDictionary?["IEX_URL"] as? String ?? "Empty url" - let apiKey = Bundle.main.infoDictionary?["IEX_API"] as? String ?? "Empty key" - let url = "\(baseUrl)/stock/\(symbol)/insider-roster?token=\(apiKey)" - - return url - } - private func generateChart() { - request(url: getUrl(), model: [TopInsiderModel].self) { topInsiders in + let url = getUrl(endpoint: .insiderSummary, symbol: symbol) + request(url: url, model: [TopInsiderModel].self) { topInsiders in let theme = userSettings.first?.theme?.lowercased() ?? "default" // Loop over the response var insiderNumber = 0
--- a/LazyBear/UI/InsiderTransactions.swift Fri Mar 12 20:48:42 2021 +0100 +++ b/LazyBear/UI/InsiderTransactions.swift Sat Mar 13 14:18:46 2021 +0100 @@ -37,17 +37,10 @@ } } .onAppear { - request(url: getUrl(), model: [InsiderTranModel].self) { self.transactions = $0 } + let url = getUrl(endpoint: .insiderTransactions, symbol: symbol) + request(url: url, model: [InsiderTranModel].self) { self.transactions = $0 } } } - - private func getUrl() -> String { - let baseUrl = Bundle.main.infoDictionary?["IEX_URL"] as? String ?? "Empty url" - let apiKey = Bundle.main.infoDictionary?["IEX_API"] as? String ?? "Empty key" - let url = "\(baseUrl)/stock/\(symbol)/insider-transactions?token=\(apiKey)" - - return url - } } struct InsiderTransactions_Previews: PreviewProvider {
--- a/LazyBear/UI/NewsView.swift Fri Mar 12 20:48:42 2021 +0100 +++ b/LazyBear/UI/NewsView.swift Sat Mar 13 14:18:46 2021 +0100 @@ -32,45 +32,38 @@ } let language = userSettings.first?.newsLanguage ?? "en" + let filteredNews = news.filter { $0.lang == language } // If iPhone if UIDevice.current.userInterfaceIdiom == .phone { - ForEach(news, id: \.self) { new in - if language == new.lang { - NewsRow(new: new) - .padding(.horizontal) - - Divider() - } + ForEach(filteredNews, id: \.self) { new in + NewsRow(new: new) + .padding(.horizontal) + + Divider() + } } // If iPad if UIDevice.current.userInterfaceIdiom == .pad { - WaterfallGrid(news, id: \.self) { new in + WaterfallGrid(filteredNews, id: \.self) { new in NewsRow(new: new) } .gridStyle( columnsInPortrait: 2, columnsInLandscape: 3, spacing: 8, - animation: .easeInOut(duration: 0.5) + animation: .easeInOut ) .padding(EdgeInsets(top: 16, leading: 8, bottom: 16, trailing: 8)) } } .onAppear { - request(url: getUrl(), model: [NewsModel].self) { self.news = $0 } + let url = getUrl(endpoint: .news, symbol: symbol) + request(url: url, model: [NewsModel].self) { self.news = $0 } } } - - private func getUrl() -> String { - let baseUrl = Bundle.main.infoDictionary?["IEX_URL"] as? String ?? "Empty url" - let apiKey = Bundle.main.infoDictionary?["IEX_API"] as? String ?? "Empty key" - let url = "\(baseUrl)/stock/\(symbol)/news/last/30?token=\(apiKey)" - - return url - } }
--- a/LazyBear/UI/PriceView.swift Fri Mar 12 20:48:42 2021 +0100 +++ b/LazyBear/UI/PriceView.swift Sat Mar 13 14:18:46 2021 +0100 @@ -12,7 +12,6 @@ @State private var latestPrice = Float() @State private var changePercent = Double() @State private var negativeChange = false - @State private var timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() // Set recurrent price request var body: some View { @@ -41,16 +40,9 @@ .onDisappear { self.timer.upstream.connect().cancel() } // Stop timer } - private func getUrl() -> String { - let baseUrl = Bundle.main.infoDictionary?["IEX_URL"] as? String ?? "Empty url" - let apiKey = Bundle.main.infoDictionary?["IEX_API"] as? String ?? "Empty key" - let url = "\(baseUrl)/stock/\(symbol)/quote?token=\(apiKey)" - - return url - } - private func call() { - request(url: getUrl(), model: PriceModel.self) { result in + let url = getUrl(endpoint: .quote, symbol: symbol) + request(url: url, model: PriceModel.self) { result in self.latestPrice = result.latestPrice if result.changePercent < 0 { self.negativeChange = true