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)
+    }
+}