Mercurial > public > lazybear
changeset 93:24543d06c24f
Reorganize structure, delete swiftui-charts framework
author | Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com> |
---|---|
date | Fri, 29 Jan 2021 14:18:52 +0100 |
parents | 9abe4b6433f9 |
children | fe26349780c8 |
files | LazyBear.xcodeproj/project.pbxproj LazyBear.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved LazyBear.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate lazybear/Functions/ChartStyle.swift lazybear/Functions/ReadJson.swift lazybear/Functions/ScalateChart.swift lazybear/IexApi.swift lazybear/Jobs/ReadJson.swift lazybear/Jobs/ScalateChart.swift lazybear/LogoApi.swift lazybear/Network/IexApi.swift lazybear/Network/LogoApi.swift lazybear/Supply views/Company.swift lazybear/Supply views/CompanyHeader.swift lazybear/Supply views/CompanyList.swift lazybear/Supply views/CompanyRow.swift lazybear/Supply views/CompanyView.swift lazybear/Supply views/DateSelection.swift lazybear/Supply views/ListHeader.swift lazybear/Supply views/LogoModifier.swift lazybear/Supply views/LogoPlaceholder.swift lazybear/Supply views/Price.swift lazybear/Supply views/SearchBar.swift lazybear/Supply views/Stock.swift lazybear/Supply views/SuperTitle.swift lazybear/Supply views/Watchlist.swift lazybear/Supply views/WatchlistRow.swift lazybear/Views/Company.swift lazybear/Views/CompanyHeader.swift lazybear/Views/CompanyList.swift lazybear/Views/CompanyRow.swift lazybear/Views/CompanyView.swift lazybear/Views/DateSelection.swift lazybear/Views/ListHeader.swift lazybear/Views/LogoModifier.swift lazybear/Views/LogoPlaceholder.swift lazybear/Views/Price.swift lazybear/Views/SearchBar.swift lazybear/Views/Stock.swift lazybear/Views/SuperTitle.swift lazybear/Views/Watchlist.swift lazybear/Views/WatchlistRow.swift |
diffstat | 42 files changed, 727 insertions(+), 772 deletions(-) [+] |
line wrap: on
line diff
--- a/LazyBear.xcodeproj/project.pbxproj Fri Jan 29 13:31:16 2021 +0100 +++ b/LazyBear.xcodeproj/project.pbxproj Fri Jan 29 14:18:52 2021 +0100 @@ -12,7 +12,6 @@ 950B79F625B1CB7A00E5DB5B /* CompanyList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950B79F525B1CB7A00E5DB5B /* CompanyList.swift */; }; 9537923625BDF85D0001F82B /* LogoApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9537923525BDF85D0001F82B /* LogoApi.swift */; }; 954D992525A2123B001F7F60 /* HistoricalPricesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954D992425A2123B001F7F60 /* HistoricalPricesModel.swift */; }; - 954D996D25A2461B001F7F60 /* SwiftUICharts in Frameworks */ = {isa = PBXBuildFile; productRef = 954D996C25A2461B001F7F60 /* SwiftUICharts */; }; 95612C512598D48200F7698F /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95612C4F2598D48200F7698F /* SearchBar.swift */; }; 95621AD925BF2EDB00BB17FC /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95621AD825BF2EDB00BB17FC /* CloudKit.framework */; }; 95700BC625BD9D12009CEEFE /* IexApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95700BC525BD9D12009CEEFE /* IexApi.swift */; }; @@ -26,7 +25,6 @@ 95B04EB525212369000AD27F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95B04EB425212369000AD27F /* ContentView.swift */; }; 95B04EB72521236A000AD27F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95B04EB62521236A000AD27F /* Assets.xcassets */; }; 95B395A525BDF42E009A7EB0 /* companies.json in Resources */ = {isa = PBXBuildFile; fileRef = 95B395A425BDF42E009A7EB0 /* companies.json */; }; - 95C28AB625BC45CF0033D16A /* ChartStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C28AB525BC45CF0033D16A /* ChartStyle.swift */; }; 95C28AB925BC46250033D16A /* ScalateChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C28AB825BC46250033D16A /* ScalateChart.swift */; }; 95D1BF4925ADCF7700E5D063 /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95D1BF4825ADCF7700E5D063 /* Persistence.swift */; }; 95E4118F25BEC35D00A9C23F /* SDWebImageSwiftUI in Frameworks */ = {isa = PBXBuildFile; productRef = 95E4118E25BEC35D00A9C23F /* SDWebImageSwiftUI */; }; @@ -51,16 +49,16 @@ 9500257F256D17D9008FFD28 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; 95078FD025BF4E640004FA75 /* CloudKitManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CloudKitManager.swift; path = LazyBear/CloudKitManager.swift; sourceTree = SOURCE_ROOT; }; 950B79F525B1CB7A00E5DB5B /* CompanyList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompanyList.swift; sourceTree = "<group>"; }; - 9537923525BDF85D0001F82B /* LogoApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LogoApi.swift; path = lazybear/LogoApi.swift; sourceTree = SOURCE_ROOT; }; + 9537923525BDF85D0001F82B /* LogoApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LogoApi.swift; path = LazyBear/Network/LogoApi.swift; sourceTree = SOURCE_ROOT; }; 954D992425A2123B001F7F60 /* HistoricalPricesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = HistoricalPricesModel.swift; path = lazybear/Models/HistoricalPricesModel.swift; sourceTree = SOURCE_ROOT; }; 95612C4F2598D48200F7698F /* SearchBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = "<group>"; }; 95621AD725BF2EC500BB17FC /* LazyBear.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LazyBear.entitlements; sourceTree = "<group>"; }; 95621AD825BF2EDB00BB17FC /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; - 95700BC525BD9D12009CEEFE /* IexApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = IexApi.swift; path = lazybear/IexApi.swift; sourceTree = SOURCE_ROOT; }; + 95700BC525BD9D12009CEEFE /* IexApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = IexApi.swift; path = LazyBear/Network/IexApi.swift; sourceTree = SOURCE_ROOT; }; 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 = "<group>"; }; 9597CE0325C1DFE7004DDFED /* LogoPlaceholder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoPlaceholder.swift; sourceTree = "<group>"; }; - 95AB4A79259DCBAE0064C9C1 /* ReadJson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ReadJson.swift; path = lazybear/Functions/ReadJson.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 = "<group>"; }; 95B04EAF25212369000AD27F /* LazyBear.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LazyBear.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -69,15 +67,14 @@ 95B04EB62521236A000AD27F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 95B04EBB2521236A000AD27F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 95B395A425BDF42E009A7EB0 /* companies.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = companies.json; path = lazybear/Data/companies.json; sourceTree = SOURCE_ROOT; }; - 95C28AB525BC45CF0033D16A /* ChartStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ChartStyle.swift; path = lazybear/Functions/ChartStyle.swift; sourceTree = SOURCE_ROOT; }; - 95C28AB825BC46250033D16A /* ScalateChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ScalateChart.swift; path = lazybear/Functions/ScalateChart.swift; sourceTree = SOURCE_ROOT; }; + 95C28AB825BC46250033D16A /* ScalateChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ScalateChart.swift; path = LazyBear/Jobs/ScalateChart.swift; sourceTree = SOURCE_ROOT; }; 95D1BF4825ADCF7700E5D063 /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Persistence.swift; path = LazyBear/Persistence.swift; sourceTree = SOURCE_ROOT; }; 95E4119125BEC56F00A9C23F /* SuperTitle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuperTitle.swift; sourceTree = "<group>"; }; 95E411A625BEE03000A9C23F /* Watchlist.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Watchlist.swift; sourceTree = "<group>"; }; 95E411B525BEE84E00A9C23F /* Stock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stock.swift; sourceTree = "<group>"; }; 95E411BD25BEEA6C00A9C23F /* WatchlistRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchlistRow.swift; sourceTree = "<group>"; }; 95F6C2EF25BAE2ED003CF389 /* Company.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Company.swift; sourceTree = "<group>"; }; - 95F6C30025BAEC8B003CF389 /* CompanyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CompanyView.swift; path = "lazybear/Supply views/CompanyView.swift"; sourceTree = SOURCE_ROOT; }; + 95F6C30025BAEC8B003CF389 /* CompanyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CompanyView.swift; path = LazyBear/Views/CompanyView.swift; sourceTree = SOURCE_ROOT; }; 95F6C30425BAF599003CF389 /* CompanyHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompanyHeader.swift; sourceTree = "<group>"; }; 95F6C30825BAF7C2003CF389 /* DateSelection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateSelection.swift; sourceTree = "<group>"; }; 95F6F45B25C20D8D002AC66A /* Price.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Price.swift; sourceTree = "<group>"; }; @@ -96,7 +93,6 @@ 95E4118F25BEC35D00A9C23F /* SDWebImageSwiftUI in Frameworks */, 95621AD925BF2EDB00BB17FC /* CloudKit.framework in Frameworks */, 95002580256D17D9008FFD28 /* StoreKit.framework in Frameworks */, - 954D996D25A2461B001F7F60 /* SwiftUICharts in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -119,7 +115,17 @@ path = Tests; sourceTree = "<group>"; }; - 95612C4D2598D48200F7698F /* Supply views */ = { + 9592F496259D29F1005AB6F1 /* Models */ = { + isa = PBXGroup; + children = ( + 95AB4A7C259DCC0C0064C9C1 /* CompanyModel.swift */, + 954D992425A2123B001F7F60 /* HistoricalPricesModel.swift */, + 95FE646A25C30B880052832E /* ApiModel.swift */, + ); + path = Models; + sourceTree = "<group>"; + }; + 95945FBE25C440FC00EEA1D0 /* Views */ = { isa = PBXGroup; children = ( 95E4119125BEC56F00A9C23F /* SuperTitle.swift */, @@ -138,28 +144,25 @@ 95F6C30425BAF599003CF389 /* CompanyHeader.swift */, 95F6C30825BAF7C2003CF389 /* DateSelection.swift */, ); - name = "Supply views"; - path = "lazybear/Supply views"; - sourceTree = SOURCE_ROOT; + path = Views; + sourceTree = "<group>"; }; - 95855384259CD9800081CF24 /* Functions */ = { + 95945FC025C4415B00EEA1D0 /* Jobs */ = { isa = PBXGroup; children = ( 95AB4A79259DCBAE0064C9C1 /* ReadJson.swift */, - 95C28AB525BC45CF0033D16A /* ChartStyle.swift */, 95C28AB825BC46250033D16A /* ScalateChart.swift */, ); - path = Functions; + path = Jobs; sourceTree = "<group>"; }; - 9592F496259D29F1005AB6F1 /* Models */ = { + 95945FC325C441BA00EEA1D0 /* Network */ = { isa = PBXGroup; children = ( - 95AB4A7C259DCC0C0064C9C1 /* CompanyModel.swift */, - 954D992425A2123B001F7F60 /* HistoricalPricesModel.swift */, - 95FE646A25C30B880052832E /* ApiModel.swift */, + 95700BC525BD9D12009CEEFE /* IexApi.swift */, + 9537923525BDF85D0001F82B /* LogoApi.swift */, ); - path = Models; + path = Network; sourceTree = "<group>"; }; 95AB4A71259DCAB20064C9C1 /* Data */ = { @@ -199,14 +202,13 @@ 95F7CAF425ADC7B7009E0E7C /* LazyBear.xcdatamodeld */, 95D1BF4825ADCF7700E5D063 /* Persistence.swift */, 95078FD025BF4E640004FA75 /* CloudKitManager.swift */, - 95700BC525BD9D12009CEEFE /* IexApi.swift */, - 9537923525BDF85D0001F82B /* LogoApi.swift */, 958B678425C42B2400BF9F89 /* ApiAccess.swift */, 95B04EB225212369000AD27F /* LazyBearApp.swift */, 95B04EB425212369000AD27F /* ContentView.swift */, - 95612C4D2598D48200F7698F /* Supply views */, - 95855384259CD9800081CF24 /* Functions */, + 95945FBE25C440FC00EEA1D0 /* Views */, + 95945FC025C4415B00EEA1D0 /* Jobs */, 9592F496259D29F1005AB6F1 /* Models */, + 95945FC325C441BA00EEA1D0 /* Network */, 95AB4A71259DCAB20064C9C1 /* Data */, 952F791C2598B1CD00FF929F /* Tests */, ); @@ -230,7 +232,6 @@ ); name = LazyBear; packageProductDependencies = ( - 954D996C25A2461B001F7F60 /* SwiftUICharts */, 95E4118E25BEC35D00A9C23F /* SDWebImageSwiftUI */, ); productName = LazyBear; @@ -261,7 +262,6 @@ ); mainGroup = 95B04EA625212369000AD27F; packageReferences = ( - 954D996B25A2461B001F7F60 /* XCRemoteSwiftPackageReference "ChartView" */, 95E4118D25BEC35C00A9C23F /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */, ); productRefGroup = 95B04EB025212369000AD27F /* Products */; @@ -313,7 +313,6 @@ 95AB4A7D259DCC0C0064C9C1 /* CompanyModel.swift in Sources */, 95700BC625BD9D12009CEEFE /* IexApi.swift in Sources */, 9537923625BDF85D0001F82B /* LogoApi.swift in Sources */, - 95C28AB625BC45CF0033D16A /* ChartStyle.swift in Sources */, 95C28AB925BC46250033D16A /* ScalateChart.swift in Sources */, 95E411B625BEE84E00A9C23F /* Stock.swift in Sources */, 954D992525A2123B001F7F60 /* HistoricalPricesModel.swift in Sources */, @@ -521,14 +520,6 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 954D996B25A2461B001F7F60 /* XCRemoteSwiftPackageReference "ChartView" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/AppPear/ChartView.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.5.4; - }; - }; 95E4118D25BEC35C00A9C23F /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/SDWebImage/SDWebImageSwiftUI.git"; @@ -540,11 +531,6 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 954D996C25A2461B001F7F60 /* SwiftUICharts */ = { - isa = XCSwiftPackageProductDependency; - package = 954D996B25A2461B001F7F60 /* XCRemoteSwiftPackageReference "ChartView" */; - productName = SwiftUICharts; - }; 95E4118E25BEC35D00A9C23F /* SDWebImageSwiftUI */ = { isa = XCSwiftPackageProductDependency; package = 95E4118D25BEC35C00A9C23F /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */;
--- a/LazyBear.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved Fri Jan 29 13:31:16 2021 +0100 +++ b/LazyBear.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved Fri Jan 29 14:18:52 2021 +0100 @@ -2,15 +2,6 @@ "object": { "pins": [ { - "package": "SwiftUICharts", - "repositoryURL": "https://github.com/AppPear/ChartView.git", - "state": { - "branch": null, - "revision": "4699847a9ac0c694666cea3acef133498952566e", - "version": "1.5.4" - } - }, - { "package": "SDWebImage", "repositoryURL": "https://github.com/SDWebImage/SDWebImage.git", "state": {
Binary file LazyBear.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed
--- a/lazybear/Functions/ChartStyle.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -// -// ChartStyle.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 23/1/21. -// - -import SwiftUI -import SwiftUICharts - -func chartStyle() -> ChartStyle { - let gradient = GradientColor(start: .green, end: .green) - let style = ChartStyle( - backgroundColor: .white, - accentColor: .green, - gradientColor: gradient, - textColor: .black, - legendTextColor: .black, - dropShadowColor: .white) - - return style -}
--- a/lazybear/Functions/ReadJson.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -// -// ReadJson.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 31/12/20. -// - -import SwiftUI - -import SwiftUI - -// With this function I parse the local JSON file to read it and create a list with its items. -let companiesData: [CompanyModel] = load("companies.json") - -func load<T: Decodable>(_ filename: String) -> T { - let data: Data - - guard let file = Bundle.main.url(forResource: filename, withExtension: nil) - else { - fatalError("Couldn't find \(filename) in main bundle.") - } - - do { - data = try Data(contentsOf: file) - } catch { - fatalError("Couldn't load \(filename) from main bundle:\n\(error)") - } - - do { - let decoder = JSONDecoder() - return try decoder.decode(T.self, from: data) - } catch { - fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)") - } -}
--- a/lazybear/Functions/ScalateChart.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -// -// ScalateChart.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 23/1/21. -// - -import SwiftUI - -func scalateChart(prices: [Double], selectedPeriod: Int) -> [Double] { - // Remove every two items to shorter the chart data points - var indexesToRemove = Set<Int>() - - if selectedPeriod >= 4 { - for index in 0..<prices.count { - indexesToRemove.insert(index*2) - } - } - let prices = prices - .enumerated() - .filter { !indexesToRemove.contains($0.offset) } - .map { $0.element } - - return prices -}
--- a/lazybear/IexApi.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -// -// API.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 24/1/21. -// - -import SwiftUI - -struct IexApi { - enum Version { - case stable - - var path: String { - switch self { - case .stable: - return "/stable" - } - } - } - - enum Stock { - case symbol(company: String) - var path: String { - switch self { - case let .symbol(company): - return "/stock/\(company)" - } - } - } - - enum Endpoint { - case historicalPrices - case quote - var path: String { - switch self { - case .historicalPrices: - return "/chart" - case .quote: - return "/quote?" - } - } - } - - enum Range { - case period(range: String) - var path: String { - switch self { - case let .period(range): - return "/\(range)?" - } - } - } - - enum Parameters { - case chartCloseOnly - var path: String { - switch self { - case .chartCloseOnly: - return "chartCloseOnly=true" - } - } - } - - - // Create URL - func getURL(version: Version, stock: Stock, endpoint: Endpoint, range: Range?, parameters: Parameters?) -> String { - let version = version.path - let stock = stock.path - let endpoint = endpoint.path - let range = range?.path - let parameters = parameters?.path - - let path = "\(version)\(stock)\(endpoint)\(range ?? "")\(parameters ?? "")token=" - - return path - - } - - // Request API - func request<T: Decodable>(url: String, model: T.Type, completion: @escaping (T) -> Void) { - // We take some model data T.Type - guard let url = URL(string: url) else { - print("Invalid URL") - return - } - let request = URLRequest(url: url) - URLSession.shared.dataTask(with: request) { data, response, error in - if let data = data { - do { - // Decode response with the model passed - let decodedResponse = try JSONDecoder().decode(model, from: data) - DispatchQueue.main.async { - print(decodedResponse) - completion(decodedResponse) - } - return - } catch { - print(error) - } - } - print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")") - } - .resume() - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Jobs/ReadJson.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,35 @@ +// +// ReadJson.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 31/12/20. +// + +import SwiftUI + +import SwiftUI + +// With this function I parse the local JSON file to read it and create a list with its items. +let companiesData: [CompanyModel] = load("companies.json") + +func load<T: Decodable>(_ filename: String) -> T { + let data: Data + + guard let file = Bundle.main.url(forResource: filename, withExtension: nil) + else { + fatalError("Couldn't find \(filename) in main bundle.") + } + + do { + data = try Data(contentsOf: file) + } catch { + fatalError("Couldn't load \(filename) from main bundle:\n\(error)") + } + + do { + let decoder = JSONDecoder() + return try decoder.decode(T.self, from: data) + } catch { + fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)") + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Jobs/ScalateChart.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,25 @@ +// +// ScalateChart.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 23/1/21. +// + +import SwiftUI + +func scalateChart(prices: [Double], selectedPeriod: Int) -> [Double] { + // Remove every two items to shorter the chart data points + var indexesToRemove = Set<Int>() + + if selectedPeriod >= 4 { + for index in 0..<prices.count { + indexesToRemove.insert(index*2) + } + } + let prices = prices + .enumerated() + .filter { !indexesToRemove.contains($0.offset) } + .map { $0.element } + + return prices +}
--- a/lazybear/LogoApi.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -// -// GoogleApi.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 24/1/21. -// - -import SwiftUI - -struct LogoApi { - enum URL { - case company(symbol: String) - - var path: String { - switch self { - case let .company(symbol): - return "/iex/api/logos/\(symbol.uppercased()).png" - } - } - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Network/IexApi.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,106 @@ +// +// API.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 24/1/21. +// + +import SwiftUI + +struct IexApi { + enum Version { + case stable + + var path: String { + switch self { + case .stable: + return "/stable" + } + } + } + + enum Stock { + case symbol(company: String) + var path: String { + switch self { + case let .symbol(company): + return "/stock/\(company)" + } + } + } + + enum Endpoint { + case historicalPrices + case quote + var path: String { + switch self { + case .historicalPrices: + return "/chart" + case .quote: + return "/quote?" + } + } + } + + enum Range { + case period(range: String) + var path: String { + switch self { + case let .period(range): + return "/\(range)?" + } + } + } + + enum Parameters { + case chartCloseOnly + var path: String { + switch self { + case .chartCloseOnly: + return "chartCloseOnly=true" + } + } + } + + + // Create URL + func getURL(version: Version, stock: Stock, endpoint: Endpoint, range: Range?, parameters: Parameters?) -> String { + let version = version.path + let stock = stock.path + let endpoint = endpoint.path + let range = range?.path + let parameters = parameters?.path + + let path = "\(version)\(stock)\(endpoint)\(range ?? "")\(parameters ?? "")token=" + + return path + + } + + // Request API + func request<T: Decodable>(url: String, model: T.Type, completion: @escaping (T) -> Void) { + // We take some model data T.Type + guard let url = URL(string: url) else { + print("Invalid URL") + return + } + let request = URLRequest(url: url) + URLSession.shared.dataTask(with: request) { data, response, error in + if let data = data { + do { + // Decode response with the model passed + let decodedResponse = try JSONDecoder().decode(model, from: data) + DispatchQueue.main.async { + print(decodedResponse) + completion(decodedResponse) + } + return + } catch { + print(error) + } + } + print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")") + } + .resume() + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Network/LogoApi.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,21 @@ +// +// GoogleApi.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 24/1/21. +// + +import SwiftUI + +struct LogoApi { + enum URL { + case company(symbol: String) + + var path: String { + switch self { + case let .company(symbol): + return "/iex/api/logos/\(symbol.uppercased()).png" + } + } + } +}
--- a/lazybear/Supply views/Company.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -// -// Company.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 22/1/21. -// - -import SwiftUI - -struct Company: View { - var name: String - var symbol: String - - var body: some View { - CompanyHeader(name: self.name, symbol: self.symbol) - ScrollView { - VStack(alignment: .leading) { - Stock(name: name, symbol: symbol) - } - } - } -} - -struct Company_Previews: PreviewProvider { - static var previews: some View { - Company(name: "Apple Inc", symbol: "AAPL") - } -}
--- a/lazybear/Supply views/CompanyHeader.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -// -// CompanyHeader.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 22/1/21. -// - -import SwiftUI - -struct CompanyHeader: View { - @Environment(\.presentationMode) var presentationMode - var name: String - var symbol: String - - var body: some View { - VStack(alignment: .leading) { - HStack { - Text(self.symbol.uppercased()) - .font(.title) - .fontWeight(.semibold) - - Spacer() - Button(action: { self.presentationMode.wrappedValue.dismiss() }) { - Image(systemName: "multiply.circle.fill") - } - - } - - Text(self.name.capitalized) - } - .padding([.leading, .trailing]) - } -} - -struct CompanyHeader_Previews: PreviewProvider { - static var previews: some View { - CompanyHeader(name: "Apple Inc", symbol: "AAPL") - } -}
--- a/lazybear/Supply views/CompanyList.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -// -// CompanyList.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 15/1/21. -// - -import SwiftUI - -struct CompanyList: View { - @Binding var searchedCompany: String - - var body: some View { - List { - ForEach(companiesData.filter({ searchedCompany.isEmpty ? true : $0.name.localizedStandardContains(searchedCompany) }) - , id: \.symbol) { company in - CompanyRow(company: company) - } - } - .edgesIgnoringSafeArea(.bottom) - .cornerRadius(20) - .id(UUID()) // Increase speed in search the list - } -} - -struct CompanyList_Previews: PreviewProvider { - static var previews: some View { - CompanyList(searchedCompany: .constant("Apple")) - } -}
--- a/lazybear/Supply views/CompanyRow.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -// -// CompanyRown.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 31/12/20. -// - -import SwiftUI - -struct CompanyRow: View { - @ObservedObject var companyView = CompanyView() - var company: CompanyModel - - var body: some View { - Button(action: { companyView.isShowing.toggle() }) { - VStack(alignment: .leading) { - Text(company.symbol.uppercased()) - .fontWeight(.semibold) - - Text(company.name.capitalized) - .font(.caption) - - } - } - .fullScreenCover(isPresented: $companyView.isShowing) { - Company(name: company.name, symbol: company.symbol) - } - } -} - -struct CompanyRown_Previews: PreviewProvider { - static var previews: some View { - CompanyRow(company: companiesData[0]) - } -}
--- a/lazybear/Supply views/CompanyView.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -// -// ShowingCompany.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 22/1/21. -// - -import SwiftUI - -class CompanyView: ObservableObject { - @Published var isShowing: Bool = false { - didSet { - print("Company is showing -> " + String(isShowing)) - } - } -}
--- a/lazybear/Supply views/DateSelection.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -// -// DateSelection.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 22/1/21. -// - -import SwiftUI - -struct DateSelection: View { - var period = ["1W", "1M", "3M", "6M", "1Y", "2Y", "5Y"] - @Binding var selectedperiod: Int - - var body: some View { - Picker(selection: $selectedperiod, label: Text("Please choose a period")) { - ForEach(0 ..< period.count) { - Text(self.period[$0]) - } - } - .pickerStyle(SegmentedPickerStyle()) - } -} - -struct DateSelection_Previews: PreviewProvider { - static var previews: some View { - DateSelection(selectedperiod: .constant(0)) - } -}
--- a/lazybear/Supply views/ListHeader.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -// -// Header.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 27/1/21. -// - -import SwiftUI - -struct ListHeader: View { - var header: String - - var body: some View { - HStack { - Text(header) - .font(.title) - .fontWeight(.semibold) - - Spacer() - EditButton() - } - .padding([.leading, .trailing]) - } -} - -struct ListHeader_Previews: PreviewProvider { - static var previews: some View { - ListHeader(header: "Header") - } -}
--- a/lazybear/Supply views/LogoModifier.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -// -// LogoModifier.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 27/1/21. -// - -import SwiftUI - -struct LogoModifier: ViewModifier { - func body(content: Content) -> some View { - content - .aspectRatio(contentMode: .fit) - .frame(maxWidth: 40, maxHeight: 40) - .clipShape(RoundedRectangle(cornerRadius: 3)) - } -}
--- a/lazybear/Supply views/LogoPlaceholder.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -// -// LogoPlaceholder.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 27/1/21. -// - -import SwiftUI - -struct LogoPlaceholder: View { - var body: some View { - Image(systemName: "building.2") - .foregroundColor(Color(.systemGray)) - .frame(width: 40, height: 40) - .background(Color(.systemGray5)) - } -} - -struct LogoPlaceholder_Previews: PreviewProvider { - static var previews: some View { - LogoPlaceholder() - } -}
--- a/lazybear/Supply views/Price.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -// -// Price.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 27/1/21. -// - -import SwiftUI -import CloudKit - -struct Price: View { - let iexApi = IexApi() - - var body: some View { - Text("Price") - .onAppear { - //let url = api[1].url! as String - //let token = api[1].key! as String - //let path = iexApi.getURL(version: .stable, stock: .symbol(company: "AAPL"), endpoint: .quote, range: nil, parameters: nil) - //let endpoint = url + path + token - //print(endpoint) - } - } -} - -struct Price_Previews: PreviewProvider { - static var previews: some View { - Price() - } -}
--- a/lazybear/Supply views/SearchBar.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -// -// SearchBar.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 27/12/20. -// - -import SwiftUI - -struct SearchBar: View { - @Binding var searchedText: String - @State var searchBarIsEditing = false - @Binding var showingSearch: Bool // Show search view in ContentView - - var body: some View { - HStack { - TextField("Search ...", text: $searchedText) - .padding(10) - .padding(.horizontal, 45) - .overlay( - HStack { - Image(systemName: "magnifyingglass") - .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) - .padding(.leading) - .foregroundColor(Color("placeholder")) - - if searchBarIsEditing { - Button(action: { - self.searchedText = "" - }) { - Image(systemName: "multiply.circle.fill") - .foregroundColor(Color("placeholder")) - .padding(.trailing) - } - } - } - ) - .background(Color(.systemGray6)) - .cornerRadius(10) - .onTapGesture { - self.searchBarIsEditing = true - self.showingSearch = true // Content View - - - } - - if searchBarIsEditing { - Button(action: { - self.searchedText = "" - self.searchBarIsEditing = false - self.showingSearch = false // Content View - - // Force hide keyboard - UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) - - }) { - Text("Cancel") - } - } - } - .padding() - } -} - -struct SearchBar_Previews: PreviewProvider { - static var previews: some View { - SearchBar(searchedText: .constant(""), showingSearch: .constant(true)) - } -}
--- a/lazybear/Supply views/Stock.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -// -// Stock.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 25/1/21. -// - -import SwiftUI - -struct Stock: View { - @Environment(\.managedObjectContext) private var viewContext - var name: String - var symbol: String - - var body: some View { - Button(action: { addWatchlist(name: name, symbol: symbol) }) { - Text("Add to watchlist") - } - - } - - func addWatchlist(name: String, symbol: String) { - let watchlistCompany = WatchlistCompany(context: viewContext) - watchlistCompany.name = name - watchlistCompany.symbol = symbol - do { - try viewContext.save() - print("Company saved.") - } catch { - print(error.localizedDescription) - } - } -} - -struct Stock_Previews: PreviewProvider { - static var previews: some View { - Stock(name: "apple inc", symbol: "aapl") - } -}
--- a/lazybear/Supply views/SuperTitle.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -// -// Header.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 25/1/21. -// - -import SwiftUI - -struct SuperTitle: View { - @State var name: String - - var body: some View { - Text(name) - .font(.largeTitle) - .fontWeight(.bold) - .padding() - } -} - -struct SuperTitle_Previews: PreviewProvider { - static var previews: some View { - SuperTitle(name: "Home") - } -}
--- a/lazybear/Supply views/Watchlist.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -// -// Watchlist.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 25/1/21. -// - -import SwiftUI -import CloudKit - -struct Watchlist: View { - @Environment(\.managedObjectContext) private var viewContext - @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) - var companies: FetchedResults<WatchlistCompany> // Fetch core data - - var body: some View { - ListHeader(header: "Watchlist") - List { - ForEach(companies) { company in - WatchlistRow(company: company) - } - .onDelete { indexSet in deleteWatchlist(indexSet: indexSet) } // Delete from persistent storage - } - } - - func deleteWatchlist(indexSet: IndexSet) { - for index in indexSet { - viewContext.delete(companies[index]) - } - do { - try viewContext.save() - print("Company deleted") - } catch { - print(error.localizedDescription) - } - } -} - -struct Watchlist_Previews: PreviewProvider { - static var previews: some View { - Watchlist() - } -}
--- a/lazybear/Supply views/WatchlistRow.swift Fri Jan 29 13:31:16 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -// -// WatchlistRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 25/1/21. -// - -import SwiftUI -import CoreData -import SDWebImageSwiftUI - -struct WatchlistRow: View { - @EnvironmentObject var apiAccess: ApiAccess - @ObservedObject var companyView = CompanyView() - @Environment(\.editMode) var editMode // EditButton list - var company: WatchlistCompany - - var body: some View { - Button(action: { companyView.isShowing.toggle() }) { - HStack { - let url = apiAccess.results[0].url - let path = LogoApi.URL.company(symbol: company.symbol ?? "").path - let endpoint = url! + path - WebImage(url: URL(string: endpoint)) - .resizable() - .placeholder { LogoPlaceholder() } // If there is no logo - .indicator(.activity) - .modifier(LogoModifier()) - - VStack(alignment: .leading) { - Text(company.symbol ?? "".uppercased()) - .fontWeight(.semibold) - - Text(company.name ?? "".capitalized) - .font(.caption) - } - - Spacer() - if self.editMode?.wrappedValue.isEditing ?? true { } else { // If is not editing -> show prices - Price() - } - } - } - .fullScreenCover(isPresented: $companyView.isShowing) { - Company(name: company.name ?? "", symbol: company.symbol ?? "") - } - } -} - - -struct WatchlistRow_Previews: PreviewProvider { - // Avoid preview crashing - static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) - - static var previews: some View { - let watchlistCompany = WatchlistCompany(context: moc) - watchlistCompany.name = "apple inc" - watchlistCompany.symbol = "aapl" - return WatchlistRow(company: watchlistCompany) - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/Company.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,28 @@ +// +// Company.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 22/1/21. +// + +import SwiftUI + +struct Company: View { + var name: String + var symbol: String + + var body: some View { + CompanyHeader(name: self.name, symbol: self.symbol) + ScrollView { + VStack(alignment: .leading) { + Stock(name: name, symbol: symbol) + } + } + } +} + +struct Company_Previews: PreviewProvider { + static var previews: some View { + Company(name: "Apple Inc", symbol: "AAPL") + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/CompanyHeader.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,39 @@ +// +// CompanyHeader.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 22/1/21. +// + +import SwiftUI + +struct CompanyHeader: View { + @Environment(\.presentationMode) var presentationMode + var name: String + var symbol: String + + var body: some View { + VStack(alignment: .leading) { + HStack { + Text(self.symbol.uppercased()) + .font(.title) + .fontWeight(.semibold) + + Spacer() + Button(action: { self.presentationMode.wrappedValue.dismiss() }) { + Image(systemName: "multiply.circle.fill") + } + + } + + Text(self.name.capitalized) + } + .padding([.leading, .trailing]) + } +} + +struct CompanyHeader_Previews: PreviewProvider { + static var previews: some View { + CompanyHeader(name: "Apple Inc", symbol: "AAPL") + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/CompanyList.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,30 @@ +// +// CompanyList.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 15/1/21. +// + +import SwiftUI + +struct CompanyList: View { + @Binding var searchedCompany: String + + var body: some View { + List { + ForEach(companiesData.filter({ searchedCompany.isEmpty ? true : $0.name.localizedStandardContains(searchedCompany) }) + , id: \.symbol) { company in + CompanyRow(company: company) + } + } + .edgesIgnoringSafeArea(.bottom) + .cornerRadius(20) + .id(UUID()) // Increase speed in search the list + } +} + +struct CompanyList_Previews: PreviewProvider { + static var previews: some View { + CompanyList(searchedCompany: .constant("Apple")) + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/CompanyRow.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,35 @@ +// +// CompanyRown.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 31/12/20. +// + +import SwiftUI + +struct CompanyRow: View { + @ObservedObject var companyView = CompanyView() + var company: CompanyModel + + var body: some View { + Button(action: { companyView.isShowing.toggle() }) { + VStack(alignment: .leading) { + Text(company.symbol.uppercased()) + .fontWeight(.semibold) + + Text(company.name.capitalized) + .font(.caption) + + } + } + .fullScreenCover(isPresented: $companyView.isShowing) { + Company(name: company.name, symbol: company.symbol) + } + } +} + +struct CompanyRown_Previews: PreviewProvider { + static var previews: some View { + CompanyRow(company: companiesData[0]) + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/CompanyView.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,16 @@ +// +// ShowingCompany.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 22/1/21. +// + +import SwiftUI + +class CompanyView: ObservableObject { + @Published var isShowing: Bool = false { + didSet { + print("Company is showing -> " + String(isShowing)) + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/DateSelection.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,28 @@ +// +// DateSelection.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 22/1/21. +// + +import SwiftUI + +struct DateSelection: View { + var period = ["1W", "1M", "3M", "6M", "1Y", "2Y", "5Y"] + @Binding var selectedperiod: Int + + var body: some View { + Picker(selection: $selectedperiod, label: Text("Please choose a period")) { + ForEach(0 ..< period.count) { + Text(self.period[$0]) + } + } + .pickerStyle(SegmentedPickerStyle()) + } +} + +struct DateSelection_Previews: PreviewProvider { + static var previews: some View { + DateSelection(selectedperiod: .constant(0)) + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/ListHeader.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,30 @@ +// +// Header.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 27/1/21. +// + +import SwiftUI + +struct ListHeader: View { + var header: String + + var body: some View { + HStack { + Text(header) + .font(.title) + .fontWeight(.semibold) + + Spacer() + EditButton() + } + .padding([.leading, .trailing]) + } +} + +struct ListHeader_Previews: PreviewProvider { + static var previews: some View { + ListHeader(header: "Header") + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/LogoModifier.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,17 @@ +// +// LogoModifier.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 27/1/21. +// + +import SwiftUI + +struct LogoModifier: ViewModifier { + func body(content: Content) -> some View { + content + .aspectRatio(contentMode: .fit) + .frame(maxWidth: 40, maxHeight: 40) + .clipShape(RoundedRectangle(cornerRadius: 3)) + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/LogoPlaceholder.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,23 @@ +// +// LogoPlaceholder.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 27/1/21. +// + +import SwiftUI + +struct LogoPlaceholder: View { + var body: some View { + Image(systemName: "building.2") + .foregroundColor(Color(.systemGray)) + .frame(width: 40, height: 40) + .background(Color(.systemGray5)) + } +} + +struct LogoPlaceholder_Previews: PreviewProvider { + static var previews: some View { + LogoPlaceholder() + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/Price.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,30 @@ +// +// Price.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 27/1/21. +// + +import SwiftUI +import CloudKit + +struct Price: View { + let iexApi = IexApi() + + var body: some View { + Text("Price") + .onAppear { + //let url = api[1].url! as String + //let token = api[1].key! as String + //let path = iexApi.getURL(version: .stable, stock: .symbol(company: "AAPL"), endpoint: .quote, range: nil, parameters: nil) + //let endpoint = url + path + token + //print(endpoint) + } + } +} + +struct Price_Previews: PreviewProvider { + static var previews: some View { + Price() + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/SearchBar.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,69 @@ +// +// SearchBar.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 27/12/20. +// + +import SwiftUI + +struct SearchBar: View { + @Binding var searchedText: String + @State var searchBarIsEditing = false + @Binding var showingSearch: Bool // Show search view in ContentView + + var body: some View { + HStack { + TextField("Search ...", text: $searchedText) + .padding(10) + .padding(.horizontal, 45) + .overlay( + HStack { + Image(systemName: "magnifyingglass") + .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) + .padding(.leading) + .foregroundColor(Color("placeholder")) + + if searchBarIsEditing { + Button(action: { + self.searchedText = "" + }) { + Image(systemName: "multiply.circle.fill") + .foregroundColor(Color("placeholder")) + .padding(.trailing) + } + } + } + ) + .background(Color(.systemGray6)) + .cornerRadius(10) + .onTapGesture { + self.searchBarIsEditing = true + self.showingSearch = true // Content View + + + } + + if searchBarIsEditing { + Button(action: { + self.searchedText = "" + self.searchBarIsEditing = false + self.showingSearch = false // Content View + + // Force hide keyboard + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + + }) { + Text("Cancel") + } + } + } + .padding() + } +} + +struct SearchBar_Previews: PreviewProvider { + static var previews: some View { + SearchBar(searchedText: .constant(""), showingSearch: .constant(true)) + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/Stock.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,39 @@ +// +// Stock.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 25/1/21. +// + +import SwiftUI + +struct Stock: View { + @Environment(\.managedObjectContext) private var viewContext + var name: String + var symbol: String + + var body: some View { + Button(action: { addWatchlist(name: name, symbol: symbol) }) { + Text("Add to watchlist") + } + + } + + func addWatchlist(name: String, symbol: String) { + let watchlistCompany = WatchlistCompany(context: viewContext) + watchlistCompany.name = name + watchlistCompany.symbol = symbol + do { + try viewContext.save() + print("Company saved.") + } catch { + print(error.localizedDescription) + } + } +} + +struct Stock_Previews: PreviewProvider { + static var previews: some View { + Stock(name: "apple inc", symbol: "aapl") + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/SuperTitle.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,25 @@ +// +// Header.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 25/1/21. +// + +import SwiftUI + +struct SuperTitle: View { + @State var name: String + + var body: some View { + Text(name) + .font(.largeTitle) + .fontWeight(.bold) + .padding() + } +} + +struct SuperTitle_Previews: PreviewProvider { + static var previews: some View { + SuperTitle(name: "Home") + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/Watchlist.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,43 @@ +// +// Watchlist.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 25/1/21. +// + +import SwiftUI +import CloudKit + +struct Watchlist: View { + @Environment(\.managedObjectContext) private var viewContext + @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) + var companies: FetchedResults<WatchlistCompany> // Fetch core data + + var body: some View { + ListHeader(header: "Watchlist") + List { + ForEach(companies) { company in + WatchlistRow(company: company) + } + .onDelete { indexSet in deleteWatchlist(indexSet: indexSet) } // Delete from persistent storage + } + } + + func deleteWatchlist(indexSet: IndexSet) { + for index in indexSet { + viewContext.delete(companies[index]) + } + do { + try viewContext.save() + print("Company deleted") + } catch { + print(error.localizedDescription) + } + } +} + +struct Watchlist_Previews: PreviewProvider { + static var previews: some View { + Watchlist() + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lazybear/Views/WatchlistRow.swift Fri Jan 29 14:18:52 2021 +0100 @@ -0,0 +1,61 @@ +// +// WatchlistRow.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 25/1/21. +// + +import SwiftUI +import CoreData +import SDWebImageSwiftUI + +struct WatchlistRow: View { + @EnvironmentObject var apiAccess: ApiAccess + @ObservedObject var companyView = CompanyView() + @Environment(\.editMode) var editMode // EditButton list + var company: WatchlistCompany + + var body: some View { + Button(action: { companyView.isShowing.toggle() }) { + HStack { + let url = apiAccess.results[0].url + let path = LogoApi.URL.company(symbol: company.symbol ?? "").path + let endpoint = url! + path + WebImage(url: URL(string: endpoint)) + .resizable() + .placeholder { LogoPlaceholder() } // If there is no logo + .indicator(.activity) + .modifier(LogoModifier()) + + VStack(alignment: .leading) { + Text(company.symbol ?? "".uppercased()) + .fontWeight(.semibold) + + Text(company.name ?? "".capitalized) + .font(.caption) + } + + Spacer() + if self.editMode?.wrappedValue.isEditing ?? true { } else { // If is not editing -> show prices + Price() + } + } + } + .fullScreenCover(isPresented: $companyView.isShowing) { + Company(name: company.name ?? "", symbol: company.symbol ?? "") + } + } +} + + +struct WatchlistRow_Previews: PreviewProvider { + // Avoid preview crashing + static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) + + static var previews: some View { + let watchlistCompany = WatchlistCompany(context: moc) + watchlistCompany.name = "apple inc" + watchlistCompany.symbol = "aapl" + return WatchlistRow(company: watchlistCompany) + } +}