Mercurial > public > lazybear
changeset 235:68be81b7d02e
Rename file
author | Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com> |
---|---|
date | Wed, 03 Mar 2021 15:16:52 +0000 |
parents | 8240a874e35f |
children | 0036618c7989 |
files | LazyBear/UI/ChartView.swift LazyBear/UI/CompanyView.swift LazyBear/UI/HistoricalPriceView.swift LazyBear/UI/LanguagePicker.swift LazyBear/UI/NewsLanguagePicker.swift LazyBear/UI/PriceView.swift LazyBear/UI/Settings.swift |
diffstat | 7 files changed, 119 insertions(+), 120 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LazyBear/UI/ChartView.swift Wed Mar 03 15:16:52 2021 +0000 @@ -0,0 +1,74 @@ +// +// HistoricalPriceView.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 21/2/21. +// + +import SwiftUI +import Charts + +struct ChartView: View { + var symbol: String + var chartHeight: CGFloat + @State private var historicalPrices = [HistoricalPriceModel]() + + // Date picker + var period = ["1W", "1M", "3M", "6M", "1Y", "2Y", "5Y"] + @State var selectedPeriod = 2 + + var body: some View { + VStack { + 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 (colour, prices) = prepareChart() + Chart(data: prices) + .frame(height: chartHeight) + .chartStyle(AreaChartStyle(.quadCurve, fill: + LinearGradient(gradient: .init(colors: [colour.opacity(0.5), colour.opacity(0.2)]), + startPoint: .top, + endPoint: .bottom))) + } + .onAppear { + request(url: getUrl(range: "3m"), 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 + let prices = historicalPrices.map { $0.close } // Close prices array (for chart) + // Modify chart colour depending on % change over time + // If it's < 0 -> lost value -> red + var colour: Color = .red + let changeOverTime = historicalPrices.map { $0.changeOverTime }.last + if changeOverTime! >= 0 { + colour = .green + } + + return (colour, normalize(prices)) + } + + // Handle error here after x seconds of requesting. + + return (.blue, [Double]()) + } +} + +struct HistoricalPriceView_Previews: PreviewProvider { + static var previews: some View { + ChartView(symbol: "aapl", chartHeight: 200) + } +}
--- a/LazyBear/UI/CompanyView.swift Wed Mar 03 15:16:41 2021 +0000 +++ b/LazyBear/UI/CompanyView.swift Wed Mar 03 15:16:52 2021 +0000 @@ -19,7 +19,7 @@ GeometryReader { geo in ScrollView { PriceView(symbol: symbol) - HistoricalPriceView(symbol: symbol, chartHeight: geo.size.width / 2) + ChartView(symbol: symbol, chartHeight: geo.size.width / 2) NewsView(symbol: symbol) } }
--- a/LazyBear/UI/HistoricalPriceView.swift Wed Mar 03 15:16:41 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -// -// HistoricalPriceView.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/2/21. -// - -import SwiftUI -import Charts - -struct HistoricalPriceView: View { - var symbol: String - var chartHeight: CGFloat - @State private var historicalPrices = [HistoricalPriceModel]() - - // Date picker - var period = ["1W", "1M", "3M", "6M", "1Y", "2Y", "5Y"] - @State var selectedPeriod = 2 - - var body: some View { - VStack { - 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 (colour, prices) = prepareChart() - Chart(data: prices) - .frame(height: chartHeight) - .chartStyle(AreaChartStyle(.quadCurve, fill: - LinearGradient(gradient: .init(colors: [colour.opacity(0.5), colour.opacity(0.2)]), - startPoint: .top, - endPoint: .bottom))) - } - .onAppear { - request(url: getUrl(range: "3m"), 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 - let prices = historicalPrices.map { $0.close } // Close prices array (for chart) - // Modify chart colour depending on % change over time - // If it's < 0 -> lost value -> red - var colour: Color = .red - let changeOverTime = historicalPrices.map { $0.changeOverTime }.last - if changeOverTime! >= 0 { - colour = .green - } - - return (colour, normalize(prices)) - } - - // Handle error here after x seconds of requesting. - - return (.blue, [Double]()) - } -} - -struct HistoricalPriceView_Previews: PreviewProvider { - static var previews: some View { - HistoricalPriceView(symbol: "aapl", chartHeight: 200) - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LazyBear/UI/LanguagePicker.swift Wed Mar 03 15:16:52 2021 +0000 @@ -0,0 +1,43 @@ +// +// NewsLanguagePicker.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 26/2/21. +// + +import SwiftUI + +struct LanguagePicker: View { + @Environment(\.managedObjectContext) private var moc + @State var language: String + + var body: some View { + Picker("News language", selection: $language) { + ForEach(newsLanguages, id: \.code) { language in + Text("\(language.flag) \(language.name)") + .tag(language.code) + } + } + .onChange(of: language, perform: { language in + save(change: language) + }) + } + + private func save(change: Any) { + let userSettings = UserSettings(context: moc) + userSettings.changedAt = Date() + userSettings.newsLanguage = change as? String + do { + try moc.save() + print("Settings saved") + } catch { + print(error.localizedDescription) + } + } +} + +struct NewsLanguagePicker_Previews: PreviewProvider { + static var previews: some View { + LanguagePicker(language: "en") + } +}
--- a/LazyBear/UI/NewsLanguagePicker.swift Wed Mar 03 15:16:41 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -// -// NewsLanguagePicker.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 26/2/21. -// - -import SwiftUI - -struct NewsLanguagePicker: View { - @Environment(\.managedObjectContext) private var moc - @State var language: String - - var body: some View { - Picker("News language", selection: $language) { - ForEach(newsLanguages, id: \.code) { language in - Text("\(language.flag) \(language.name)") - .tag(language.code) - } - } - .onChange(of: language, perform: { language in - save(change: language) - }) - } - - private func save(change: Any) { - let userSettings = UserSettings(context: moc) - userSettings.changedAt = Date() - userSettings.newsLanguage = change as? String - do { - try moc.save() - print("Settings saved") - } catch { - print(error.localizedDescription) - } - } -} - -struct NewsLanguagePicker_Previews: PreviewProvider { - static var previews: some View { - NewsLanguagePicker(language: "en") - } -}
--- a/LazyBear/UI/PriceView.swift Wed Mar 03 15:16:41 2021 +0000 +++ b/LazyBear/UI/PriceView.swift Wed Mar 03 15:16:52 2021 +0000 @@ -28,7 +28,6 @@ .foregroundColor(negativeChange ? Color(.systemRed) : Color(.systemGreen)) .padding(.trailing) - IexAttribution(text: "IEX Cloud") Spacer() }
--- a/LazyBear/UI/Settings.swift Wed Mar 03 15:16:41 2021 +0000 +++ b/LazyBear/UI/Settings.swift Wed Mar 03 15:16:52 2021 +0000 @@ -21,7 +21,7 @@ let theme = userSettings.first?.theme ?? "Default" let language = userSettings.first?.newsLanguage ?? "English" ThemePicker(theme: theme) - NewsLanguagePicker(language: language) + LanguagePicker(language: language) NavigationLink(destination: IconPicker()) { Text("App icon") }