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