diff LazyBear/Views/Company/Chart.swift @ 399:5c99883c7964

Implementing networking in CompanyView
author Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
date Sat, 15 May 2021 12:31:40 +0200
parents
children 6055a867d2b6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/Views/Company/Chart.swift	Sat May 15 12:31:40 2021 +0200
@@ -0,0 +1,86 @@
+//
+//  Chart.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 8/5/21.
+//
+
+import SwiftUI
+import StockCharts
+
+struct Chart: View {
+    var chartData: ChartResponse
+    var symbol: String
+    
+    // Date picker
+    var ranges = ["1D", "5D", "1M", "3M", "6M", "1Y", "5Y"]
+    @State private var selectedRange = "3M"
+    
+    
+    var body: some View {
+        let priceViewStyle = PriceViewStyle(
+            alignment: .leading,
+            priceFont: .headline,
+            priceFontWeight: .semibold,
+            percentFont: .body,
+            percentFontWeight: .medium
+        )
+        
+        VStack {
+            DatePicker(ranges: ranges, selectedRange: $selectedRange)
+            
+            RoundedRectangle(cornerRadius: 15)
+                .foregroundColor(Color(.secondarySystemBackground))
+                .frame(height: 270)
+                .overlay(
+                    VStack {
+                        HStack {
+                            if let quote = chartData.quote![symbol.uppercased()] {
+                                let latestPrice = quote.latestPrice ?? 0
+                                let changePercent = quote.changePercent ?? 0
+                                PriceView(latestPrice: latestPrice, changePercent: changePercent, style: priceViewStyle)
+                            }
+                            Spacer()
+                        }
+                        .padding([.top, .leading, .trailing])
+                        
+                        if let intradayPrices = chartData.intradayPrices![symbol.uppercased()] {
+                            if let prices = intradayPrices.compactMap { $0.open } {
+                                LineChartView(data: prices,
+                                              dates: nil,
+                                              hours: nil,
+                                              dragGesture: true
+                                )
+                                    .padding(.bottom)
+                            }
+                        }
+                    }
+                )
+            
+            if let latestNews = chartData.latestNews {
+                ForEach(latestNews, id: \.self) { new in
+                    NewsRow(new: new)
+                }
+            }
+        }
+    }
+}
+
+struct Chart_Previews: PreviewProvider {
+    static var previews: some View {
+        Chart(
+            chartData: ChartResponse(
+                intradayPrices: ["AAPL": [IntradayPriceModel(open: 120.3)]],
+                quote: ["aapl": QuoteModel(changePercent: 0.03, companyName: "Apple Inc", latestPrice: 120.3)],
+                latestNews: [LatestNewsModel(
+                                datetime: 1621037430000,
+                                headline: "Chaos Monkeys' author calls Apple's statement on his departure defamatory",
+                                image: "https://cloud.iexapis.com/v1/news/image/99abeb99-6d9e-47c8-ae7b-53404eacccec",
+                                source: "Investing.com",
+                                summary: "https://www.investing.com/news/stock-market-news",
+                                url: "https://cloud.iexapis.com/v1/news/article/99abeb99-6d9e-47c8-ae7b-53404eacccec")]),
+            
+            symbol: "aapl"
+        )
+    }
+}