# HG changeset patch # User Dennis Concepción Martín # Date 1626510806 -3600 # Node ID 783b567800d99200be10b0bb775c3f97e1d318c1 # Parent daeac7c7c5868c030495ce7aac644e6905a2efaf Starts new version diff -r daeac7c7c586 -r 783b567800d9 .github/ISSUE_TEMPLATE/bug_report.md --- a/.github/ISSUE_TEMPLATE/bug_report.md Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff -r daeac7c7c586 -r 783b567800d9 .github/ISSUE_TEMPLATE/feature_request.md --- a/.github/ISSUE_TEMPLATE/feature_request.md Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff -r daeac7c7c586 -r 783b567800d9 LazyBear.xcodeproj/LazyBear.xctestplan --- a/LazyBear.xcodeproj/LazyBear.xctestplan Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -{ - "configurations" : [ - { - "id" : "602121CE-6768-43D3-A15F-A30A0E1E3C92", - "name" : "Configuration 1", - "options" : { - - } - } - ], - "defaultOptions" : { - - }, - "testTargets" : [ - { - "target" : { - "containerPath" : "container:LazyBear.xcodeproj", - "identifier" : "950C570F2629EF9100F234FE", - "name" : "LazyBearTests" - } - }, - { - "target" : { - "containerPath" : "container:LazyBear.xcodeproj", - "identifier" : "950C571F2629EFC200F234FE", - "name" : "LazyBearUITests" - } - } - ], - "version" : 1 -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear.xcodeproj/project.pbxproj --- a/LazyBear.xcodeproj/project.pbxproj Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBear.xcodeproj/project.pbxproj Sat Jul 17 09:33:26 2021 +0100 @@ -3,962 +3,218 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 50; objects = { /* Begin PBXBuildFile section */ - 9502BBF5267F5194003B0A59 /* CompanyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9502BBF4267F5194003B0A59 /* CompanyView.swift */; }; - 9502BBF7267F5974003B0A59 /* CompanyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9502BBF6267F5974003B0A59 /* CompanyResponse.swift */; }; - 9502BBF9267F59A0003B0A59 /* Company.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9502BBF8267F59A0003B0A59 /* Company.swift */; }; - 9502BBFB267F5EE8003B0A59 /* ChartHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9502BBFA267F5EE8003B0A59 /* ChartHelper.swift */; }; - 9502BBFD267F63F3003B0A59 /* CustomRectangleBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9502BBFC267F63F3003B0A59 /* CustomRectangleBox.swift */; }; - 9502BBFF267F6454003B0A59 /* KeyStatsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9502BBFE267F6454003B0A59 /* KeyStatsHelper.swift */; }; - 9502BC01267F8771003B0A59 /* KeyStatsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9502BC00267F8771003B0A59 /* KeyStatsList.swift */; }; - 950B6F3D267643460029E447 /* Purchases in Frameworks */ = {isa = PBXBuildFile; productRef = 950B6F3C267643460029E447 /* Purchases */; }; - 950B6F3F267643640029E447 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 950B6F3E267643640029E447 /* StoreKit.framework */; }; - 950B6F422676454A0029E447 /* RevenueCatTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950B6F412676454A0029E447 /* RevenueCatTest.swift */; }; - 950C57132629EF9100F234FE /* LazyBearTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950C57122629EF9100F234FE /* LazyBearTests.swift */; }; - 950C57232629EFC200F234FE /* LazyBearUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950C57222629EFC200F234FE /* LazyBearUITests.swift */; }; - 950D0E192618AA4900D17AD7 /* CompanyList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950D0E182618AA4900D17AD7 /* CompanyList.swift */; }; - 950D0E292618AEC800D17AD7 /* SearchedCompanyItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950D0E282618AEC800D17AD7 /* SearchedCompanyItem.swift */; }; - 95123AB826766497001BFAF3 /* CurrencySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95123AB726766497001BFAF3 /* CurrencySheet.swift */; }; - 95123ABA2676658E001BFAF3 /* StockSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95123AB92676658E001BFAF3 /* StockSheet.swift */; }; - 95123ABC2676676B001BFAF3 /* CurrencySheetRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95123ABB2676676B001BFAF3 /* CurrencySheetRow.swift */; }; - 95123ABE267669C6001BFAF3 /* StockSheetRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95123ABD267669C6001BFAF3 /* StockSheetRow.swift */; }; - 95123AC026767370001BFAF3 /* StockItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95123ABF26767370001BFAF3 /* StockItem.swift */; }; - 95131D46267A03020055C6DE /* WatchlistCompany+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95131D45267A02FC0055C6DE /* WatchlistCompany+CoreDataProperties.swift */; }; - 95131D47267A03020055C6DE /* WatchlistCompany+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95131D44267A02FC0055C6DE /* WatchlistCompany+CoreDataClass.swift */; }; - 95131D4B267A15490055C6DE /* WatchlistSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95131D4A267A15490055C6DE /* WatchlistSheet.swift */; }; - 951490552610BD2B00BDEEB5 /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 951490542610BD2B00BDEEB5 /* WelcomeView.swift */; }; - 951566E72613A2B6007C0F36 /* TradingDatesSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 951566E62613A2B6007C0F36 /* TradingDatesSheet.swift */; }; - 951566EA2613A37C007C0F36 /* TradingDatesItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 951566E92613A37C007C0F36 /* TradingDatesItem.swift */; }; - 9519BE06267E5EC3009C6015 /* ProfileStockRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9519BE05267E5EC3009C6015 /* ProfileStockRow.swift */; }; - 952045152610C7C600A76362 /* ConvertEpoch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952045142610C7C600A76362 /* ConvertEpoch.swift */; }; - 952457D8267E339C00D5BBCB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 952457D7267E339C00D5BBCB /* Assets.xcassets */; }; - 952457DF267E339C00D5BBCB /* LazyBearWatchOS Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 952457DE267E339C00D5BBCB /* LazyBearWatchOS Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 952457E4267E339C00D5BBCB /* LazyBearApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952457E3267E339C00D5BBCB /* LazyBearApp.swift */; }; - 952457E6267E339C00D5BBCB /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952457E5267E339C00D5BBCB /* ContentView.swift */; }; - 952457E8267E339C00D5BBCB /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952457E7267E339C00D5BBCB /* NotificationController.swift */; }; - 952457EA267E339C00D5BBCB /* NotificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952457E9267E339C00D5BBCB /* NotificationView.swift */; }; - 952457EC267E339C00D5BBCB /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952457EB267E339C00D5BBCB /* ComplicationController.swift */; }; - 952457EE267E339C00D5BBCB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 952457ED267E339C00D5BBCB /* Assets.xcassets */; }; - 952457F1267E339C00D5BBCB /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 952457F0267E339C00D5BBCB /* Preview Assets.xcassets */; }; - 952457FD267E339C00D5BBCB /* LazyBearWatchOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952457FC267E339C00D5BBCB /* LazyBearWatchOSTests.swift */; }; - 95245808267E339D00D5BBCB /* LazyBearWatchOSUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95245807267E339D00D5BBCB /* LazyBearWatchOSUITests.swift */; }; - 9524580C267E339D00D5BBCB /* LazyBearWatchOS.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 952457D5267E339B00D5BBCB /* LazyBearWatchOS.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 9529947E2629CA3E005F0AB0 /* Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9529947D2629CA3E005F0AB0 /* Search.swift */; }; - 952994822629CA46005F0AB0 /* SearchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952994812629CA46005F0AB0 /* SearchResponse.swift */; }; - 952FC0B8267C97BA001406B1 /* WatchlistSheetRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952FC0B7267C97BA001406B1 /* WatchlistSheetRow.swift */; }; - 952FC0BA267C9A24001406B1 /* RenameListSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952FC0B9267C9A24001406B1 /* RenameListSheet.swift */; }; - 953C96DE2688925E0096734C /* HapticsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953C96DD2688925E0096734C /* HapticsManager.swift */; }; - 953C96E0268898430096734C /* DefaultCompanies.json in Resources */ = {isa = PBXBuildFile; fileRef = 953C96DF268898430096734C /* DefaultCompanies.json */; }; - 953C96E2268898DC0096734C /* DefaultCompanyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953C96E1268898DC0096734C /* DefaultCompanyModel.swift */; }; - 9547482026821F7700D6A966 /* InsiderTransactionsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9547481F26821F7700D6A966 /* InsiderTransactionsHelper.swift */; }; - 9547482226821F8800D6A966 /* InsiderTransactionsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9547482126821F8800D6A966 /* InsiderTransactionsRow.swift */; }; - 9547482426821F9400D6A966 /* InsiderTransactionsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9547482326821F9400D6A966 /* InsiderTransactionsList.swift */; }; - 954D7EC2260BE70C00A13C50 /* SwiftlySearch in Frameworks */ = {isa = PBXBuildFile; productRef = 954D7EC1260BE70C00A13C50 /* SwiftlySearch */; }; - 954F9C5F268C79EA0022ED60 /* HomeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955E733B262356F3005652FF /* HomeResponse.swift */; }; - 954F9C60268C7A000022ED60 /* CurrencyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A07F6126305A9B009865AA /* CurrencyModel.swift */; }; - 954F9C61268C7A1C0022ED60 /* SectorPerformanceModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A07F7026305AD5009865AA /* SectorPerformanceModel.swift */; }; - 9550443A26111B2B000E0BCB /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9550443926111B2B000E0BCB /* HomeView.swift */; }; - 9550444326111E7A000E0BCB /* SectorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9550444226111E7A000E0BCB /* SectorRow.swift */; }; - 9550444626111EE5000E0BCB /* SectorItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9550444526111EE5000E0BCB /* SectorItem.swift */; }; - 9550444926111FC9000E0BCB /* StockRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9550444826111FC9000E0BCB /* StockRow.swift */; }; - 955E73392623568F005652FF /* Home.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955E73382623568F005652FF /* Home.swift */; }; - 955E733C262356F3005652FF /* HomeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955E733B262356F3005652FF /* HomeResponse.swift */; }; - 95602704265ABB990046F97E /* InsiderRosterModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95602703265ABB990046F97E /* InsiderRosterModel.swift */; }; - 95613ADF264FC6FD00D4CE8F /* LatestNewsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95613ADE264FC6FD00D4CE8F /* LatestNewsModel.swift */; }; - 9562404C263C766D00C6C511 /* WatchlistCreator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9562404B263C766D00C6C511 /* WatchlistCreator.swift */; }; - 9562404E263C7D8800C6C511 /* WatchlistCreatorClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9562404D263C7D8800C6C511 /* WatchlistCreatorClass.swift */; }; - 95629DA02645298E007AF020 /* Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95629D9F2645298E007AF020 /* Profile.swift */; }; - 95672B8F25DDA54700DCBE4A /* LazyBearApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95672B8E25DDA54700DCBE4A /* LazyBearApp.swift */; }; - 95672B9325DDA54700DCBE4A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95672B9225DDA54700DCBE4A /* Assets.xcassets */; }; - 95672B9625DDA54700DCBE4A /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95672B9525DDA54700DCBE4A /* Preview Assets.xcassets */; }; - 95672B9825DDA54700DCBE4A /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95672B9725DDA54700DCBE4A /* Persistence.swift */; }; - 95672B9B25DDA54800DCBE4A /* LazyBear.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 95672B9925DDA54800DCBE4A /* LazyBear.xcdatamodeld */; }; - 95721DA6262761E700EC527B /* CurrencyRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95721DA5262761E700EC527B /* CurrencyRow.swift */; }; - 9576BFEB26810661002BCAC6 /* InsiderRosterHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9576BFEA26810661002BCAC6 /* InsiderRosterHelper.swift */; }; - 9576BFED26810713002BCAC6 /* InsiderRosterList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9576BFEC26810713002BCAC6 /* InsiderRosterList.swift */; }; - 9576BFEF26810719002BCAC6 /* InsiderRosterRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9576BFEE26810719002BCAC6 /* InsiderRosterRow.swift */; }; - 958A735225E0170900FD7ECA /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 958A735125E0170900FD7ECA /* CloudKit.framework */; }; - 9594F0402651355B00CFA8D4 /* HistoricalPricesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9594F03F2651355B00CFA8D4 /* HistoricalPricesModel.swift */; }; - 9595DC342682849E00DC8104 /* WatchOSProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9595DC332682849E00DC8104 /* WatchOSProfileView.swift */; }; - 9595DC36268284B100DC8104 /* WatchOSCompanyRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9595DC35268284B100DC8104 /* WatchOSCompanyRow.swift */; }; - 9595DC37268284FA00DC8104 /* WatchlistCompany+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95131D44267A02FC0055C6DE /* WatchlistCompany+CoreDataClass.swift */; }; - 9595DC382682850000DC8104 /* WatchlistCompany+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95131D45267A02FC0055C6DE /* WatchlistCompany+CoreDataProperties.swift */; }; - 95A07F6226305A9B009865AA /* CurrencyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A07F6126305A9B009865AA /* CurrencyModel.swift */; }; - 95A07F6C26305AC6009865AA /* QuoteModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A07F6B26305AC6009865AA /* QuoteModel.swift */; }; - 95A07F7126305AD5009865AA /* SectorPerformanceModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A07F7026305AD5009865AA /* SectorPerformanceModel.swift */; }; - 95A4B930263E9F530056F036 /* WatchlistCreatorList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A4B92F263E9F530056F036 /* WatchlistCreatorList.swift */; }; - 95A4B933263E9F810056F036 /* Introspect in Frameworks */ = {isa = PBXBuildFile; productRef = 95A4B932263E9F810056F036 /* Introspect */; }; - 95A4B935263EA31C0056F036 /* WatchlistCreatorSearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A4B934263EA31C0056F036 /* WatchlistCreatorSearchBar.swift */; }; - 95A4B937263EA5C20056F036 /* WatchlistCreatorRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A4B936263EA5C20056F036 /* WatchlistCreatorRow.swift */; }; - 95A7C066261639E0003E2EC1 /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A7C065261639DF003E2EC1 /* SearchView.swift */; }; - 95A7C0742616409D003E2EC1 /* ParseJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A7C0732616409D003E2EC1 /* ParseJSON.swift */; }; - 95AD4A2D26078C1400498079 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AD4A2C26078C1400498079 /* ContentView.swift */; }; - 95AF0FF72671320F0049C4AB /* DisplayWords.json in Resources */ = {isa = PBXBuildFile; fileRef = 95AF0FF62671320F0049C4AB /* DisplayWords.json */; }; - 95AF0FF92671342E0049C4AB /* DisplayWordsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AF0FF82671342E0049C4AB /* DisplayWordsModel.swift */; }; - 95B85AB6267FAE7A0080CF39 /* ConditionalModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95B85AB5267FAE7A0080CF39 /* ConditionalModifier.swift */; }; - 95BB05B22670B8C3005A2029 /* KeyStatsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BB05B12670B8C3005A2029 /* KeyStatsModel.swift */; }; - 95BC1C642683326C00F94373 /* KeyStatsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BC1C632683326C00F94373 /* KeyStatsRow.swift */; }; - 95BC1C66268336A200F94373 /* UnwrapAnyOptional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BC1C65268336A200F94373 /* UnwrapAnyOptional.swift */; }; - 95BEA1A626876DE100BF18AB /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 95BEA1A526876DE100BF18AB /* Alamofire */; }; - 95BEA1AA268777CC00BF18AB /* Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95629D9F2645298E007AF020 /* Profile.swift */; }; - 95BEA1AC268778E500BF18AB /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 95BEA1AB268778E500BF18AB /* Alamofire */; }; - 95BEA1AD2687791000BF18AB /* ProfileResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C8C0DF262A369F0082D1D9 /* ProfileResponse.swift */; }; - 95BEA1AE2687791800BF18AB /* CompanyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C22F3E26776F010014C98A /* CompanyModel.swift */; }; - 95BEA1AF2687794A00BF18AB /* RequestType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95E8BAA22656D86E0016AE72 /* RequestType.swift */; }; - 95BEA1B326877BAC00BF18AB /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95672B9725DDA54700DCBE4A /* Persistence.swift */; }; - 95BEA1B426877BBA00BF18AB /* LazyBear.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 95672B9925DDA54800DCBE4A /* LazyBear.xcdatamodeld */; }; - 95C22F3F26776F010014C98A /* CompanyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C22F3E26776F010014C98A /* CompanyModel.swift */; }; - 95C8C0E0262A369F0082D1D9 /* ProfileResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C8C0DF262A369F0082D1D9 /* ProfileResponse.swift */; }; - 95CCFB56266E7A0F00C384A1 /* InsiderTransactionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CCFB55266E7A0F00C384A1 /* InsiderTransactionModel.swift */; }; - 95CCFB5E266E855800C384A1 /* GetDateComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CCFB5D266E855800C384A1 /* GetDateComponents.swift */; }; - 95CCFB60266E864C00C384A1 /* ConvertStringToDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CCFB5F266E864C00C384A1 /* ConvertStringToDate.swift */; }; - 95CF46A32688BC0B0028C5A2 /* WatchOSCompanyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CF46A22688BC0B0028C5A2 /* WatchOSCompanyView.swift */; }; - 95CF46A92688C74C0028C5A2 /* Company.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9502BBF8267F59A0003B0A59 /* Company.swift */; }; - 95CF46AC2688C7810028C5A2 /* QuoteModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A07F6B26305AC6009865AA /* QuoteModel.swift */; }; - 95CF46AD2688C78C0028C5A2 /* LatestNewsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95613ADE264FC6FD00D4CE8F /* LatestNewsModel.swift */; }; - 95CF46B72688F89B0028C5A2 /* WatchOSChartHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CF46B62688F89B0028C5A2 /* WatchOSChartHelper.swift */; }; - 95CF46B92688F8A60028C5A2 /* WatchOSNewsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CF46B82688F8A60028C5A2 /* WatchOSNewsList.swift */; }; - 95CF46C32689165F0028C5A2 /* WatchOSNewsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CF46C22689165F0028C5A2 /* WatchOSNewsRow.swift */; }; - 95CF46C4268916960028C5A2 /* ConvertEpoch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952045142610C7C600A76362 /* ConvertEpoch.swift */; }; - 95CF46C6268919E40028C5A2 /* WatchOSNewsDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CF46C5268919E40028C5A2 /* WatchOSNewsDetail.swift */; }; - 95CF46CD26891E180028C5A2 /* DisplayWords.json in Resources */ = {isa = PBXBuildFile; fileRef = 95AF0FF62671320F0049C4AB /* DisplayWords.json */; }; - 95CF46D92689C7540028C5A2 /* CompanyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9502BBF6267F5974003B0A59 /* CompanyResponse.swift */; }; - 95CF46DA2689C77C0028C5A2 /* HistoricalPricesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9594F03F2651355B00CFA8D4 /* HistoricalPricesModel.swift */; }; - 95CF46DB2689C78D0028C5A2 /* KeyStatsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BB05B12670B8C3005A2029 /* KeyStatsModel.swift */; }; - 95CF46DC2689C7930028C5A2 /* InsiderRosterModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95602703265ABB990046F97E /* InsiderRosterModel.swift */; }; - 95CF46DD2689C7960028C5A2 /* InsiderTransactionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CCFB55266E7A0F00C384A1 /* InsiderTransactionModel.swift */; }; - 95CF46DF2689D72E0028C5A2 /* ComplicationViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CF46DE2689D72E0028C5A2 /* ComplicationViews.swift */; }; - 95CF46E22689E1790028C5A2 /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95CF46E12689E1790028C5A2 /* CloudKit.framework */; }; - 95CF46EC2689F1B70028C5A2 /* StockCharts in Frameworks */ = {isa = PBXBuildFile; productRef = 95CF46EB2689F1B70028C5A2 /* StockCharts */; }; - 95CF46EE2689F1C00028C5A2 /* StockCharts in Frameworks */ = {isa = PBXBuildFile; productRef = 95CF46ED2689F1C00028C5A2 /* StockCharts */; }; - 95D308F82624B3A400A39F77 /* CurrencyItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95D308F72624B3A400A39F77 /* CurrencyItem.swift */; }; - 95E2DBF82673752F007FCCB4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 95E2DBF72673752F007FCCB4 /* LaunchScreen.storyboard */; }; - 95E4A2D7268091F900A6FEB9 /* NewsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95E4A2D6268091F900A6FEB9 /* NewsHelper.swift */; }; - 95E4A2D92680931300A6FEB9 /* NewsRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95E4A2D82680931300A6FEB9 /* NewsRow.swift */; }; - 95E4A2E02680A70000A6FEB9 /* NewsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95E4A2DF2680A70000A6FEB9 /* NewsList.swift */; }; - 95E4A2E22680AD7C00A6FEB9 /* SFSafariViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95E4A2E12680AD7C00A6FEB9 /* SFSafariViewWrapper.swift */; }; - 95E8BAA32656D86E0016AE72 /* RequestType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95E8BAA22656D86E0016AE72 /* RequestType.swift */; }; - 95FBE0DC2619CA7200440386 /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95FBE0DB2619CA7200440386 /* ProfileView.swift */; }; + 95F7C16126A2CCA2002F08DB /* lazybearApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F7C16026A2CCA2002F08DB /* lazybearApp.swift */; }; + 95F7C16326A2CCA2002F08DB /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F7C16226A2CCA2002F08DB /* ContentView.swift */; }; + 95F7C16526A2CCA2002F08DB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95F7C16426A2CCA2002F08DB /* Assets.xcassets */; }; + 95F7C16826A2CCA2002F08DB /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95F7C16726A2CCA2002F08DB /* Preview Assets.xcassets */; }; + 95F7C16A26A2CCA2002F08DB /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F7C16926A2CCA2002F08DB /* Persistence.swift */; }; + 95F7C16D26A2CCA2002F08DB /* lazybear.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 95F7C16B26A2CCA2002F08DB /* lazybear.xcdatamodeld */; }; + 95F7C17826A2CCA3002F08DB /* lazybearTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F7C17726A2CCA3002F08DB /* lazybearTests.swift */; }; + 95F7C18326A2CCA3002F08DB /* lazybearUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F7C18226A2CCA3002F08DB /* lazybearUITests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 950C57152629EF9100F234FE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 95672B8325DDA54700DCBE4A /* Project object */; - proxyType = 1; - remoteGlobalIDString = 95672B8A25DDA54700DCBE4A; - remoteInfo = LazyBear; - }; - 950C57252629EFC200F234FE /* PBXContainerItemProxy */ = { + 95F7C17426A2CCA3002F08DB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 95672B8325DDA54700DCBE4A /* Project object */; + containerPortal = 95F7C15526A2CCA2002F08DB /* Project object */; proxyType = 1; - remoteGlobalIDString = 95672B8A25DDA54700DCBE4A; - remoteInfo = LazyBear; - }; - 952457E0267E339C00D5BBCB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 95672B8325DDA54700DCBE4A /* Project object */; - proxyType = 1; - remoteGlobalIDString = 952457DD267E339C00D5BBCB; - remoteInfo = "LazyBearWatchOS Extension"; + remoteGlobalIDString = 95F7C15C26A2CCA2002F08DB; + remoteInfo = lazybear; }; - 952457F9267E339C00D5BBCB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 95672B8325DDA54700DCBE4A /* Project object */; - proxyType = 1; - remoteGlobalIDString = 952457DD267E339C00D5BBCB; - remoteInfo = "LazyBearWatchOS Extension"; - }; - 95245804267E339D00D5BBCB /* PBXContainerItemProxy */ = { + 95F7C17F26A2CCA3002F08DB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 95672B8325DDA54700DCBE4A /* Project object */; + containerPortal = 95F7C15526A2CCA2002F08DB /* Project object */; proxyType = 1; - remoteGlobalIDString = 952457D4267E339B00D5BBCB; - remoteInfo = LazyBearWatchOS; - }; - 9524580A267E339D00D5BBCB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 95672B8325DDA54700DCBE4A /* Project object */; - proxyType = 1; - remoteGlobalIDString = 952457D4267E339B00D5BBCB; - remoteInfo = LazyBearWatchOS; + remoteGlobalIDString = 95F7C15C26A2CCA2002F08DB; + remoteInfo = lazybear; }; /* End PBXContainerItemProxy section */ -/* Begin PBXCopyFilesBuildPhase section */ - 9524580D267E339D00D5BBCB /* Embed Watch Content */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; - dstSubfolderSpec = 16; - files = ( - 9524580C267E339D00D5BBCB /* LazyBearWatchOS.app in Embed Watch Content */, - ); - name = "Embed Watch Content"; - runOnlyForDeploymentPostprocessing = 0; - }; - 95245810267E339D00D5BBCB /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 952457DF267E339C00D5BBCB /* LazyBearWatchOS Extension.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ - 9502BBF4267F5194003B0A59 /* CompanyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompanyView.swift; sourceTree = ""; }; - 9502BBF6267F5974003B0A59 /* CompanyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompanyResponse.swift; sourceTree = ""; }; - 9502BBF8267F59A0003B0A59 /* Company.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Company.swift; sourceTree = ""; }; - 9502BBFA267F5EE8003B0A59 /* ChartHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartHelper.swift; sourceTree = ""; }; - 9502BBFC267F63F3003B0A59 /* CustomRectangleBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomRectangleBox.swift; sourceTree = ""; }; - 9502BBFE267F6454003B0A59 /* KeyStatsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyStatsHelper.swift; sourceTree = ""; }; - 9502BC00267F8771003B0A59 /* KeyStatsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyStatsList.swift; sourceTree = ""; }; - 950B6F3E267643640029E447 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; - 950B6F412676454A0029E447 /* RevenueCatTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RevenueCatTest.swift; sourceTree = ""; }; - 950C57102629EF9100F234FE /* LazyBearTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LazyBearTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 950C57122629EF9100F234FE /* LazyBearTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyBearTests.swift; sourceTree = ""; }; - 950C57142629EF9100F234FE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 950C57202629EFC200F234FE /* LazyBearUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LazyBearUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 950C57222629EFC200F234FE /* LazyBearUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyBearUITests.swift; sourceTree = ""; }; - 950C57242629EFC200F234FE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 950C572D2629F03A00F234FE /* LazyBear.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = LazyBear.xctestplan; path = LazyBear.xcodeproj/LazyBear.xctestplan; sourceTree = ""; }; - 950D0E182618AA4900D17AD7 /* CompanyList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompanyList.swift; sourceTree = ""; }; - 950D0E282618AEC800D17AD7 /* SearchedCompanyItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchedCompanyItem.swift; sourceTree = ""; }; - 95123AB726766497001BFAF3 /* CurrencySheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencySheet.swift; sourceTree = ""; }; - 95123AB92676658E001BFAF3 /* StockSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StockSheet.swift; sourceTree = ""; }; - 95123ABB2676676B001BFAF3 /* CurrencySheetRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencySheetRow.swift; sourceTree = ""; }; - 95123ABD267669C6001BFAF3 /* StockSheetRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StockSheetRow.swift; sourceTree = ""; }; - 95123ABF26767370001BFAF3 /* StockItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StockItem.swift; sourceTree = ""; }; - 95131D44267A02FC0055C6DE /* WatchlistCompany+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WatchlistCompany+CoreDataClass.swift"; sourceTree = ""; }; - 95131D45267A02FC0055C6DE /* WatchlistCompany+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WatchlistCompany+CoreDataProperties.swift"; sourceTree = ""; }; - 95131D4A267A15490055C6DE /* WatchlistSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchlistSheet.swift; sourceTree = ""; }; - 951490542610BD2B00BDEEB5 /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = ""; }; - 951566E62613A2B6007C0F36 /* TradingDatesSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TradingDatesSheet.swift; sourceTree = ""; }; - 951566E92613A37C007C0F36 /* TradingDatesItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TradingDatesItem.swift; sourceTree = ""; }; - 9519BE05267E5EC3009C6015 /* ProfileStockRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileStockRow.swift; sourceTree = ""; }; - 952045142610C7C600A76362 /* ConvertEpoch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConvertEpoch.swift; sourceTree = ""; }; - 952457D5267E339B00D5BBCB /* LazyBearWatchOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LazyBearWatchOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 952457D7267E339C00D5BBCB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 952457D9267E339C00D5BBCB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 952457DE267E339C00D5BBCB /* LazyBearWatchOS Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "LazyBearWatchOS Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - 952457E3267E339C00D5BBCB /* LazyBearApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyBearApp.swift; sourceTree = ""; }; - 952457E5267E339C00D5BBCB /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 952457E7267E339C00D5BBCB /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; }; - 952457E9267E339C00D5BBCB /* NotificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationView.swift; sourceTree = ""; }; - 952457EB267E339C00D5BBCB /* ComplicationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = ""; }; - 952457ED267E339C00D5BBCB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 952457F0267E339C00D5BBCB /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 952457F2267E339C00D5BBCB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 952457F3267E339C00D5BBCB /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; - 952457F8267E339C00D5BBCB /* LazyBearWatchOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LazyBearWatchOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 952457FC267E339C00D5BBCB /* LazyBearWatchOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyBearWatchOSTests.swift; sourceTree = ""; }; - 952457FE267E339C00D5BBCB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 95245803267E339D00D5BBCB /* LazyBearWatchOSUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LazyBearWatchOSUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 95245807267E339D00D5BBCB /* LazyBearWatchOSUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyBearWatchOSUITests.swift; sourceTree = ""; }; - 95245809267E339D00D5BBCB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9529947D2629CA3E005F0AB0 /* Search.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Search.swift; sourceTree = ""; }; - 952994812629CA46005F0AB0 /* SearchResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResponse.swift; sourceTree = ""; }; - 952FC0B7267C97BA001406B1 /* WatchlistSheetRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchlistSheetRow.swift; sourceTree = ""; }; - 952FC0B9267C9A24001406B1 /* RenameListSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenameListSheet.swift; sourceTree = ""; }; - 953C96DD2688925E0096734C /* HapticsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HapticsManager.swift; sourceTree = ""; }; - 953C96DF268898430096734C /* DefaultCompanies.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = DefaultCompanies.json; sourceTree = ""; }; - 953C96E1268898DC0096734C /* DefaultCompanyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultCompanyModel.swift; sourceTree = ""; }; - 9547481F26821F7700D6A966 /* InsiderTransactionsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsiderTransactionsHelper.swift; sourceTree = ""; }; - 9547482126821F8800D6A966 /* InsiderTransactionsRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsiderTransactionsRow.swift; sourceTree = ""; }; - 9547482326821F9400D6A966 /* InsiderTransactionsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsiderTransactionsList.swift; sourceTree = ""; }; - 9550443926111B2B000E0BCB /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; - 9550444226111E7A000E0BCB /* SectorRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectorRow.swift; sourceTree = ""; }; - 9550444526111EE5000E0BCB /* SectorItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectorItem.swift; sourceTree = ""; }; - 9550444826111FC9000E0BCB /* StockRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StockRow.swift; sourceTree = ""; }; - 955E73382623568F005652FF /* Home.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Home.swift; sourceTree = ""; }; - 955E733B262356F3005652FF /* HomeResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeResponse.swift; sourceTree = ""; }; - 95602703265ABB990046F97E /* InsiderRosterModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsiderRosterModel.swift; sourceTree = ""; }; - 95613ADE264FC6FD00D4CE8F /* LatestNewsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LatestNewsModel.swift; sourceTree = ""; }; - 9562404A263C72E800C6C511 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 9562404B263C766D00C6C511 /* WatchlistCreator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchlistCreator.swift; sourceTree = ""; }; - 9562404D263C7D8800C6C511 /* WatchlistCreatorClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchlistCreatorClass.swift; sourceTree = ""; }; - 95629D9F2645298E007AF020 /* Profile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Profile.swift; sourceTree = ""; }; - 95672B8B25DDA54700DCBE4A /* LazyBear.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LazyBear.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 95672B8E25DDA54700DCBE4A /* LazyBearApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyBearApp.swift; sourceTree = ""; }; - 95672B9225DDA54700DCBE4A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 95672B9525DDA54700DCBE4A /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 95672B9725DDA54700DCBE4A /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; - 95672B9A25DDA54800DCBE4A /* LazyBear.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = LazyBear.xcdatamodel; sourceTree = ""; }; - 95672B9C25DDA54800DCBE4A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 95721DA5262761E700EC527B /* CurrencyRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyRow.swift; sourceTree = ""; }; - 9576BFEA26810661002BCAC6 /* InsiderRosterHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsiderRosterHelper.swift; sourceTree = ""; }; - 9576BFEC26810713002BCAC6 /* InsiderRosterList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsiderRosterList.swift; sourceTree = ""; }; - 9576BFEE26810719002BCAC6 /* InsiderRosterRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsiderRosterRow.swift; sourceTree = ""; }; - 958A734E25E016FD00FD7ECA /* LazyBear.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LazyBear.entitlements; sourceTree = ""; }; - 958A735125E0170900FD7ECA /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; - 9594F03F2651355B00CFA8D4 /* HistoricalPricesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoricalPricesModel.swift; sourceTree = ""; }; - 9595DC332682849E00DC8104 /* WatchOSProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchOSProfileView.swift; sourceTree = ""; }; - 9595DC35268284B100DC8104 /* WatchOSCompanyRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchOSCompanyRow.swift; sourceTree = ""; }; - 95A07F6126305A9B009865AA /* CurrencyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyModel.swift; sourceTree = ""; }; - 95A07F6B26305AC6009865AA /* QuoteModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuoteModel.swift; sourceTree = ""; }; - 95A07F7026305AD5009865AA /* SectorPerformanceModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectorPerformanceModel.swift; sourceTree = ""; }; - 95A4B92F263E9F530056F036 /* WatchlistCreatorList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchlistCreatorList.swift; sourceTree = ""; }; - 95A4B934263EA31C0056F036 /* WatchlistCreatorSearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchlistCreatorSearchBar.swift; sourceTree = ""; }; - 95A4B936263EA5C20056F036 /* WatchlistCreatorRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchlistCreatorRow.swift; sourceTree = ""; }; - 95A7C065261639DF003E2EC1 /* SearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = ""; }; - 95A7C0732616409D003E2EC1 /* ParseJSON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseJSON.swift; sourceTree = ""; }; - 95AD4A2C26078C1400498079 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 95AF0FF62671320F0049C4AB /* DisplayWords.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = DisplayWords.json; sourceTree = ""; }; - 95AF0FF82671342E0049C4AB /* DisplayWordsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayWordsModel.swift; sourceTree = ""; }; - 95B85AB5267FAE7A0080CF39 /* ConditionalModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionalModifier.swift; sourceTree = ""; }; - 95BB05B12670B8C3005A2029 /* KeyStatsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyStatsModel.swift; sourceTree = ""; }; - 95BC1C632683326C00F94373 /* KeyStatsRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyStatsRow.swift; sourceTree = ""; }; - 95BC1C65268336A200F94373 /* UnwrapAnyOptional.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnwrapAnyOptional.swift; sourceTree = ""; }; - 95C22F3E26776F010014C98A /* CompanyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompanyModel.swift; sourceTree = ""; }; - 95C8C0DF262A369F0082D1D9 /* ProfileResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileResponse.swift; sourceTree = ""; }; - 95CCFB55266E7A0F00C384A1 /* InsiderTransactionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsiderTransactionModel.swift; sourceTree = ""; }; - 95CCFB5D266E855800C384A1 /* GetDateComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetDateComponents.swift; sourceTree = ""; }; - 95CCFB5F266E864C00C384A1 /* ConvertStringToDate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConvertStringToDate.swift; sourceTree = ""; }; - 95CF46A22688BC0B0028C5A2 /* WatchOSCompanyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchOSCompanyView.swift; sourceTree = ""; }; - 95CF46B62688F89B0028C5A2 /* WatchOSChartHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchOSChartHelper.swift; sourceTree = ""; }; - 95CF46B82688F8A60028C5A2 /* WatchOSNewsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchOSNewsList.swift; sourceTree = ""; }; - 95CF46C22689165F0028C5A2 /* WatchOSNewsRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchOSNewsRow.swift; sourceTree = ""; }; - 95CF46C5268919E40028C5A2 /* WatchOSNewsDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchOSNewsDetail.swift; sourceTree = ""; }; - 95CF46DE2689D72E0028C5A2 /* ComplicationViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationViews.swift; sourceTree = ""; }; - 95CF46E02689E1540028C5A2 /* LazyBearWatchOS Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "LazyBearWatchOS Extension.entitlements"; sourceTree = ""; }; - 95CF46E12689E1790028C5A2 /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS7.4.sdk/System/Library/Frameworks/CloudKit.framework; sourceTree = DEVELOPER_DIR; }; - 95D308F72624B3A400A39F77 /* CurrencyItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyItem.swift; sourceTree = ""; }; - 95E2DBF72673752F007FCCB4 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; - 95E4A2D6268091F900A6FEB9 /* NewsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsHelper.swift; sourceTree = ""; }; - 95E4A2D82680931300A6FEB9 /* NewsRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsRow.swift; sourceTree = ""; }; - 95E4A2DF2680A70000A6FEB9 /* NewsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsList.swift; sourceTree = ""; }; - 95E4A2E12680AD7C00A6FEB9 /* SFSafariViewWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SFSafariViewWrapper.swift; sourceTree = ""; }; - 95E8BAA22656D86E0016AE72 /* RequestType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestType.swift; sourceTree = ""; }; - 95FBE0DB2619CA7200440386 /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = ""; }; + 95F7C15D26A2CCA2002F08DB /* lazybear.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = lazybear.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 95F7C16026A2CCA2002F08DB /* lazybearApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = lazybearApp.swift; sourceTree = ""; }; + 95F7C16226A2CCA2002F08DB /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 95F7C16426A2CCA2002F08DB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 95F7C16726A2CCA2002F08DB /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 95F7C16926A2CCA2002F08DB /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; + 95F7C16C26A2CCA2002F08DB /* lazybear.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = lazybear.xcdatamodel; sourceTree = ""; }; + 95F7C16E26A2CCA2002F08DB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 95F7C17326A2CCA3002F08DB /* lazybearTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = lazybearTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 95F7C17726A2CCA3002F08DB /* lazybearTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = lazybearTests.swift; sourceTree = ""; }; + 95F7C17926A2CCA3002F08DB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 95F7C17E26A2CCA3002F08DB /* lazybearUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = lazybearUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 95F7C18226A2CCA3002F08DB /* lazybearUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = lazybearUITests.swift; sourceTree = ""; }; + 95F7C18426A2CCA3002F08DB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 950C570D2629EF9100F234FE /* Frameworks */ = { + 95F7C15A26A2CCA2002F08DB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 950C571D2629EFC200F234FE /* Frameworks */ = { + 95F7C17026A2CCA3002F08DB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 952457DB267E339C00D5BBCB /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 95CF46E22689E1790028C5A2 /* CloudKit.framework in Frameworks */, - 95BEA1AC268778E500BF18AB /* Alamofire in Frameworks */, - 95CF46EE2689F1C00028C5A2 /* StockCharts in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 952457F5267E339C00D5BBCB /* Frameworks */ = { + 95F7C17B26A2CCA3002F08DB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 95245800267E339D00D5BBCB /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 95672B8825DDA54700DCBE4A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 958A735225E0170900FD7ECA /* CloudKit.framework in Frameworks */, - 95BEA1A626876DE100BF18AB /* Alamofire in Frameworks */, - 950B6F3F267643640029E447 /* StoreKit.framework in Frameworks */, - 95CF46EC2689F1B70028C5A2 /* StockCharts in Frameworks */, - 95A4B933263E9F810056F036 /* Introspect in Frameworks */, - 950B6F3D267643460029E447 /* Purchases in Frameworks */, - 954D7EC2260BE70C00A13C50 /* SwiftlySearch in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 950B6F402676452E0029E447 /* Tests */ = { - isa = PBXGroup; - children = ( - 950B6F412676454A0029E447 /* RevenueCatTest.swift */, - ); - path = Tests; - sourceTree = ""; - }; - 950C57112629EF9100F234FE /* LazyBearTests */ = { - isa = PBXGroup; - children = ( - 950C57122629EF9100F234FE /* LazyBearTests.swift */, - 950C57142629EF9100F234FE /* Info.plist */, - ); - path = LazyBearTests; - sourceTree = ""; - }; - 950C57212629EFC200F234FE /* LazyBearUITests */ = { + 95F7C15426A2CCA2002F08DB = { isa = PBXGroup; children = ( - 950C57222629EFC200F234FE /* LazyBearUITests.swift */, - 950C57242629EFC200F234FE /* Info.plist */, + 95F7C15F26A2CCA2002F08DB /* lazybear */, + 95F7C17626A2CCA3002F08DB /* lazybearTests */, + 95F7C18126A2CCA3002F08DB /* lazybearUITests */, + 95F7C15E26A2CCA2002F08DB /* Products */, ); - path = LazyBearUITests; sourceTree = ""; }; - 950D0E272618AEBB00D17AD7 /* Helpers */ = { - isa = PBXGroup; - children = ( - 950D0E282618AEC800D17AD7 /* SearchedCompanyItem.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 951490572610BD3000BDEEB5 /* Welcome */ = { - isa = PBXGroup; - children = ( - 951490542610BD2B00BDEEB5 /* WelcomeView.swift */, - ); - path = Welcome; - sourceTree = ""; - }; - 952045132610C7A200A76362 /* Global functions */ = { + 95F7C15E26A2CCA2002F08DB /* Products */ = { isa = PBXGroup; children = ( - 952045142610C7C600A76362 /* ConvertEpoch.swift */, - 95A7C0732616409D003E2EC1 /* ParseJSON.swift */, - 95CCFB5D266E855800C384A1 /* GetDateComponents.swift */, - 95CCFB5F266E864C00C384A1 /* ConvertStringToDate.swift */, - 95B85AB5267FAE7A0080CF39 /* ConditionalModifier.swift */, - 95BC1C65268336A200F94373 /* UnwrapAnyOptional.swift */, + 95F7C15D26A2CCA2002F08DB /* lazybear.app */, + 95F7C17326A2CCA3002F08DB /* lazybearTests.xctest */, + 95F7C17E26A2CCA3002F08DB /* lazybearUITests.xctest */, ); - path = "Global functions"; + name = Products; sourceTree = ""; }; - 9523ED402615BD93006D3D6F /* Resources */ = { - isa = PBXGroup; - children = ( - 95AF0FF62671320F0049C4AB /* DisplayWords.json */, - 953C96DF268898430096734C /* DefaultCompanies.json */, - ); - path = Resources; - sourceTree = ""; - }; - 952457D6267E339B00D5BBCB /* LazyBearWatchOS */ = { + 95F7C15F26A2CCA2002F08DB /* lazybear */ = { isa = PBXGroup; children = ( - 952457D7267E339C00D5BBCB /* Assets.xcassets */, - 952457D9267E339C00D5BBCB /* Info.plist */, + 95F7C16026A2CCA2002F08DB /* lazybearApp.swift */, + 95F7C16226A2CCA2002F08DB /* ContentView.swift */, + 95F7C16426A2CCA2002F08DB /* Assets.xcassets */, + 95F7C16926A2CCA2002F08DB /* Persistence.swift */, + 95F7C16E26A2CCA2002F08DB /* Info.plist */, + 95F7C16B26A2CCA2002F08DB /* lazybear.xcdatamodeld */, + 95F7C16626A2CCA2002F08DB /* Preview Content */, ); - path = LazyBearWatchOS; + path = lazybear; sourceTree = ""; }; - 952457E2267E339C00D5BBCB /* LazyBearWatchOS Extension */ = { + 95F7C16626A2CCA2002F08DB /* Preview Content */ = { isa = PBXGroup; children = ( - 95CF46E02689E1540028C5A2 /* LazyBearWatchOS Extension.entitlements */, - 952457E3267E339C00D5BBCB /* LazyBearApp.swift */, - 952457E5267E339C00D5BBCB /* ContentView.swift */, - 952457E7267E339C00D5BBCB /* NotificationController.swift */, - 952457E9267E339C00D5BBCB /* NotificationView.swift */, - 952457EB267E339C00D5BBCB /* ComplicationController.swift */, - 95CF46DE2689D72E0028C5A2 /* ComplicationViews.swift */, - 952457ED267E339C00D5BBCB /* Assets.xcassets */, - 952457F2267E339C00D5BBCB /* Info.plist */, - 952457F3267E339C00D5BBCB /* PushNotificationPayload.apns */, - 9595DC2E2682840C00DC8104 /* Views */, - 952457EF267E339C00D5BBCB /* Preview Content */, - ); - path = "LazyBearWatchOS Extension"; - sourceTree = ""; - }; - 952457EF267E339C00D5BBCB /* Preview Content */ = { - isa = PBXGroup; - children = ( - 952457F0267E339C00D5BBCB /* Preview Assets.xcassets */, + 95F7C16726A2CCA2002F08DB /* Preview Assets.xcassets */, ); path = "Preview Content"; sourceTree = ""; }; - 952457FB267E339C00D5BBCB /* LazyBearWatchOSTests */ = { - isa = PBXGroup; - children = ( - 952457FC267E339C00D5BBCB /* LazyBearWatchOSTests.swift */, - 952457FE267E339C00D5BBCB /* Info.plist */, - ); - path = LazyBearWatchOSTests; - sourceTree = ""; - }; - 95245806267E339D00D5BBCB /* LazyBearWatchOSUITests */ = { - isa = PBXGroup; - children = ( - 95245807267E339D00D5BBCB /* LazyBearWatchOSUITests.swift */, - 95245809267E339D00D5BBCB /* Info.plist */, - ); - path = LazyBearWatchOSUITests; - sourceTree = ""; - }; - 9529947C2629CA2F005F0AB0 /* Networking */ = { - isa = PBXGroup; - children = ( - 9529947D2629CA3E005F0AB0 /* Search.swift */, - 952994812629CA46005F0AB0 /* SearchResponse.swift */, - ); - path = Networking; - sourceTree = ""; - }; - 954D7E9D260BBA5200A13C50 /* Global Models */ = { - isa = PBXGroup; - children = ( - 95131D44267A02FC0055C6DE /* WatchlistCompany+CoreDataClass.swift */, - 95131D45267A02FC0055C6DE /* WatchlistCompany+CoreDataProperties.swift */, - 95A07F6126305A9B009865AA /* CurrencyModel.swift */, - 95A07F6B26305AC6009865AA /* QuoteModel.swift */, - 95A07F7026305AD5009865AA /* SectorPerformanceModel.swift */, - 95613ADE264FC6FD00D4CE8F /* LatestNewsModel.swift */, - 9594F03F2651355B00CFA8D4 /* HistoricalPricesModel.swift */, - 95602703265ABB990046F97E /* InsiderRosterModel.swift */, - 95CCFB55266E7A0F00C384A1 /* InsiderTransactionModel.swift */, - 95BB05B12670B8C3005A2029 /* KeyStatsModel.swift */, - 95AF0FF82671342E0049C4AB /* DisplayWordsModel.swift */, - 95E8BAA22656D86E0016AE72 /* RequestType.swift */, - 95C22F3E26776F010014C98A /* CompanyModel.swift */, - 953C96E1268898DC0096734C /* DefaultCompanyModel.swift */, - ); - path = "Global Models"; - sourceTree = ""; - }; - 954D7EAA260BBB0E00A13C50 /* Home */ = { - isa = PBXGroup; - children = ( - 9550443926111B2B000E0BCB /* HomeView.swift */, - 954D7EAF260BBBD500A13C50 /* Helpers */, - 95893DC72613C410003698C5 /* Networking */, - ); - path = Home; - sourceTree = ""; - }; - 954D7EAF260BBBD500A13C50 /* Helpers */ = { - isa = PBXGroup; - children = ( - 951566E92613A37C007C0F36 /* TradingDatesItem.swift */, - 951566E62613A2B6007C0F36 /* TradingDatesSheet.swift */, - 9550444226111E7A000E0BCB /* SectorRow.swift */, - 9550444526111EE5000E0BCB /* SectorItem.swift */, - 9550444826111FC9000E0BCB /* StockRow.swift */, - 95123ABF26767370001BFAF3 /* StockItem.swift */, - 95721DA5262761E700EC527B /* CurrencyRow.swift */, - 95D308F72624B3A400A39F77 /* CurrencyItem.swift */, - 95123AB726766497001BFAF3 /* CurrencySheet.swift */, - 95123ABB2676676B001BFAF3 /* CurrencySheetRow.swift */, - 95123AB92676658E001BFAF3 /* StockSheet.swift */, - 95123ABD267669C6001BFAF3 /* StockSheetRow.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 95672B8225DDA54700DCBE4A = { - isa = PBXGroup; - children = ( - 9562404A263C72E800C6C511 /* README.md */, - 950C572D2629F03A00F234FE /* LazyBear.xctestplan */, - 95672B8D25DDA54700DCBE4A /* LazyBear */, - 950C57112629EF9100F234FE /* LazyBearTests */, - 950C57212629EFC200F234FE /* LazyBearUITests */, - 952457D6267E339B00D5BBCB /* LazyBearWatchOS */, - 952457E2267E339C00D5BBCB /* LazyBearWatchOS Extension */, - 952457FB267E339C00D5BBCB /* LazyBearWatchOSTests */, - 95245806267E339D00D5BBCB /* LazyBearWatchOSUITests */, - 95672B8C25DDA54700DCBE4A /* Products */, - 958A735025E0170900FD7ECA /* Frameworks */, - ); - sourceTree = ""; - }; - 95672B8C25DDA54700DCBE4A /* Products */ = { - isa = PBXGroup; - children = ( - 95672B8B25DDA54700DCBE4A /* LazyBear.app */, - 950C57102629EF9100F234FE /* LazyBearTests.xctest */, - 950C57202629EFC200F234FE /* LazyBearUITests.xctest */, - 952457D5267E339B00D5BBCB /* LazyBearWatchOS.app */, - 952457DE267E339C00D5BBCB /* LazyBearWatchOS Extension.appex */, - 952457F8267E339C00D5BBCB /* LazyBearWatchOSTests.xctest */, - 95245803267E339D00D5BBCB /* LazyBearWatchOSUITests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 95672B8D25DDA54700DCBE4A /* LazyBear */ = { - isa = PBXGroup; - children = ( - 958A734E25E016FD00FD7ECA /* LazyBear.entitlements */, - 95672B9C25DDA54800DCBE4A /* Info.plist */, - 95672B9925DDA54800DCBE4A /* LazyBear.xcdatamodeld */, - 95672B9225DDA54700DCBE4A /* Assets.xcassets */, - 95E2DBF72673752F007FCCB4 /* LaunchScreen.storyboard */, - 95672B8E25DDA54700DCBE4A /* LazyBearApp.swift */, - 95AD4A2C26078C1400498079 /* ContentView.swift */, - 95672B9725DDA54700DCBE4A /* Persistence.swift */, - 953C96DD2688925E0096734C /* HapticsManager.swift */, - 95B1874925DDAC4D0068A364 /* Views */, - 957B6726268D055C005DFBF6 /* NEW VIEWS */, - 952045132610C7A200A76362 /* Global functions */, - 954D7E9D260BBA5200A13C50 /* Global Models */, - 9523ED402615BD93006D3D6F /* Resources */, - 95672B9425DDA54700DCBE4A /* Preview Content */, - 950B6F402676452E0029E447 /* Tests */, - ); - path = LazyBear; - sourceTree = ""; - }; - 95672B9425DDA54700DCBE4A /* Preview Content */ = { - isa = PBXGroup; - children = ( - 95672B9525DDA54700DCBE4A /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - 957B6726268D055C005DFBF6 /* NEW VIEWS */ = { + 95F7C17626A2CCA3002F08DB /* lazybearTests */ = { isa = PBXGroup; children = ( - ); - path = "NEW VIEWS"; - sourceTree = ""; - }; - 95893DC72613C410003698C5 /* Networking */ = { - isa = PBXGroup; - children = ( - 955E73382623568F005652FF /* Home.swift */, - 955E733B262356F3005652FF /* HomeResponse.swift */, + 95F7C17726A2CCA3002F08DB /* lazybearTests.swift */, + 95F7C17926A2CCA3002F08DB /* Info.plist */, ); - path = Networking; - sourceTree = ""; - }; - 958A735025E0170900FD7ECA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 95CF46E12689E1790028C5A2 /* CloudKit.framework */, - 950B6F3E267643640029E447 /* StoreKit.framework */, - 958A735125E0170900FD7ECA /* CloudKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9595DC2E2682840C00DC8104 /* Views */ = { - isa = PBXGroup; - children = ( - 9595DC332682849E00DC8104 /* WatchOSProfileView.swift */, - 95CF46A22688BC0B0028C5A2 /* WatchOSCompanyView.swift */, - 9595DC322682848B00DC8104 /* Helpers */, - ); - path = Views; + path = lazybearTests; sourceTree = ""; }; - 9595DC322682848B00DC8104 /* Helpers */ = { - isa = PBXGroup; - children = ( - 9595DC35268284B100DC8104 /* WatchOSCompanyRow.swift */, - 95CF46B62688F89B0028C5A2 /* WatchOSChartHelper.swift */, - 95CF46B82688F8A60028C5A2 /* WatchOSNewsList.swift */, - 95CF46C22689165F0028C5A2 /* WatchOSNewsRow.swift */, - 95CF46C5268919E40028C5A2 /* WatchOSNewsDetail.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 95A7C06126163943003E2EC1 /* Search */ = { - isa = PBXGroup; - children = ( - 95A7C065261639DF003E2EC1 /* SearchView.swift */, - 950D0E182618AA4900D17AD7 /* CompanyList.swift */, - 950D0E272618AEBB00D17AD7 /* Helpers */, - 9529947C2629CA2F005F0AB0 /* Networking */, - ); - path = Search; - sourceTree = ""; - }; - 95B1874925DDAC4D0068A364 /* Views */ = { - isa = PBXGroup; - children = ( - 951490572610BD3000BDEEB5 /* Welcome */, - 954D7EAA260BBB0E00A13C50 /* Home */, - 95A7C06126163943003E2EC1 /* Search */, - 95FBE0DA2619CA6000440386 /* Profile */, - 95E31C0B26472C8500106B98 /* Company */, - ); - path = Views; - sourceTree = ""; - }; - 95BD2F91263418F7008B6752 /* Helpers */ = { + 95F7C18126A2CCA3002F08DB /* lazybearUITests */ = { isa = PBXGroup; children = ( - 9519BE05267E5EC3009C6015 /* ProfileStockRow.swift */, - 95131D4A267A15490055C6DE /* WatchlistSheet.swift */, - 952FC0B7267C97BA001406B1 /* WatchlistSheetRow.swift */, - 9562404B263C766D00C6C511 /* WatchlistCreator.swift */, - 9562404D263C7D8800C6C511 /* WatchlistCreatorClass.swift */, - 95A4B92F263E9F530056F036 /* WatchlistCreatorList.swift */, - 95A4B934263EA31C0056F036 /* WatchlistCreatorSearchBar.swift */, - 95A4B936263EA5C20056F036 /* WatchlistCreatorRow.swift */, - 952FC0B9267C9A24001406B1 /* RenameListSheet.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 95C8C0D9262A31DA0082D1D9 /* Networking */ = { - isa = PBXGroup; - children = ( - 95629D9F2645298E007AF020 /* Profile.swift */, - 95C8C0DF262A369F0082D1D9 /* ProfileResponse.swift */, - ); - path = Networking; - sourceTree = ""; - }; - 95E31C0B26472C8500106B98 /* Company */ = { - isa = PBXGroup; - children = ( - 9502BBF4267F5194003B0A59 /* CompanyView.swift */, - 95E31C0E26472CB600106B98 /* Helpers */, - 95E31C0F26472CC000106B98 /* Networking */, + 95F7C18226A2CCA3002F08DB /* lazybearUITests.swift */, + 95F7C18426A2CCA3002F08DB /* Info.plist */, ); - path = Company; - sourceTree = ""; - }; - 95E31C0E26472CB600106B98 /* Helpers */ = { - isa = PBXGroup; - children = ( - 9502BBFC267F63F3003B0A59 /* CustomRectangleBox.swift */, - 9502BBFA267F5EE8003B0A59 /* ChartHelper.swift */, - 9502BBFE267F6454003B0A59 /* KeyStatsHelper.swift */, - 95BC1C632683326C00F94373 /* KeyStatsRow.swift */, - 9502BC00267F8771003B0A59 /* KeyStatsList.swift */, - 95E4A2D6268091F900A6FEB9 /* NewsHelper.swift */, - 95E4A2D82680931300A6FEB9 /* NewsRow.swift */, - 95E4A2DF2680A70000A6FEB9 /* NewsList.swift */, - 95E4A2E12680AD7C00A6FEB9 /* SFSafariViewWrapper.swift */, - 9576BFEA26810661002BCAC6 /* InsiderRosterHelper.swift */, - 9576BFEE26810719002BCAC6 /* InsiderRosterRow.swift */, - 9576BFEC26810713002BCAC6 /* InsiderRosterList.swift */, - 9547481F26821F7700D6A966 /* InsiderTransactionsHelper.swift */, - 9547482126821F8800D6A966 /* InsiderTransactionsRow.swift */, - 9547482326821F9400D6A966 /* InsiderTransactionsList.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 95E31C0F26472CC000106B98 /* Networking */ = { - isa = PBXGroup; - children = ( - 9502BBF8267F59A0003B0A59 /* Company.swift */, - 9502BBF6267F5974003B0A59 /* CompanyResponse.swift */, - ); - path = Networking; - sourceTree = ""; - }; - 95FBE0DA2619CA6000440386 /* Profile */ = { - isa = PBXGroup; - children = ( - 95FBE0DB2619CA7200440386 /* ProfileView.swift */, - 95BD2F91263418F7008B6752 /* Helpers */, - 95C8C0D9262A31DA0082D1D9 /* Networking */, - ); - path = Profile; + path = lazybearUITests; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 950C570F2629EF9100F234FE /* LazyBearTests */ = { + 95F7C15C26A2CCA2002F08DB /* lazybear */ = { isa = PBXNativeTarget; - buildConfigurationList = 950C57172629EF9100F234FE /* Build configuration list for PBXNativeTarget "LazyBearTests" */; - buildPhases = ( - 950C570C2629EF9100F234FE /* Sources */, - 950C570D2629EF9100F234FE /* Frameworks */, - 950C570E2629EF9100F234FE /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 950C57162629EF9100F234FE /* PBXTargetDependency */, - ); - name = LazyBearTests; - productName = LazyBearTests; - productReference = 950C57102629EF9100F234FE /* LazyBearTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 950C571F2629EFC200F234FE /* LazyBearUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 950C57272629EFC200F234FE /* Build configuration list for PBXNativeTarget "LazyBearUITests" */; + buildConfigurationList = 95F7C18726A2CCA3002F08DB /* Build configuration list for PBXNativeTarget "lazybear" */; buildPhases = ( - 950C571C2629EFC200F234FE /* Sources */, - 950C571D2629EFC200F234FE /* Frameworks */, - 950C571E2629EFC200F234FE /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 950C57262629EFC200F234FE /* PBXTargetDependency */, - ); - name = LazyBearUITests; - productName = LazyBearUITests; - productReference = 950C57202629EFC200F234FE /* LazyBearUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; - 952457D4267E339B00D5BBCB /* LazyBearWatchOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 95245818267E339D00D5BBCB /* Build configuration list for PBXNativeTarget "LazyBearWatchOS" */; - buildPhases = ( - 952457D3267E339B00D5BBCB /* Resources */, - 95245810267E339D00D5BBCB /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - 952457E1267E339C00D5BBCB /* PBXTargetDependency */, - ); - name = LazyBearWatchOS; - productName = LazyBearWatchOS; - productReference = 952457D5267E339B00D5BBCB /* LazyBearWatchOS.app */; - productType = "com.apple.product-type.application.watchapp2"; - }; - 952457DD267E339C00D5BBCB /* LazyBearWatchOS Extension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 95245817267E339D00D5BBCB /* Build configuration list for PBXNativeTarget "LazyBearWatchOS Extension" */; - buildPhases = ( - 952457DA267E339C00D5BBCB /* Sources */, - 952457DB267E339C00D5BBCB /* Frameworks */, - 952457DC267E339C00D5BBCB /* Resources */, + 95F7C15926A2CCA2002F08DB /* Sources */, + 95F7C15A26A2CCA2002F08DB /* Frameworks */, + 95F7C15B26A2CCA2002F08DB /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = "LazyBearWatchOS Extension"; - packageProductDependencies = ( - 95BEA1AB268778E500BF18AB /* Alamofire */, - 95CF46ED2689F1C00028C5A2 /* StockCharts */, - ); - productName = "LazyBearWatchOS Extension"; - productReference = 952457DE267E339C00D5BBCB /* LazyBearWatchOS Extension.appex */; - productType = "com.apple.product-type.watchkit2-extension"; + name = lazybear; + productName = lazybear; + productReference = 95F7C15D26A2CCA2002F08DB /* lazybear.app */; + productType = "com.apple.product-type.application"; }; - 952457F7267E339C00D5BBCB /* LazyBearWatchOSTests */ = { + 95F7C17226A2CCA3002F08DB /* lazybearTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 95245819267E339D00D5BBCB /* Build configuration list for PBXNativeTarget "LazyBearWatchOSTests" */; + buildConfigurationList = 95F7C18A26A2CCA3002F08DB /* Build configuration list for PBXNativeTarget "lazybearTests" */; buildPhases = ( - 952457F4267E339C00D5BBCB /* Sources */, - 952457F5267E339C00D5BBCB /* Frameworks */, - 952457F6267E339C00D5BBCB /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 952457FA267E339C00D5BBCB /* PBXTargetDependency */, - ); - name = LazyBearWatchOSTests; - productName = LazyBearWatchOSTests; - productReference = 952457F8267E339C00D5BBCB /* LazyBearWatchOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 95245802267E339D00D5BBCB /* LazyBearWatchOSUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9524581A267E339D00D5BBCB /* Build configuration list for PBXNativeTarget "LazyBearWatchOSUITests" */; - buildPhases = ( - 952457FF267E339D00D5BBCB /* Sources */, - 95245800267E339D00D5BBCB /* Frameworks */, - 95245801267E339D00D5BBCB /* Resources */, + 95F7C16F26A2CCA3002F08DB /* Sources */, + 95F7C17026A2CCA3002F08DB /* Frameworks */, + 95F7C17126A2CCA3002F08DB /* Resources */, ); buildRules = ( ); dependencies = ( - 95245805267E339D00D5BBCB /* PBXTargetDependency */, + 95F7C17526A2CCA3002F08DB /* PBXTargetDependency */, ); - name = LazyBearWatchOSUITests; - productName = LazyBearWatchOSUITests; - productReference = 95245803267E339D00D5BBCB /* LazyBearWatchOSUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; + name = lazybearTests; + productName = lazybearTests; + productReference = 95F7C17326A2CCA3002F08DB /* lazybearTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; }; - 95672B8A25DDA54700DCBE4A /* LazyBear */ = { + 95F7C17D26A2CCA3002F08DB /* lazybearUITests */ = { isa = PBXNativeTarget; - buildConfigurationList = 95672B9F25DDA54800DCBE4A /* Build configuration list for PBXNativeTarget "LazyBear" */; + buildConfigurationList = 95F7C18D26A2CCA3002F08DB /* Build configuration list for PBXNativeTarget "lazybearUITests" */; buildPhases = ( - 95672B8725DDA54700DCBE4A /* Sources */, - 95672B8825DDA54700DCBE4A /* Frameworks */, - 95672B8925DDA54700DCBE4A /* Resources */, - 9524580D267E339D00D5BBCB /* Embed Watch Content */, + 95F7C17A26A2CCA3002F08DB /* Sources */, + 95F7C17B26A2CCA3002F08DB /* Frameworks */, + 95F7C17C26A2CCA3002F08DB /* Resources */, ); buildRules = ( ); dependencies = ( - 9524580B267E339D00D5BBCB /* PBXTargetDependency */, + 95F7C18026A2CCA3002F08DB /* PBXTargetDependency */, ); - name = LazyBear; - packageProductDependencies = ( - 954D7EC1260BE70C00A13C50 /* SwiftlySearch */, - 95A4B932263E9F810056F036 /* Introspect */, - 950B6F3C267643460029E447 /* Purchases */, - 95BEA1A526876DE100BF18AB /* Alamofire */, - 95CF46EB2689F1B70028C5A2 /* StockCharts */, - ); - productName = LazyBear; - productReference = 95672B8B25DDA54700DCBE4A /* LazyBear.app */; - productType = "com.apple.product-type.application"; + name = lazybearUITests; + productName = lazybearUITests; + productReference = 95F7C17E26A2CCA3002F08DB /* lazybearUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 95672B8325DDA54700DCBE4A /* Project object */ = { + 95F7C15526A2CCA2002F08DB /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1250; - LastUpgradeCheck = 1240; + LastUpgradeCheck = 1250; TargetAttributes = { - 950C570F2629EF9100F234FE = { - CreatedOnToolsVersion = 12.4; - TestTargetID = 95672B8A25DDA54700DCBE4A; - }; - 950C571F2629EFC200F234FE = { - CreatedOnToolsVersion = 12.4; - TestTargetID = 95672B8A25DDA54700DCBE4A; - }; - 952457D4267E339B00D5BBCB = { - CreatedOnToolsVersion = 12.5; + 95F7C15C26A2CCA2002F08DB = { + CreatedOnToolsVersion = 12.5.1; }; - 952457DD267E339C00D5BBCB = { - CreatedOnToolsVersion = 12.5; - }; - 952457F7267E339C00D5BBCB = { - CreatedOnToolsVersion = 12.5; - TestTargetID = 952457DD267E339C00D5BBCB; + 95F7C17226A2CCA3002F08DB = { + CreatedOnToolsVersion = 12.5.1; + TestTargetID = 95F7C15C26A2CCA2002F08DB; }; - 95245802267E339D00D5BBCB = { - CreatedOnToolsVersion = 12.5; - TestTargetID = 952457D4267E339B00D5BBCB; - }; - 95672B8A25DDA54700DCBE4A = { - CreatedOnToolsVersion = 12.4; + 95F7C17D26A2CCA3002F08DB = { + CreatedOnToolsVersion = 12.5.1; + TestTargetID = 95F7C15C26A2CCA2002F08DB; }; }; }; - buildConfigurationList = 95672B8625DDA54700DCBE4A /* Build configuration list for PBXProject "LazyBear" */; + buildConfigurationList = 95F7C15826A2CCA2002F08DB /* Build configuration list for PBXProject "lazybear" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; @@ -966,548 +222,89 @@ en, Base, ); - mainGroup = 95672B8225DDA54700DCBE4A; - packageReferences = ( - 954D7EC0260BE70C00A13C50 /* XCRemoteSwiftPackageReference "SwiftlySearch" */, - 95A4B931263E9F810056F036 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */, - 950B6F3B267643460029E447 /* XCRemoteSwiftPackageReference "purchases-ios" */, - 95BEA1A426876DE100BF18AB /* XCRemoteSwiftPackageReference "Alamofire" */, - 95CF46EA2689F1B70028C5A2 /* XCRemoteSwiftPackageReference "StockCharts" */, - ); - productRefGroup = 95672B8C25DDA54700DCBE4A /* Products */; + mainGroup = 95F7C15426A2CCA2002F08DB; + productRefGroup = 95F7C15E26A2CCA2002F08DB /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 95672B8A25DDA54700DCBE4A /* LazyBear */, - 950C570F2629EF9100F234FE /* LazyBearTests */, - 950C571F2629EFC200F234FE /* LazyBearUITests */, - 952457D4267E339B00D5BBCB /* LazyBearWatchOS */, - 952457DD267E339C00D5BBCB /* LazyBearWatchOS Extension */, - 952457F7267E339C00D5BBCB /* LazyBearWatchOSTests */, - 95245802267E339D00D5BBCB /* LazyBearWatchOSUITests */, + 95F7C15C26A2CCA2002F08DB /* lazybear */, + 95F7C17226A2CCA3002F08DB /* lazybearTests */, + 95F7C17D26A2CCA3002F08DB /* lazybearUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 950C570E2629EF9100F234FE /* Resources */ = { + 95F7C15B26A2CCA2002F08DB /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 95F7C16826A2CCA2002F08DB /* Preview Assets.xcassets in Resources */, + 95F7C16526A2CCA2002F08DB /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 950C571E2629EFC200F234FE /* Resources */ = { + 95F7C17126A2CCA3002F08DB /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 952457D3267E339B00D5BBCB /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 952457D8267E339C00D5BBCB /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 952457DC267E339C00D5BBCB /* Resources */ = { + 95F7C17C26A2CCA3002F08DB /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 952457F1267E339C00D5BBCB /* Preview Assets.xcassets in Resources */, - 95CF46CD26891E180028C5A2 /* DisplayWords.json in Resources */, - 952457EE267E339C00D5BBCB /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 952457F6267E339C00D5BBCB /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 95245801267E339D00D5BBCB /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 95672B8925DDA54700DCBE4A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 95672B9625DDA54700DCBE4A /* Preview Assets.xcassets in Resources */, - 95AF0FF72671320F0049C4AB /* DisplayWords.json in Resources */, - 95E2DBF82673752F007FCCB4 /* LaunchScreen.storyboard in Resources */, - 95672B9325DDA54700DCBE4A /* Assets.xcassets in Resources */, - 953C96E0268898430096734C /* DefaultCompanies.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 950C570C2629EF9100F234FE /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 950C57132629EF9100F234FE /* LazyBearTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 950C571C2629EFC200F234FE /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 950C57232629EFC200F234FE /* LazyBearUITests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 952457DA267E339C00D5BBCB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 95CF46B92688F8A60028C5A2 /* WatchOSNewsList.swift in Sources */, - 95CF46DD2689C7960028C5A2 /* InsiderTransactionModel.swift in Sources */, - 95CF46DB2689C78D0028C5A2 /* KeyStatsModel.swift in Sources */, - 95CF46B72688F89B0028C5A2 /* WatchOSChartHelper.swift in Sources */, - 952457E8267E339C00D5BBCB /* NotificationController.swift in Sources */, - 95BEA1AD2687791000BF18AB /* ProfileResponse.swift in Sources */, - 95BEA1AF2687794A00BF18AB /* RequestType.swift in Sources */, - 95CF46DA2689C77C0028C5A2 /* HistoricalPricesModel.swift in Sources */, - 95CF46AD2688C78C0028C5A2 /* LatestNewsModel.swift in Sources */, - 95BEA1B326877BAC00BF18AB /* Persistence.swift in Sources */, - 954F9C60268C7A000022ED60 /* CurrencyModel.swift in Sources */, - 95BEA1AA268777CC00BF18AB /* Profile.swift in Sources */, - 95CF46C32689165F0028C5A2 /* WatchOSNewsRow.swift in Sources */, - 952457E6267E339C00D5BBCB /* ContentView.swift in Sources */, - 952457EC267E339C00D5BBCB /* ComplicationController.swift in Sources */, - 95CF46DF2689D72E0028C5A2 /* ComplicationViews.swift in Sources */, - 95BEA1AE2687791800BF18AB /* CompanyModel.swift in Sources */, - 95CF46C4268916960028C5A2 /* ConvertEpoch.swift in Sources */, - 95CF46AC2688C7810028C5A2 /* QuoteModel.swift in Sources */, - 9595DC342682849E00DC8104 /* WatchOSProfileView.swift in Sources */, - 95BEA1B426877BBA00BF18AB /* LazyBear.xcdatamodeld in Sources */, - 9595DC382682850000DC8104 /* WatchlistCompany+CoreDataProperties.swift in Sources */, - 952457E4267E339C00D5BBCB /* LazyBearApp.swift in Sources */, - 954F9C61268C7A1C0022ED60 /* SectorPerformanceModel.swift in Sources */, - 95CF46A92688C74C0028C5A2 /* Company.swift in Sources */, - 954F9C5F268C79EA0022ED60 /* HomeResponse.swift in Sources */, - 95CF46C6268919E40028C5A2 /* WatchOSNewsDetail.swift in Sources */, - 9595DC37268284FA00DC8104 /* WatchlistCompany+CoreDataClass.swift in Sources */, - 952457EA267E339C00D5BBCB /* NotificationView.swift in Sources */, - 95CF46A32688BC0B0028C5A2 /* WatchOSCompanyView.swift in Sources */, - 95CF46DC2689C7930028C5A2 /* InsiderRosterModel.swift in Sources */, - 95CF46D92689C7540028C5A2 /* CompanyResponse.swift in Sources */, - 9595DC36268284B100DC8104 /* WatchOSCompanyRow.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 952457F4267E339C00D5BBCB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 952457FD267E339C00D5BBCB /* LazyBearWatchOSTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 952457FF267E339D00D5BBCB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 95245808267E339D00D5BBCB /* LazyBearWatchOSUITests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 95672B8725DDA54700DCBE4A /* Sources */ = { + 95F7C15926A2CCA2002F08DB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 95602704265ABB990046F97E /* InsiderRosterModel.swift in Sources */, - 95E4A2D92680931300A6FEB9 /* NewsRow.swift in Sources */, - 95131D46267A03020055C6DE /* WatchlistCompany+CoreDataProperties.swift in Sources */, - 9576BFEF26810719002BCAC6 /* InsiderRosterRow.swift in Sources */, - 95FBE0DC2619CA7200440386 /* ProfileView.swift in Sources */, - 95131D4B267A15490055C6DE /* WatchlistSheet.swift in Sources */, - 9550444926111FC9000E0BCB /* StockRow.swift in Sources */, - 952FC0B8267C97BA001406B1 /* WatchlistSheetRow.swift in Sources */, - 9550444326111E7A000E0BCB /* SectorRow.swift in Sources */, - 95123ABE267669C6001BFAF3 /* StockSheetRow.swift in Sources */, - 9550443A26111B2B000E0BCB /* HomeView.swift in Sources */, - 95672B9825DDA54700DCBE4A /* Persistence.swift in Sources */, - 95BC1C66268336A200F94373 /* UnwrapAnyOptional.swift in Sources */, - 95123ABC2676676B001BFAF3 /* CurrencySheetRow.swift in Sources */, - 95A7C0742616409D003E2EC1 /* ParseJSON.swift in Sources */, - 95E4A2D7268091F900A6FEB9 /* NewsHelper.swift in Sources */, - 9576BFED26810713002BCAC6 /* InsiderRosterList.swift in Sources */, - 9547482426821F9400D6A966 /* InsiderTransactionsList.swift in Sources */, - 95E8BAA32656D86E0016AE72 /* RequestType.swift in Sources */, - 95CCFB56266E7A0F00C384A1 /* InsiderTransactionModel.swift in Sources */, - 951566E72613A2B6007C0F36 /* TradingDatesSheet.swift in Sources */, - 9502BBF5267F5194003B0A59 /* CompanyView.swift in Sources */, - 955E73392623568F005652FF /* Home.swift in Sources */, - 95721DA6262761E700EC527B /* CurrencyRow.swift in Sources */, - 9562404C263C766D00C6C511 /* WatchlistCreator.swift in Sources */, - 95BB05B22670B8C3005A2029 /* KeyStatsModel.swift in Sources */, - 950B6F422676454A0029E447 /* RevenueCatTest.swift in Sources */, - 95672B8F25DDA54700DCBE4A /* LazyBearApp.swift in Sources */, - 95B85AB6267FAE7A0080CF39 /* ConditionalModifier.swift in Sources */, - 95A7C066261639E0003E2EC1 /* SearchView.swift in Sources */, - 9502BBFD267F63F3003B0A59 /* CustomRectangleBox.swift in Sources */, - 95A4B937263EA5C20056F036 /* WatchlistCreatorRow.swift in Sources */, - 950D0E192618AA4900D17AD7 /* CompanyList.swift in Sources */, - 9502BBFB267F5EE8003B0A59 /* ChartHelper.swift in Sources */, - 95BC1C642683326C00F94373 /* KeyStatsRow.swift in Sources */, - 952994822629CA46005F0AB0 /* SearchResponse.swift in Sources */, - 95A07F6C26305AC6009865AA /* QuoteModel.swift in Sources */, - 95A07F6226305A9B009865AA /* CurrencyModel.swift in Sources */, - 9529947E2629CA3E005F0AB0 /* Search.swift in Sources */, - 95613ADF264FC6FD00D4CE8F /* LatestNewsModel.swift in Sources */, - 950D0E292618AEC800D17AD7 /* SearchedCompanyItem.swift in Sources */, - 955E733C262356F3005652FF /* HomeResponse.swift in Sources */, - 951566EA2613A37C007C0F36 /* TradingDatesItem.swift in Sources */, - 9547482026821F7700D6A966 /* InsiderTransactionsHelper.swift in Sources */, - 951490552610BD2B00BDEEB5 /* WelcomeView.swift in Sources */, - 95D308F82624B3A400A39F77 /* CurrencyItem.swift in Sources */, - 953C96E2268898DC0096734C /* DefaultCompanyModel.swift in Sources */, - 95131D47267A03020055C6DE /* WatchlistCompany+CoreDataClass.swift in Sources */, - 9502BBF7267F5974003B0A59 /* CompanyResponse.swift in Sources */, - 95A07F7126305AD5009865AA /* SectorPerformanceModel.swift in Sources */, - 9594F0402651355B00CFA8D4 /* HistoricalPricesModel.swift in Sources */, - 95123AC026767370001BFAF3 /* StockItem.swift in Sources */, - 9576BFEB26810661002BCAC6 /* InsiderRosterHelper.swift in Sources */, - 9502BBFF267F6454003B0A59 /* KeyStatsHelper.swift in Sources */, - 9519BE06267E5EC3009C6015 /* ProfileStockRow.swift in Sources */, - 9550444626111EE5000E0BCB /* SectorItem.swift in Sources */, - 95672B9B25DDA54800DCBE4A /* LazyBear.xcdatamodeld in Sources */, - 95C8C0E0262A369F0082D1D9 /* ProfileResponse.swift in Sources */, - 95A4B935263EA31C0056F036 /* WatchlistCreatorSearchBar.swift in Sources */, - 9502BC01267F8771003B0A59 /* KeyStatsList.swift in Sources */, - 95123AB826766497001BFAF3 /* CurrencySheet.swift in Sources */, - 95AF0FF92671342E0049C4AB /* DisplayWordsModel.swift in Sources */, - 95E4A2E22680AD7C00A6FEB9 /* SFSafariViewWrapper.swift in Sources */, - 95AD4A2D26078C1400498079 /* ContentView.swift in Sources */, - 95629DA02645298E007AF020 /* Profile.swift in Sources */, - 95CCFB5E266E855800C384A1 /* GetDateComponents.swift in Sources */, - 95C22F3F26776F010014C98A /* CompanyModel.swift in Sources */, - 95A4B930263E9F530056F036 /* WatchlistCreatorList.swift in Sources */, - 95123ABA2676658E001BFAF3 /* StockSheet.swift in Sources */, - 9562404E263C7D8800C6C511 /* WatchlistCreatorClass.swift in Sources */, - 9547482226821F8800D6A966 /* InsiderTransactionsRow.swift in Sources */, - 952045152610C7C600A76362 /* ConvertEpoch.swift in Sources */, - 952FC0BA267C9A24001406B1 /* RenameListSheet.swift in Sources */, - 95E4A2E02680A70000A6FEB9 /* NewsList.swift in Sources */, - 95CCFB60266E864C00C384A1 /* ConvertStringToDate.swift in Sources */, - 953C96DE2688925E0096734C /* HapticsManager.swift in Sources */, - 9502BBF9267F59A0003B0A59 /* Company.swift in Sources */, + 95F7C16A26A2CCA2002F08DB /* Persistence.swift in Sources */, + 95F7C16326A2CCA2002F08DB /* ContentView.swift in Sources */, + 95F7C16126A2CCA2002F08DB /* lazybearApp.swift in Sources */, + 95F7C16D26A2CCA2002F08DB /* lazybear.xcdatamodeld in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 95F7C16F26A2CCA3002F08DB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 95F7C17826A2CCA3002F08DB /* lazybearTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 95F7C17A26A2CCA3002F08DB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 95F7C18326A2CCA3002F08DB /* lazybearUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 950C57162629EF9100F234FE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 95672B8A25DDA54700DCBE4A /* LazyBear */; - targetProxy = 950C57152629EF9100F234FE /* PBXContainerItemProxy */; - }; - 950C57262629EFC200F234FE /* PBXTargetDependency */ = { + 95F7C17526A2CCA3002F08DB /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 95672B8A25DDA54700DCBE4A /* LazyBear */; - targetProxy = 950C57252629EFC200F234FE /* PBXContainerItemProxy */; - }; - 952457E1267E339C00D5BBCB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 952457DD267E339C00D5BBCB /* LazyBearWatchOS Extension */; - targetProxy = 952457E0267E339C00D5BBCB /* PBXContainerItemProxy */; + target = 95F7C15C26A2CCA2002F08DB /* lazybear */; + targetProxy = 95F7C17426A2CCA3002F08DB /* PBXContainerItemProxy */; }; - 952457FA267E339C00D5BBCB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 952457DD267E339C00D5BBCB /* LazyBearWatchOS Extension */; - targetProxy = 952457F9267E339C00D5BBCB /* PBXContainerItemProxy */; - }; - 95245805267E339D00D5BBCB /* PBXTargetDependency */ = { + 95F7C18026A2CCA3002F08DB /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 952457D4267E339B00D5BBCB /* LazyBearWatchOS */; - targetProxy = 95245804267E339D00D5BBCB /* PBXContainerItemProxy */; - }; - 9524580B267E339D00D5BBCB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 952457D4267E339B00D5BBCB /* LazyBearWatchOS */; - targetProxy = 9524580A267E339D00D5BBCB /* PBXContainerItemProxy */; + target = 95F7C15C26A2CCA2002F08DB /* lazybear */; + targetProxy = 95F7C17F26A2CCA3002F08DB /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 950C57182629EF9100F234FE /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = MTX83R5H8X; - INFOPLIST_FILE = LazyBearTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.LazyBearTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LazyBear.app/LazyBear"; - }; - name = Debug; - }; - 950C57192629EF9100F234FE /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = MTX83R5H8X; - INFOPLIST_FILE = LazyBearTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.LazyBearTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LazyBear.app/LazyBear"; - }; - name = Release; - }; - 950C57282629EFC200F234FE /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = MTX83R5H8X; - INFOPLIST_FILE = LazyBearUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.LazyBearUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = LazyBear; - }; - name = Debug; - }; - 950C57292629EFC200F234FE /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = MTX83R5H8X; - INFOPLIST_FILE = LazyBearUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.LazyBearUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = LazyBear; - }; - name = Release; - }; - 9524580E267E339D00D5BBCB /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 7; - DEVELOPMENT_TEAM = MTX83R5H8X; - IBSC_MODULE = LazyBearWatchOS_Extension; - INFOPLIST_FILE = LazyBearWatchOS/Info.plist; - MARKETING_VERSION = 4.0; - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear.watchkitapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 7.2; - }; - name = Debug; - }; - 9524580F267E339D00D5BBCB /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 7; - DEVELOPMENT_TEAM = MTX83R5H8X; - IBSC_MODULE = LazyBearWatchOS_Extension; - INFOPLIST_FILE = LazyBearWatchOS/Info.plist; - MARKETING_VERSION = 4.0; - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear.watchkitapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 7.2; - }; - name = Release; - }; - 95245811267E339D00D5BBCB /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - CODE_SIGN_ENTITLEMENTS = "LazyBearWatchOS Extension/LazyBearWatchOS Extension.entitlements"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 7; - DEVELOPMENT_ASSET_PATHS = "\"LazyBearWatchOS Extension/Preview Content\""; - DEVELOPMENT_TEAM = MTX83R5H8X; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = "LazyBearWatchOS Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 4.0; - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear.watchkitapp.watchkitextension; - PRODUCT_NAME = "${TARGET_NAME}"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 7.2; - }; - name = Debug; - }; - 95245812267E339D00D5BBCB /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - CODE_SIGN_ENTITLEMENTS = "LazyBearWatchOS Extension/LazyBearWatchOS Extension.entitlements"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 7; - DEVELOPMENT_ASSET_PATHS = "\"LazyBearWatchOS Extension/Preview Content\""; - DEVELOPMENT_TEAM = MTX83R5H8X; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = "LazyBearWatchOS Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 4.0; - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear.watchkitapp.watchkitextension; - PRODUCT_NAME = "${TARGET_NAME}"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 7.2; - }; - name = Release; - }; - 95245813267E339D00D5BBCB /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = MTX83R5H8X; - INFOPLIST_FILE = LazyBearWatchOSTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear.LazyBearWatchOSTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = watchos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LazyBearWatchOS Extension.appex/LazyBearWatchOS Extension"; - WATCHOS_DEPLOYMENT_TARGET = 7.4; - }; - name = Debug; - }; - 95245814267E339D00D5BBCB /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = MTX83R5H8X; - INFOPLIST_FILE = LazyBearWatchOSTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear.LazyBearWatchOSTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = watchos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LazyBearWatchOS Extension.appex/LazyBearWatchOS Extension"; - WATCHOS_DEPLOYMENT_TARGET = 7.4; - }; - name = Release; - }; - 95245815267E339D00D5BBCB /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = MTX83R5H8X; - INFOPLIST_FILE = LazyBearWatchOSUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear.LazyBearWatchOSUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = watchos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - TEST_TARGET_NAME = LazyBearWatchOS; - WATCHOS_DEPLOYMENT_TARGET = 7.4; - }; - name = Debug; - }; - 95245816267E339D00D5BBCB /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = MTX83R5H8X; - INFOPLIST_FILE = LazyBearWatchOSUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear.LazyBearWatchOSUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = watchos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - TEST_TARGET_NAME = LazyBearWatchOS; - WATCHOS_DEPLOYMENT_TARGET = 7.4; - }; - name = Release; - }; - 95672B9D25DDA54800DCBE4A /* Debug */ = { + 95F7C18526A2CCA3002F08DB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1558,18 +355,17 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.4; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; }; name = Debug; }; - 95672B9E25DDA54800DCBE4A /* Release */ = { + 95F7C18626A2CCA3002F08DB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1614,237 +410,197 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.4; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; VALIDATE_PRODUCT = YES; }; name = Release; }; - 95672BA025DDA54800DCBE4A /* Debug */ = { + 95F7C18826A2CCA3002F08DB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = LazyBear/LazyBear.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 7; - DEVELOPMENT_ASSET_PATHS = "\"LazyBear/Preview Content\""; + DEVELOPMENT_ASSET_PATHS = "\"lazybear/Preview Content\""; DEVELOPMENT_TEAM = MTX83R5H8X; ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = LazyBear/Info.plist; + INFOPLIST_FILE = lazybear/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 4.0; - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear; + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.lazybear; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 95672BA125DDA54800DCBE4A /* Release */ = { + 95F7C18926A2CCA3002F08DB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = LazyBear/LazyBear.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 7; - DEVELOPMENT_ASSET_PATHS = "\"LazyBear/Preview Content\""; + DEVELOPMENT_ASSET_PATHS = "\"lazybear/Preview Content\""; DEVELOPMENT_TEAM = MTX83R5H8X; ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = LazyBear/Info.plist; + INFOPLIST_FILE = lazybear/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 4.0; - PRODUCT_BUNDLE_IDENTIFIER = dennis.LazyBear; + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.lazybear; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 95F7C18B26A2CCA3002F08DB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MTX83R5H8X; + INFOPLIST_FILE = lazybearTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.lazybearTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/lazybear.app/lazybear"; + }; + name = Debug; + }; + 95F7C18C26A2CCA3002F08DB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MTX83R5H8X; + INFOPLIST_FILE = lazybearTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.lazybearTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/lazybear.app/lazybear"; + }; + name = Release; + }; + 95F7C18E26A2CCA3002F08DB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MTX83R5H8X; + INFOPLIST_FILE = lazybearUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.lazybearUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = lazybear; + }; + name = Debug; + }; + 95F7C18F26A2CCA3002F08DB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MTX83R5H8X; + INFOPLIST_FILE = lazybearUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.lazybearUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = lazybear; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 950C57172629EF9100F234FE /* Build configuration list for PBXNativeTarget "LazyBearTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 950C57182629EF9100F234FE /* Debug */, - 950C57192629EF9100F234FE /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 950C57272629EFC200F234FE /* Build configuration list for PBXNativeTarget "LazyBearUITests" */ = { + 95F7C15826A2CCA2002F08DB /* Build configuration list for PBXProject "lazybear" */ = { isa = XCConfigurationList; buildConfigurations = ( - 950C57282629EFC200F234FE /* Debug */, - 950C57292629EFC200F234FE /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 95245817267E339D00D5BBCB /* Build configuration list for PBXNativeTarget "LazyBearWatchOS Extension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 95245811267E339D00D5BBCB /* Debug */, - 95245812267E339D00D5BBCB /* Release */, + 95F7C18526A2CCA3002F08DB /* Debug */, + 95F7C18626A2CCA3002F08DB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 95245818267E339D00D5BBCB /* Build configuration list for PBXNativeTarget "LazyBearWatchOS" */ = { + 95F7C18726A2CCA3002F08DB /* Build configuration list for PBXNativeTarget "lazybear" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9524580E267E339D00D5BBCB /* Debug */, - 9524580F267E339D00D5BBCB /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 95245819267E339D00D5BBCB /* Build configuration list for PBXNativeTarget "LazyBearWatchOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 95245813267E339D00D5BBCB /* Debug */, - 95245814267E339D00D5BBCB /* Release */, + 95F7C18826A2CCA3002F08DB /* Debug */, + 95F7C18926A2CCA3002F08DB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9524581A267E339D00D5BBCB /* Build configuration list for PBXNativeTarget "LazyBearWatchOSUITests" */ = { + 95F7C18A26A2CCA3002F08DB /* Build configuration list for PBXNativeTarget "lazybearTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 95245815267E339D00D5BBCB /* Debug */, - 95245816267E339D00D5BBCB /* Release */, + 95F7C18B26A2CCA3002F08DB /* Debug */, + 95F7C18C26A2CCA3002F08DB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 95672B8625DDA54700DCBE4A /* Build configuration list for PBXProject "LazyBear" */ = { + 95F7C18D26A2CCA3002F08DB /* Build configuration list for PBXNativeTarget "lazybearUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 95672B9D25DDA54800DCBE4A /* Debug */, - 95672B9E25DDA54800DCBE4A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 95672B9F25DDA54800DCBE4A /* Build configuration list for PBXNativeTarget "LazyBear" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 95672BA025DDA54800DCBE4A /* Debug */, - 95672BA125DDA54800DCBE4A /* Release */, + 95F7C18E26A2CCA3002F08DB /* Debug */, + 95F7C18F26A2CCA3002F08DB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ -/* Begin XCRemoteSwiftPackageReference section */ - 950B6F3B267643460029E447 /* XCRemoteSwiftPackageReference "purchases-ios" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/RevenueCat/purchases-ios.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 3.11.1; - }; - }; - 954D7EC0260BE70C00A13C50 /* XCRemoteSwiftPackageReference "SwiftlySearch" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/thislooksfun/SwiftlySearch.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.2.4; - }; - }; - 95A4B931263E9F810056F036 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/siteline/SwiftUI-Introspect.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.1.3; - }; - }; - 95BEA1A426876DE100BF18AB /* XCRemoteSwiftPackageReference "Alamofire" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/Alamofire/Alamofire.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 5.4.3; - }; - }; - 95CF46EA2689F1B70028C5A2 /* XCRemoteSwiftPackageReference "StockCharts" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/denniscm190/StockCharts.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.2.7; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 950B6F3C267643460029E447 /* Purchases */ = { - isa = XCSwiftPackageProductDependency; - package = 950B6F3B267643460029E447 /* XCRemoteSwiftPackageReference "purchases-ios" */; - productName = Purchases; - }; - 954D7EC1260BE70C00A13C50 /* SwiftlySearch */ = { - isa = XCSwiftPackageProductDependency; - package = 954D7EC0260BE70C00A13C50 /* XCRemoteSwiftPackageReference "SwiftlySearch" */; - productName = SwiftlySearch; - }; - 95A4B932263E9F810056F036 /* Introspect */ = { - isa = XCSwiftPackageProductDependency; - package = 95A4B931263E9F810056F036 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */; - productName = Introspect; - }; - 95BEA1A526876DE100BF18AB /* Alamofire */ = { - isa = XCSwiftPackageProductDependency; - package = 95BEA1A426876DE100BF18AB /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; - }; - 95BEA1AB268778E500BF18AB /* Alamofire */ = { - isa = XCSwiftPackageProductDependency; - package = 95BEA1A426876DE100BF18AB /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; - }; - 95CF46EB2689F1B70028C5A2 /* StockCharts */ = { - isa = XCSwiftPackageProductDependency; - package = 95CF46EA2689F1B70028C5A2 /* XCRemoteSwiftPackageReference "StockCharts" */; - productName = StockCharts; - }; - 95CF46ED2689F1C00028C5A2 /* StockCharts */ = { - isa = XCSwiftPackageProductDependency; - package = 95CF46EA2689F1B70028C5A2 /* XCRemoteSwiftPackageReference "StockCharts" */; - productName = StockCharts; - }; -/* End XCSwiftPackageProductDependency section */ - /* Begin XCVersionGroup section */ - 95672B9925DDA54800DCBE4A /* LazyBear.xcdatamodeld */ = { + 95F7C16B26A2CCA2002F08DB /* lazybear.xcdatamodeld */ = { isa = XCVersionGroup; children = ( - 95672B9A25DDA54800DCBE4A /* LazyBear.xcdatamodel */, + 95F7C16C26A2CCA2002F08DB /* lazybear.xcdatamodel */, ); - currentVersion = 95672B9A25DDA54800DCBE4A /* LazyBear.xcdatamodel */; - path = LazyBear.xcdatamodeld; + currentVersion = 95F7C16C26A2CCA2002F08DB /* lazybear.xcdatamodel */; + path = lazybear.xcdatamodeld; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; }; /* End XCVersionGroup section */ }; - rootObject = 95672B8325DDA54700DCBE4A /* Project object */; + rootObject = 95F7C15526A2CCA2002F08DB /* Project object */; } diff -r daeac7c7c586 -r 783b567800d9 LazyBear.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved --- a/LazyBear.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -{ - "object": { - "pins": [ - { - "package": "Alamofire", - "repositoryURL": "https://github.com/Alamofire/Alamofire.git", - "state": { - "branch": null, - "revision": "f96b619bcb2383b43d898402283924b80e2c4bae", - "version": "5.4.3" - } - }, - { - "package": "Purchases", - "repositoryURL": "https://github.com/RevenueCat/purchases-ios.git", - "state": { - "branch": null, - "revision": "2811b25d8f275429e5d001e3990426ebba5147f4", - "version": "3.11.1" - } - }, - { - "package": "StockCharts", - "repositoryURL": "https://github.com/denniscm190/StockCharts.git", - "state": { - "branch": null, - "revision": "12caeb879e4a02b458d63e0740b42999b5230b91", - "version": "1.2.7" - } - }, - { - "package": "SwiftlySearch", - "repositoryURL": "https://github.com/thislooksfun/SwiftlySearch.git", - "state": { - "branch": null, - "revision": "a7184413250a91f012d5d26eed874b5b2fdaeaac", - "version": "1.2.5" - } - }, - { - "package": "Introspect", - "repositoryURL": "https://github.com/siteline/SwiftUI-Introspect.git", - "state": { - "branch": null, - "revision": "2e09be8af614401bc9f87d40093ec19ce56ccaf2", - "version": "0.1.3" - } - } - ] - }, - "version": 1 -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate Binary file LazyBear.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear.xcodeproj/xcshareddata/xcschemes/LazyBear.xcscheme --- a/LazyBear.xcodeproj/xcshareddata/xcschemes/LazyBear.xcscheme Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r daeac7c7c586 -r 783b567800d9 LazyBear.xcodeproj/xcuserdata/dennis.xcuserdatad/xcschemes/xcschememanagement.plist --- a/LazyBear.xcodeproj/xcuserdata/dennis.xcuserdatad/xcschemes/xcschememanagement.plist Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBear.xcodeproj/xcuserdata/dennis.xcuserdatad/xcschemes/xcschememanagement.plist Sat Jul 17 09:33:26 2021 +0100 @@ -4,76 +4,11 @@ SchemeUserState - LazyBear.xcscheme_^#shared#^_ + lazybear.xcscheme_^#shared#^_ orderHint 0 - LazyBearWatchOS (Complication).xcscheme_^#shared#^_ - - orderHint - 3 - - LazyBearWatchOS (Notification).xcscheme_^#shared#^_ - - orderHint - 2 - - LazyBearWatchOS.xcscheme_^#shared#^_ - - orderHint - 1 - - PlaygroundChart (Playground) 1.xcscheme - - isShown - - orderHint - 3 - - PlaygroundChart (Playground) 2.xcscheme - - isShown - - orderHint - 4 - - PlaygroundChart (Playground) 3.xcscheme - - isShown - - orderHint - 1 - - PlaygroundChart (Playground) 4.xcscheme - - isShown - - orderHint - 5 - - PlaygroundChart (Playground) 5.xcscheme - - isShown - - orderHint - 6 - - PlaygroundChart (Playground).xcscheme - - isShown - - orderHint - 2 - - - SuppressBuildableAutocreation - - 95672B8A25DDA54700DCBE4A - - primary - - diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/Contents.json --- a/LazyBear/Assets.xcassets/AppIcon.appiconset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBear/Assets.xcassets/AppIcon.appiconset/Contents.json Sat Jul 17 09:33:26 2021 +0100 @@ -1,109 +1,91 @@ { "images" : [ { - "filename" : "icon_20pt@2x-1.png", "idiom" : "iphone", "scale" : "2x", "size" : "20x20" }, { - "filename" : "icon_20pt@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "20x20" }, { - "filename" : "icon_29pt@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "29x29" }, { - "filename" : "icon_29pt@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "29x29" }, { - "filename" : "icon_40pt@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "40x40" }, { - "filename" : "icon_40pt@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "40x40" }, { - "filename" : "icon_60pt@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "60x60" }, { - "filename" : "icon_60pt@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "60x60" }, { - "filename" : "icon_20pt.png", "idiom" : "ipad", "scale" : "1x", "size" : "20x20" }, { - "filename" : "icon_20pt@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "20x20" }, { - "filename" : "icon_29pt.png", "idiom" : "ipad", "scale" : "1x", "size" : "29x29" }, { - "filename" : "icon_29pt@2x-1.png", "idiom" : "ipad", "scale" : "2x", "size" : "29x29" }, { - "filename" : "icon_40pt.png", "idiom" : "ipad", "scale" : "1x", "size" : "40x40" }, { - "filename" : "icon_40pt@2x-1.png", "idiom" : "ipad", "scale" : "2x", "size" : "40x40" }, { - "filename" : "icon_76pt.png", "idiom" : "ipad", "scale" : "1x", "size" : "76x76" }, { - "filename" : "icon_76pt@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "76x76" }, { - "filename" : "icon_83.5@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "83.5x83.5" }, { - "filename" : "Icon.png", "idiom" : "ios-marketing", "scale" : "1x", "size" : "1024x1024" diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/Icon.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/Icon.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_20pt.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_20pt.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_20pt@2x-1.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_20pt@2x-1.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_20pt@2x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_20pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_20pt@3x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_20pt@3x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_29pt.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_29pt.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_29pt@2x-1.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_29pt@2x-1.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_29pt@2x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_29pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_29pt@3x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_29pt@3x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_40pt.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_40pt.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_40pt@2x-1.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_40pt@2x-1.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_40pt@2x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_40pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_40pt@3x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_40pt@3x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_60pt@2x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_60pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_60pt@3x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_60pt@3x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_76pt.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_76pt.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_76pt@2x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_76pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/AppIcon.appiconset/icon_83.5@2x.png Binary file LazyBear/Assets.xcassets/AppIcon.appiconset/icon_83.5@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/CustomBackground.colorset/Contents.json --- a/LazyBear/Assets.xcassets/CustomBackground.colorset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "platform" : "ios", - "reference" : "systemGray6Color" - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.000", - "green" : "0.000", - "red" : "0.000" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/CustomSecondaryBackground.colorset/Contents.json --- a/LazyBear/Assets.xcassets/CustomSecondaryBackground.colorset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "1.000", - "green" : "1.000", - "red" : "1.000" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "platform" : "ios", - "reference" : "secondarySystemBackgroundColor" - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/LaunchBackground.colorset/Contents.json --- a/LazyBear/Assets.xcassets/LaunchBackground.colorset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "1.000", - "green" : "1.000", - "red" : "1.000" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.000", - "green" : "0.000", - "red" : "0.000" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Logos/Contents.json --- a/LazyBear/Assets.xcassets/Logos/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Logos/default.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Logos/default.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "logo@1x.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "logo@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "logo@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Logos/default.imageset/logo@1x.png Binary file LazyBear/Assets.xcassets/Logos/default.imageset/logo@1x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Logos/default.imageset/logo@2x.png Binary file LazyBear/Assets.xcassets/Logos/default.imageset/logo@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Logos/default.imageset/logo@3x.png Binary file LazyBear/Assets.xcassets/Logos/default.imageset/logo@3x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Logos/launchLogo.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Logos/launchLogo.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "launchLogo@1x.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "launchLogo@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "launchLogo@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Logos/launchLogo.imageset/launchLogo@1x.png Binary file LazyBear/Assets.xcassets/Logos/launchLogo.imageset/launchLogo@1x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Logos/launchLogo.imageset/launchLogo@2x.png Binary file LazyBear/Assets.xcassets/Logos/launchLogo.imageset/launchLogo@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Logos/launchLogo.imageset/launchLogo@3x.png Binary file LazyBear/Assets.xcassets/Logos/launchLogo.imageset/launchLogo@3x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Communication Services.imageset/Communication Services.jpg Binary file LazyBear/Assets.xcassets/Sectors/Communication Services.imageset/Communication Services.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Communication Services.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Communication Services.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Communication Services.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Consumer Discretionary.imageset/Consumer Discretionary.jpg Binary file LazyBear/Assets.xcassets/Sectors/Consumer Discretionary.imageset/Consumer Discretionary.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Consumer Discretionary.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Consumer Discretionary.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Consumer Discretionary.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Consumer Staples.imageset/Consumer Staples.jpg Binary file LazyBear/Assets.xcassets/Sectors/Consumer Staples.imageset/Consumer Staples.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Consumer Staples.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Consumer Staples.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Consumer Staples.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Energy.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Energy.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Energy.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Energy.imageset/Energy.jpg Binary file LazyBear/Assets.xcassets/Sectors/Energy.imageset/Energy.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Financials.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Financials.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Financials.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Financials.imageset/Financials.jpg Binary file LazyBear/Assets.xcassets/Sectors/Financials.imageset/Financials.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Health Care.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Health Care.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Health Care.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Health Care.imageset/Health Care.jpg Binary file LazyBear/Assets.xcassets/Sectors/Health Care.imageset/Health Care.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Industrials.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Industrials.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Industrials.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Industrials.imageset/Industrials.jpg Binary file LazyBear/Assets.xcassets/Sectors/Industrials.imageset/Industrials.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Materials.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Materials.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Materials.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Materials.imageset/Materials.jpg Binary file LazyBear/Assets.xcassets/Sectors/Materials.imageset/Materials.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Real Estate.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Real Estate.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Real Estate.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Real Estate.imageset/Real Estate.jpg Binary file LazyBear/Assets.xcassets/Sectors/Real Estate.imageset/Real Estate.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Technology.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Technology.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Technology.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Technology.imageset/Technology.jpg Binary file LazyBear/Assets.xcassets/Sectors/Technology.imageset/Technology.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Utilities.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Sectors/Utilities.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Utilities.jpg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Sectors/Utilities.imageset/Utilities.jpg Binary file LazyBear/Assets.xcassets/Sectors/Utilities.imageset/Utilities.jpg has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Vectors/Contents.json --- a/LazyBear/Assets.xcassets/Vectors/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Vectors/suitBear.imageset/Contents.json --- a/LazyBear/Assets.xcassets/Vectors/suitBear.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -{ - "images" : [ - { - "filename" : "lightSuitBear@1x.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "darkSuitBear@1x.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "lightSuitBear@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "darkSuitBear@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "lightSuitBear@3x.png", - "idiom" : "universal", - "scale" : "3x" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "darkSuitBear@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Vectors/suitBear.imageset/darkSuitBear@1x.png Binary file LazyBear/Assets.xcassets/Vectors/suitBear.imageset/darkSuitBear@1x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Vectors/suitBear.imageset/darkSuitBear@2x.png Binary file LazyBear/Assets.xcassets/Vectors/suitBear.imageset/darkSuitBear@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Vectors/suitBear.imageset/darkSuitBear@3x.png Binary file LazyBear/Assets.xcassets/Vectors/suitBear.imageset/darkSuitBear@3x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Vectors/suitBear.imageset/lightSuitBear@1x.png Binary file LazyBear/Assets.xcassets/Vectors/suitBear.imageset/lightSuitBear@1x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Vectors/suitBear.imageset/lightSuitBear@2x.png Binary file LazyBear/Assets.xcassets/Vectors/suitBear.imageset/lightSuitBear@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Assets.xcassets/Vectors/suitBear.imageset/lightSuitBear@3x.png Binary file LazyBear/Assets.xcassets/Vectors/suitBear.imageset/lightSuitBear@3x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBear/ContentView.swift --- a/LazyBear/ContentView.swift Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBear/ContentView.swift Sat Jul 17 09:33:26 2021 +0100 @@ -1,93 +1,80 @@ // // ContentView.swift -// LazyBear +// lazybear // -// Created by Dennis Concepción Martín on 21/3/21. +// Created by Dennis Concepción Martín on 17/07/2021. // import SwiftUI -import CoreHaptics +import CoreData struct ContentView: View { - @State private var showWelcome = false - @State var selectedTab: Tab = .home - - @Environment(\.managedObjectContext) private var moc - @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) var watchlistCompanies: FetchedResults - + @Environment(\.managedObjectContext) private var viewContext + + @FetchRequest( + sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)], + animation: .default) + private var items: FetchedResults + var body: some View { - TabView(selection: $selectedTab) { - HomeView() - .tabItem { - Image(systemName: "house") - Text("Home") - } - .tag(Tab.home) /// Do not remove tags. It causes an odd behaviour when showView is activated - SearchView() - .tabItem { - Image(systemName: "magnifyingglass") - Text("Search") - } - .tag(Tab.search) - ProfileView() - .tabItem { - Image(systemName: "person") - Text("Profile") - } - .tag(Tab.profile) + List { + ForEach(items) { item in + Text("Item at \(item.timestamp!, formatter: itemFormatter)") + } + .onDelete(perform: deleteItems) } - .onAppear(perform: onAppear) - .sheet(isPresented: $showWelcome) { - + .toolbar { + #if os(iOS) + EditButton() + #endif + + Button(action: addItem) { + Label("Add Item", systemImage: "plus") + } } } - - /* - 1) Create default watchlist if it doesn't exits - 2) Show WelcomeView if is the first time that the app is opened - 3) Prepare haptics - */ - private func onAppear() { - // MARK: - Create Watchlist -// if watchlistCompanies.isEmpty { -// let defaultCompanies: [DefaultCompanyModel] = parseJSON("DefaultCompanies.json") -// for defaultCompany in defaultCompanies { -// let watchlistCompany = WatchlistCompany(context: moc) -// watchlistCompany.name = defaultCompany.name -// watchlistCompany.symbol = defaultCompany.symbol -// watchlistCompany.watchlistName = "Default watchlist" -// } -// -// do { -// try moc.save() -// print("Default watchlist created") -// } catch { -// print(error.localizedDescription) -// } -// } - - // MARK: - Show WelcomeView if is the first time that the app is opened -// let defaults = UserDefaults.standard -// -// if let isAppAlreadyLaunchedOnce = defaults.string(forKey: "IsAppAlreadyLaunchedOnce") { -// print("App already launched : \(isAppAlreadyLaunchedOnce)") -// self.showWelcome = true -// } - - // MARK: - Prepare Haptics -// hapticsManager.prepareHaptics() + + private func addItem() { + withAnimation { + let newItem = Item(context: viewContext) + newItem.timestamp = Date() + + do { + try viewContext.save() + } catch { + // Replace this implementation with code to handle the error appropriately. + // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + let nsError = error as NSError + fatalError("Unresolved error \(nsError), \(nsError.userInfo)") + } + } } -} -extension ContentView { - enum Tab: Hashable { - case home - case search - case profile + + private func deleteItems(offsets: IndexSet) { + withAnimation { + offsets.map { items[$0] }.forEach(viewContext.delete) + + do { + try viewContext.save() + } catch { + // Replace this implementation with code to handle the error appropriately. + // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + let nsError = error as NSError + fatalError("Unresolved error \(nsError), \(nsError.userInfo)") + } + } } } +private let itemFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateStyle = .short + formatter.timeStyle = .medium + return formatter +}() + struct ContentView_Previews: PreviewProvider { static var previews: some View { - ContentView() + ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) } } diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/CompanyModel.swift --- a/LazyBear/Global Models/CompanyModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -// -// CompanyModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 14/6/21. -// - -import SwiftUI - -struct CompanyModel: Codable, Hashable { - var symbol: String - var companyName: String - var latestPrice: Double? - var changePercent: Double? - var intradayPrices: [Double] -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/CurrencyModel.swift --- a/LazyBear/Global Models/CurrencyModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -// -// CurrencyModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/4/21. -// - -import SwiftUI - - -struct CurrencyModel: Codable, Hashable { - var symbol: String - var name: String - var flag: String - var rate: Double -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/DefaultCompanyModel.swift --- a/LazyBear/Global Models/DefaultCompanyModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -// -// DefaultCompanyModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 27/06/2021. -// - -import SwiftUI - -struct DefaultCompanyModel: Codable { - var symbol: String - var name: String -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/DisplayWordsModel.swift --- a/LazyBear/Global Models/DisplayWordsModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -// -// DisplayWordsModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 9/6/21. -// - -import SwiftUI - -struct DisplayWordsModel: Codable { - var keyStats: [String: String] -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/HistoricalPricesModel.swift --- a/LazyBear/Global Models/HistoricalPricesModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -// -// HistoricalPricesModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 16/5/21. -// - -import SwiftUI - -struct HistoricalPricesModel: Codable { - var close: Double - var date: String - var minute: String? -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/InsiderRosterModel.swift --- a/LazyBear/Global Models/InsiderRosterModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -// -// InsiderRosterModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 23/5/21. -// - -import SwiftUI - -struct InsiderRosterModel: Codable, Hashable { - var entityName: String - var position: Float? - var reportDate: Int64 -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/InsiderTransactionModel.swift --- a/LazyBear/Global Models/InsiderTransactionModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -// -// InsiderTransactionModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 7/6/21. -// - -import SwiftUI - -struct InsiderTransactionModel: Codable, Hashable { - var filingDate: String - var fullName: String - var postShares: Float? - var reportedTitle: String? - var transactionCode: String - var transactionPrice: Float? - var transactionShares: Float? - var transactionValue: Float? -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/KeyStatsModel.swift --- a/LazyBear/Global Models/KeyStatsModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -// -// KeyStatsModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 9/6/21. -// - -import SwiftUI - -struct KeyStatsModel: Codable { - var companyName: String? - var employees: Float? - var marketcap: Float? - var float: Float? - var sharesOutstanding: Float? - - var beta: Float? - var peRatio: Float? - var dividendYield: Float? - var ttmDividendRate: Float? - var ttmEPS: Float? - - var avg10Volume: Float? - var avg30Volume: Float? - - var day50MovingAvg: Float? - var day200MovingAvg: Float? - - var week52Change: Float? - var week52High: Float? - var week52Low: Float? - var week52HighSplitAdjustOnly: Float? - var week52LowSplitAdjustOnly: Float? - - var maxChangePercent: Float? - var ytdChangePercent: Float? - var day5ChangePercent: Float? - var day30ChangePercent: Float? - var month1ChangePercent: Float? - var month3ChangePercent: Float? - var month6ChangePercent: Float? - var year1ChangePercent: Float? - var year2ChangePercent: Float? - var year5ChangePercent: Float? - - var exDividendDate: String? - var nextDividendDate: String? - var nextEarningsDate: String? -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/LatestNewsModel.swift --- a/LazyBear/Global Models/LatestNewsModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -// -// LatestNewsModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 15/5/21. -// - -import SwiftUI - -struct LatestNewsModel: Codable, Hashable { - var datetime: Int64 - var headline: String - var image: String - var source: String - var summary: String - var url: String -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/QuoteModel.swift --- a/LazyBear/Global Models/QuoteModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -// -// QuoteModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/4/21. -// - -import SwiftUI - -struct QuoteModel: Codable { - var companyName: String - var latestPrice: Double? - var changePercent: Double? - var intradayPrices: [Double]? -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/RequestType.swift --- a/LazyBear/Global Models/RequestType.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -// -// RequestType.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 20/5/21. -// - -import SwiftUI - -enum RequestType { - case initial - case streaming - case refresh -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/SectorPerformanceModel.swift --- a/LazyBear/Global Models/SectorPerformanceModel.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -// -// SectorPerformanceModel.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/4/21. -// - -import SwiftUI - -struct SectorPerformanceModel: Codable, Hashable { - var name: String - var performance: Double -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/WatchlistCompany+CoreDataClass.swift --- a/LazyBear/Global Models/WatchlistCompany+CoreDataClass.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -// -// WatchlistCompany+CoreDataClass.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 16/6/21. -// -// - -import Foundation -import CoreData - -@objc(WatchlistCompany) -public class WatchlistCompany: NSManagedObject { - -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global Models/WatchlistCompany+CoreDataProperties.swift --- a/LazyBear/Global Models/WatchlistCompany+CoreDataProperties.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -// -// WatchlistCompany+CoreDataProperties.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 16/6/21. -// -// - -import Foundation -import CoreData - - -extension WatchlistCompany { - - @nonobjc public class func fetchRequest() -> NSFetchRequest { - return NSFetchRequest(entityName: "WatchlistCompany") - } - - @NSManaged public var name: String - @NSManaged public var symbol: String - @NSManaged public var watchlistName: String - -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global functions/ConditionalModifier.swift --- a/LazyBear/Global functions/ConditionalModifier.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -// -// ConditionalModifier.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 20/6/21. -// - -import SwiftUI - -extension View { - @ViewBuilder - func `if`(_ conditional: Bool, content: (Self) -> Content) -> some View { - if conditional { - content(self) - } else { - self - } - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global functions/ConvertEpoch.swift --- a/LazyBear/Global functions/ConvertEpoch.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -// -// ConvertEpoch.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 28/3/21. -// - -import SwiftUI - -/* - Convert Epoch time (in miliseconds) to human readable date - */ -func convertEpoch(_ miliseconds: Int64, _ interval: Bool) -> String { - let now = Date() // Current date - - // TimeInterval() function must be in seconds, not in miliseconds - let convertedDate = Date(timeIntervalSince1970: TimeInterval(miliseconds/1000)) - - let formatter = DateComponentsFormatter() - formatter.unitsStyle = .abbreviated - - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .medium - - var humanDate = String() - if interval { - humanDate = formatter.string(from: convertedDate, to: now)! - } else { - humanDate = dateFormatter.string(from: convertedDate) - } - - return humanDate -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global functions/ConvertStringToDate.swift --- a/LazyBear/Global functions/ConvertStringToDate.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -// -// ConvertStringToDate.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 7/6/21. -// - -import SwiftUI - -/* - Convert String to date with the format specified - */ -func convertStringToDate(_ stringDate: String) -> Date { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd" - - let date = dateFormatter.date(from: stringDate)! - - return date -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global functions/GetDateComponents.swift --- a/LazyBear/Global functions/GetDateComponents.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -// -// GetDateComponents.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 7/6/21. -// - -import SwiftUI - -enum Components { - case day, month, year -} - -/* - Get components from a date - */ -func getDateComponents(_ components: Components, _ date: Date) -> String { - let dateComponents = Calendar.current.dateComponents([.year, .month, .day], from: date) - - switch components { - case .year: - return "\(dateComponents.year ?? 2020)" - case .day: - return "\(dateComponents.day ?? 1)" - case .month: - let dateFormatter = DateFormatter() - let monthNumber = dateComponents.month ?? 1 - let monthLetters = dateFormatter.shortMonthSymbols[monthNumber-1] - - return "\(monthLetters)" - } - -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global functions/ParseJSON.swift --- a/LazyBear/Global functions/ParseJSON.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -// -// ParseJSON.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 1/4/21. -// - -import Foundation - - -/* - Read JSON File - */ -func parseJSON(_ 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)") - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Global functions/UnwrapAnyOptional.swift --- a/LazyBear/Global functions/UnwrapAnyOptional.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -// -// UnwrapAnyOptional.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 23/6/21. -// - -import SwiftUI - -/* - Unwrap optional Int, Double, String into String - */ -func unwrapAnyOptional(value: Any) -> String? { - if let value = value as? Int { - return "\(value)" - } else if let value = value as? Double { - return String(format: "%.3f", value) - } else { - return value as? String - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/HapticsManager.swift --- a/LazyBear/HapticsManager.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -// -// HapticsManager.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 27/06/2021. -// - -import SwiftUI -import CoreHaptics - -class HapticsManager: ObservableObject { - @Published var engine: CHHapticEngine? - - func prepareHaptics() { - guard CHHapticEngine.capabilitiesForHardware().supportsHaptics else { return } - - do { - self.engine = try CHHapticEngine() - try engine?.start() - } catch { - print("There was an error creating the engine: \(error.localizedDescription)") - } - } - - func simpleSuccess() { - let generator = UINotificationFeedbackGenerator() - generator.notificationOccurred(.success) - } - - func complexSuccess() { - // make sure that the device supports haptics - guard CHHapticEngine.capabilitiesForHardware().supportsHaptics else { return } - var events = [CHHapticEvent]() - - // create one intense, sharp tap - let intensity = CHHapticEventParameter(parameterID: .hapticIntensity, value: 2) - let sharpness = CHHapticEventParameter(parameterID: .hapticSharpness, value: 1) - let event = CHHapticEvent(eventType: .hapticTransient, parameters: [intensity, sharpness], relativeTime: 0) - events.append(event) - - // convert those events into a pattern and play it immediately - do { - let pattern = try CHHapticPattern(events: events, parameters: []) - let player = try engine?.makePlayer(with: pattern) - try player?.start(atTime: 0) - } catch { - print("Failed to play pattern: \(error.localizedDescription).") - } - } - - func simpleError() { - let generator = UINotificationFeedbackGenerator() - generator.notificationOccurred(.error) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Info.plist --- a/LazyBear/Info.plist Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBear/Info.plist Sat Jul 17 09:33:26 2021 +0100 @@ -17,9 +17,9 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - $(MARKETING_VERSION) + 1.0 CFBundleVersion - $(CURRENT_PROJECT_VERSION) + 1 LSRequiresIPhoneOS UIApplicationSceneManifest @@ -29,14 +29,8 @@ UIApplicationSupportsIndirectInputEvents - UIBackgroundModes - - remote-notification - UILaunchScreen - UILaunchStoryboardName - LaunchScreen UIRequiredDeviceCapabilities armv7 @@ -44,6 +38,8 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad diff -r daeac7c7c586 -r 783b567800d9 LazyBear/LaunchScreen.storyboard --- a/LazyBear/LaunchScreen.storyboard Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r daeac7c7c586 -r 783b567800d9 LazyBear/LazyBear.entitlements --- a/LazyBear/LazyBear.entitlements Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ - - - - - aps-environment - development - com.apple.developer.icloud-container-identifiers - - iCloud.app.lazybear - - com.apple.developer.icloud-services - - CloudKit - - - diff -r daeac7c7c586 -r 783b567800d9 LazyBear/LazyBear.xcdatamodeld/.xccurrentversion --- a/LazyBear/LazyBear.xcdatamodeld/.xccurrentversion Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBear/LazyBear.xcdatamodeld/.xccurrentversion Sat Jul 17 09:33:26 2021 +0100 @@ -3,6 +3,6 @@ _XCCurrentVersionName - LazyBear.xcdatamodel + lazybear.xcdatamodel diff -r daeac7c7c586 -r 783b567800d9 LazyBear/LazyBear.xcdatamodeld/LazyBear.xcdatamodel/contents --- a/LazyBear/LazyBear.xcdatamodeld/LazyBear.xcdatamodel/contents Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBear/LazyBear.xcdatamodeld/LazyBear.xcdatamodel/contents Sat Jul 17 09:33:26 2021 +0100 @@ -1,15 +1,9 @@ - - - - - - - - + + + - - + \ No newline at end of file diff -r daeac7c7c586 -r 783b567800d9 LazyBear/LazyBearApp.swift --- a/LazyBear/LazyBearApp.swift Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBear/LazyBearApp.swift Sat Jul 17 09:33:26 2021 +0100 @@ -1,19 +1,15 @@ // -// LazyBearApp.swift -// LazyBear +// lazybearApp.swift +// lazybear // -// Created by Dennis Concepción Martín on 17/2/21. +// Created by Dennis Concepción Martín on 17/07/2021. // import SwiftUI -import Purchases @main -struct LazyBearApp: App { - let persistenceController = PersistenceController.shared // Core Data init -// init() { /// Revenue Cat configuration -// Purchases.configure(withAPIKey: "ZnlVFgEqTmhLagtzgFawvlhAROXQjyFi") -// } +struct lazybearApp: App { + let persistenceController = PersistenceController.shared var body: some Scene { WindowGroup { diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Persistence.swift --- a/LazyBear/Persistence.swift Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBear/Persistence.swift Sat Jul 17 09:33:26 2021 +0100 @@ -1,8 +1,8 @@ // // Persistence.swift -// LazyBear +// lazybear // -// Created by Dennis Concepción Martín on 17/2/21. +// Created by Dennis Concepción Martín on 17/07/2021. // import CoreData @@ -14,15 +14,8 @@ let result = PersistenceController(inMemory: true) let viewContext = result.container.viewContext for _ in 0..<10 { - let entity = Entity(context: viewContext) - entity.attribute = 1 - } - - for _ in 0..<10 { - let watchlistCompany = WatchlistCompany(context: viewContext) - watchlistCompany.name = "Apple Inc" - watchlistCompany.symbol = "AAPL" - watchlistCompany.watchlistName = "Technologies" + let newItem = Item(context: viewContext) + newItem.timestamp = Date() } do { try viewContext.save() @@ -38,8 +31,7 @@ let container: NSPersistentCloudKitContainer init(inMemory: Bool = false) { - container = NSPersistentCloudKitContainer(name: "LazyBear") - container.viewContext.automaticallyMergesChangesFromParent = true // Not sure about this + container = NSPersistentCloudKitContainer(name: "lazybear") if inMemory { container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null") } diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Resources/DefaultCompanies.json --- a/LazyBear/Resources/DefaultCompanies.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -[ - { - "symbol": "AAPL", - "name": "Apple Inc" - }, - { - "symbol": "AMZN", - "name": "Amazon.com Inc." - }, - { - "symbol": "WMT", - "name": "Walmart Inc" - }, - { - "symbol": "CVS", - "name": "CVS Health Corp" - }, - { - "symbol": "UNH", - "name": "Unitedhealth Group Inc" - }, - { - "symbol": "BRK.B", - "name": "Berkshire Hathaway Inc." - }, - { - "symbol": "MCK", - "name": "Mckesson Corporation" - }, - { - "symbol": "ABC", - "name": "Amerisource Bergen Corp." - }, - { - "symbol": "GOOG", - "name": "Alphabet Inc" - }, - { - "symbol": "XOM", - "name": "Exxon Mobil Corp." - }, - { - "symbol": "COST", - "name": "Costco Wholesale Corp" - } -] - diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Resources/DisplayWords.json --- a/LazyBear/Resources/DisplayWords.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -{ - "keyStats": - { - "avg10Volume": "10 days average volume", - "avg30Volume": "30 days average volume", - "beta": "Beta", - "companyName": "Company Name", - "day200MovingAvg": "200 days moving average", - "day30ChangePercent": "30 days change percent", - "day50MovingAvg": "50 days moving average", - "day5ChangePercent": "Percent change in 5 days", - "dividendYield": "Dividend yield", - "employees": "Employees", - "exDividendDate": "Ex dividend date", - "float": "Float", - "marketcap": "Market cap", - "maxChangePercent": "Max change percent", - "month1ChangePercent": "Percent change in 1 month", - "month3ChangePercent": "Percent change in 3 months", - "month6ChangePercent": "Percent change in 6 months", - "nextDividendDate": "Next dividend date", - "nextEarningsDate": "Next earnings date", - "peRatio": "PE ratio", - "sharesOutstanding": "Shares outstanding", - "ttmDividendRate": "TTM dividend rate", - "ttmEPS": "TTM EPS", - "week52Change": "Change in 52 weeks", - "week52High": "52 weeks high", - "week52HighSplitAdjustOnly": " 52 weeks high (Split adjust only)", - "week52Low": "52 weeks low", - "week52LowSplitAdjustOnly": " 52 weeks low (Split adjust only)", - "year1ChangePercent": "Percent change in 1 year", - "year2ChangePercent": "Percent change in 2 year", - "year5ChangePercent": "Percent change in 5 year", - "ytdChangePercent": "YTD percent change" - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Tests/RevenueCatTest.swift --- a/LazyBear/Tests/RevenueCatTest.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -// -// RevenueCatTest.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 13/6/21. -// - -import SwiftUI -import Purchases - -struct RevenueCatTest: View { - var body: some View { - Text("Hello world") - .onAppear { showOfferings() } - } - - private func showOfferings() { - Purchases.shared.offerings { (offerings, error) in - if let offerings = offerings { - // Display current offering with offerings.current - print(offerings.current as Any) - print("dennis") - } - } - } -} - -struct RevenueCatTest_Previews: PreviewProvider { - static var previews: some View { - RevenueCatTest() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/CompanyView.swift --- a/LazyBear/Views/Company/CompanyView.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -// -// CompanyView.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 20/6/21. -// - -import SwiftUI - -struct CompanyView: View { - var symbol: String - var name: String - - @ObservedObject var company = Company() - - var ranges = ["1D", "5D", "1M", "3M", "6M", "1Y", "5Y"] /// DatePicker ranges - @State private var selectedRange = "3M" /// Selected DatePicker range - - var body: some View { - if company.showView { - ScrollView(showsIndicators: false) { - VStack { - HStack { - Text(name.capitalized) - .font(.title) - .fontWeight(.semibold) - .lineLimit(1) - - Spacer() - } - .padding(.horizontal) - - Picker("Select a range", selection: $selectedRange) { - ForEach(ranges, id: \.self) { - Text($0) - } - } - .pickerStyle(SegmentedPickerStyle()) - .padding(.horizontal) - .onChange(of: selectedRange, perform: { range in - let url = "https://api.lazybear.app/company/symbol=\(symbol)/type=refresh/range=\(range.lowercased())" - company.request(url, .refresh) - }) - - ChartHelper(company: company) - if let keyStats = company.data.keyStats { - KeyStatsHelper(keyStats: keyStats) - - } - - if let latestNews = company.data.latestNews { - if !latestNews.isEmpty { - NewsHelper(latestNews: latestNews) - .padding([.horizontal, .bottom]) - } - } - - if let insiderRoster = company.data.insiderRoster { - if !insiderRoster.isEmpty { - InsiderRosterHelper(insiderRoster: insiderRoster) - .padding([.horizontal, .bottom]) - } - } - - if let insiderTransactions = company.data.insiderTransactions { - if !insiderTransactions.isEmpty { - InsiderTransactionsHelper(insiderTransactions: insiderTransactions) - .padding([.horizontal, .bottom]) - } - } - } - } - .background(Color("customBackground").edgesIgnoringSafeArea(.all)) - } else { - ProgressView() - .onAppear { - company.request("https://api.lazybear.app/company/symbol=\(symbol)", .initial) - } - } - } -} - -struct CompanyView_Previews: PreviewProvider { - static var previews: some View { - CompanyView(symbol: "aapl", name: "apple inc") - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/ChartHelper.swift --- a/LazyBear/Views/Company/Helpers/ChartHelper.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -// -// ChartHelper.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 20/6/21. -// - -import SwiftUI -import StockCharts - -struct ChartHelper: View { - @ObservedObject var company: Company - - var body: some View { - CustomRectangleBox() - .frame(height: 270) - .overlay( - VStack { - if let quote = company.data.quote?.first { - Text("\(quote.latestPrice ?? 0, specifier: "%.2f")") - .font(.title2) - .fontWeight(.semibold) - .foregroundColor(quote.changePercent ?? 0 < 0 ? .red: .green) - .padding(.top) - - HStack { - Text("\(quote.changePercent ?? 0 * 100, specifier: "%.2f")%") - .foregroundColor(quote.changePercent ?? 0 < 0 ? .red: .green) - .font(.caption) - .fontWeight(.semibold) - - Text("1 day") - .font(.caption) - .opacity(0.5) - } - .padding(.horizontal) - - Spacer() - - - if let historicalPrices = company.data.historicalPrices { - let prices = historicalPrices.compactMap { $0.close } - let dates = historicalPrices.compactMap { $0.date } - if company.showChart { - LineChartView(data: prices, dates: dates, hours: nil, dragGesture: true) - .padding(.bottom) - } else { - Spacer() - ProgressView() - Spacer() - } - } - } - - Spacer() - } - ) - .padding(.horizontal) - } -} - -struct ChartHelper_Previews: PreviewProvider { - static var previews: some View { - ChartHelper(company: Company()) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/CustomRectangleBox.swift --- a/LazyBear/Views/Company/Helpers/CustomRectangleBox.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -// -// CustomRectangleBox.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 20/6/21. -// - -import SwiftUI - -struct CustomRectangleBox: View { - @Environment(\.colorScheme) private var colorScheme - - var body: some View { - RoundedRectangle(cornerRadius: 15) - .foregroundColor(Color("customSecondaryBackground")) - .if(colorScheme == .light) { content in - content.shadow(color: Color(.systemGray).opacity(0.25), radius: 10, x: 0.0, y: 0.0) - } - - } -} - -struct CustomRectangleBox_Previews: PreviewProvider { - static var previews: some View { - CustomRectangleBox() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/InsiderRosterHelper.swift --- a/LazyBear/Views/Company/Helpers/InsiderRosterHelper.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -// -// InsiderRosterHelper.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/6/21. -// - -import SwiftUI - -struct InsiderRosterHelper: View { - var insiderRoster: [InsiderRosterModel] - - var body: some View { - VStack(alignment: .leading) { - HStack { - Text("Top Insiders") - .font(.title) - .fontWeight(.semibold) - - Spacer() - NavigationLink(destination: InsiderRosterList(insiderRoster: insiderRoster) - .navigationTitle("Top Insiders") - ) { - Text("See all") - .accentColor(Color.blue) - } - } - .padding(.bottom) - - let totalPositions = insiderRoster.map { $0.position ?? 0 }.reduce(0, +) /// Get total shares owned by top 10 insiders - ForEach(insiderRoster.prefix(4), id: \.self) { insider in - let percentageOfWidth = Double(insider.position ?? 0) / Double(totalPositions) /// Compute percentage of ownership for each insider - InsiderRosterRow(insider: insider, percentageOfWidth: CGFloat(percentageOfWidth)) - Divider() - } - } - .padding() - .background( - CustomRectangleBox() - ) - } -} - -struct InsiderRosterHelper_Previews: PreviewProvider { - static var previews: some View { - InsiderRosterHelper( - insiderRoster: - [ - InsiderRosterModel( - entityName: "Tim Cook", - position: 12345, - reportDate: 12345 - ) - ] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/InsiderRosterList.swift --- a/LazyBear/Views/Company/Helpers/InsiderRosterList.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -// -// InsiderRosterList.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/6/21. -// - -import SwiftUI - -struct InsiderRosterList: View { - var insiderRoster: [InsiderRosterModel] - - var body: some View { - ScrollView(showsIndicators: false) { - VStack { - let totalPositions = insiderRoster.map { $0.position ?? 0 }.reduce(0, +) /// Get total shares owned by top 10 insiders - ForEach(insiderRoster, id: \.self) { insider in - let percentageOfWidth = Double(insider.position ?? 0) / Double(totalPositions) /// Compute percentage of ownership for each insider - InsiderRosterRow(insider: insider, percentageOfWidth: CGFloat(percentageOfWidth)) - Divider() - } - } - .padding() - } - } -} - -struct InsiderRosterList_Previews: PreviewProvider { - static var previews: some View { - InsiderRosterList( - insiderRoster: - [ - InsiderRosterModel( - entityName: "Tim Cook", - position: 12345, - reportDate: 12345 - ) - ] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/InsiderRosterRow.swift --- a/LazyBear/Views/Company/Helpers/InsiderRosterRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -// -// InsiderRosterRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/6/21. -// - -import SwiftUI -import StockCharts - -struct InsiderRosterRow: View { - var insider: InsiderRosterModel - var percentageOfWidth: CGFloat - - var body: some View { - VStack(alignment: .leading) { - Text(insider.entityName.capitalized) - .lineLimit(1) - .font(.headline) - - Text("Last updated: \(convertEpoch(insider.reportDate, false))") - .opacity(0.5) - .font(.subheadline) - - HStack { - Spacer() - Text("\(insider.position ?? 0) shares owned") - .font(.caption) - .opacity(0.5) - } - - CapsuleChartView(percentageOfWidth: percentageOfWidth) - } - } -} - -struct InsiderRosterRow_Previews: PreviewProvider { - static var previews: some View { - InsiderRosterRow( - insider: - InsiderRosterModel( - entityName: "Tim Cook", - position: 12345, - reportDate: 12345 - ), - percentageOfWidth: 0.6 - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/InsiderTransactionsHelper.swift --- a/LazyBear/Views/Company/Helpers/InsiderTransactionsHelper.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -// -// InsiderTransactionsHelper.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 22/6/21. -// - -import SwiftUI - -struct InsiderTransactionsHelper: View { - var insiderTransactions: [InsiderTransactionModel] - @State private var showList = false - - var body: some View { - VStack(alignment: .leading) { - HStack { - Text("Insider Transactions") - .font(.title) - .fontWeight(.semibold) - - Spacer() - NavigationLink(destination: InsiderTransactionsList(insiderTransactions: insiderTransactions) - .navigationTitle("Insider Transactions") - .navigationBarTitleDisplayMode(.large) - ) { - Text("See all") - .accentColor(Color.blue) - } - } - .padding(.bottom) - - ForEach(insiderTransactions.prefix(4), id: \.self) { insiderTransaction in - InsiderTransactionsRow(insiderTransaction: insiderTransaction) - Divider() - } - } - .padding() - .background( - CustomRectangleBox() - ) - } -} - -struct InsiderTransactionsHelper_Previews: PreviewProvider { - static var previews: some View { - InsiderTransactionsHelper( - insiderTransactions: - [ - InsiderTransactionModel( - filingDate: "2020-01-01", - fullName: "Dennis Concepcion", - postShares: 1234, - reportedTitle: "Director", - transactionCode: "S", - transactionPrice: 20.08, - transactionShares: 12345, - transactionValue: 1234567.0 - ) - ] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/InsiderTransactionsList.swift --- a/LazyBear/Views/Company/Helpers/InsiderTransactionsList.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -// -// InsiderTransactionsList.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 22/6/21. -// - -import SwiftUI - -struct InsiderTransactionsList: View { - var insiderTransactions: [InsiderTransactionModel] - - var body: some View { - ScrollView(showsIndicators: false) { - VStack { - ForEach(insiderTransactions, id: \.self) { insiderTransaction in - InsiderTransactionsRow(insiderTransaction: insiderTransaction) - Divider() - } - } - .padding() - } - } -} - -struct InsiderTransactionsList_Previews: PreviewProvider { - static var previews: some View { - InsiderTransactionsList( - insiderTransactions: - [ - InsiderTransactionModel( - filingDate: "2020-01-01", - fullName: "Dennis Concepcion", - postShares: 1234, - reportedTitle: "Director", - transactionCode: "S", - transactionPrice: 20.08, - transactionShares: 12345, - transactionValue: 1234567.0 - ) - ] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/InsiderTransactionsRow.swift --- a/LazyBear/Views/Company/Helpers/InsiderTransactionsRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -// -// InsiderTransactionsRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 22/6/21. -// - -import SwiftUI - -struct InsiderTransactionsRow: View { - var insiderTransaction: InsiderTransactionModel - - var body: some View { - HStack { - VStack { - let date = convertStringToDate(insiderTransaction.filingDate) - Text(getDateComponents(.month, date)) - .fontWeight(.semibold) - - Text(getDateComponents(.day, date)) - .font(.title) - .fontWeight(.semibold) - .foregroundColor(Color.blue) - - Text(getDateComponents(.year, date)) - .font(.caption) - .fontWeight(.semibold) - } - .padding(.trailing) - - VStack(alignment: .leading) { - Text(insiderTransaction.fullName.capitalized) - .lineLimit(1) - .font(.headline) - - if let reportedTitle = insiderTransaction.reportedTitle { - Text(reportedTitle.capitalized) - } - } - - Spacer() - if let transactionShares = insiderTransaction.transactionShares { - VStack(alignment: .trailing) { - Text("\(transactionShares)") - .foregroundColor(transactionShares < 0 ? Color.red: Color.green) - } - .padding(.leading) - } - } - } -} - -struct InsiderTransactionsRow_Previews: PreviewProvider { - static var previews: some View { - InsiderTransactionsRow( - insiderTransaction: - InsiderTransactionModel( - filingDate: "2020-01-01", - fullName: "Dennis Concepcion", - postShares: 1234, - reportedTitle: "Director", - transactionCode: "S", - transactionPrice: 20.08, - transactionShares: 12345, - transactionValue: 1234567.0 - ) - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/KeyStatsHelper.swift --- a/LazyBear/Views/Company/Helpers/KeyStatsHelper.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -// -// KeyStatsHelper.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 20/6/21. -// - -import SwiftUI - -struct KeyStatsHelper: View { - var keyStats: KeyStatsModel - let displayWords: DisplayWordsModel = parseJSON("DisplayWords.json") - - var body: some View { - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 20) { - - let mirror = Mirror(reflecting: keyStats) - ForEach(Array(mirror.children), id: \.label) { child in /// Iterate over each variable within the class - if let unwrappedValue = unwrapAnyOptional(value: child.value) { - if unwrappedValue != "0.000" && unwrappedValue != "0" && !unwrappedValue.isEmpty { - let label = String(child.label!) - - NavigationLink(destination: KeyStatsList(keyStats: keyStats) - .navigationTitle("Key Stats") - ) { - KeyStatsRow(label: displayWords.keyStats[label]!) - } - .buttonStyle(PlainButtonStyle()) - } - } - } - } - .frame(height: 70) - .padding(.horizontal) - } - } -} - -struct KeyStatsHelper_Previews: PreviewProvider { - static var previews: some View { - KeyStatsHelper(keyStats: - KeyStatsModel( - companyName: "Apple inc", - employees: 123, - marketcap: 123, - float: 123, - sharesOutstanding: 123, - beta: 123.12, - peRatio: 123.4, - dividendYield: 123.4, - ttmDividendRate: 123.4, - ttmEPS: 123.4, - avg10Volume: 123, - avg30Volume: 123, - day50MovingAvg: 123.4, - day200MovingAvg: 123.4, - week52Change: 123.4, - week52High: 123.4, - week52Low: 123.4, - week52HighSplitAdjustOnly: 123.4, - week52LowSplitAdjustOnly: 123.4, - maxChangePercent: 123.4, - ytdChangePercent: 123.4, - day5ChangePercent: 123.4, - day30ChangePercent: 123.4, - month1ChangePercent: 123.4, - month3ChangePercent: 123.4, - month6ChangePercent: 123.4, - year1ChangePercent: 123.4, - year2ChangePercent: 123.4, - year5ChangePercent: 123.4, - exDividendDate: "2020-01-01", - nextDividendDate: "2020-01-01", - nextEarningsDate: "2020-01-01" - ) - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/KeyStatsList.swift --- a/LazyBear/Views/Company/Helpers/KeyStatsList.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -// -// KeyStatsList.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 20/6/21. -// - -import SwiftUI - -struct KeyStatsList: View { - var keyStats: KeyStatsModel - let displayWords: DisplayWordsModel = parseJSON("DisplayWords.json") - - var body: some View { - Form { - let mirror = Mirror(reflecting: keyStats) - ForEach(Array(mirror.children), id: \.label) { child in /// Iterate over each variable within the class - if let unwrappedValue = unwrapAnyOptional(value: child.value) { - if unwrappedValue != "0.000" && unwrappedValue != "0" && !unwrappedValue.isEmpty { - let label = String(child.label!) - HStack { - Text("\(displayWords.keyStats[label]!):") - .font(.callout) - .fontWeight(.semibold) - .lineLimit(1) - - Spacer() - Text(unwrappedValue) - .font(.callout) - .lineLimit(1) - } - } - } - } - } - } -} - -struct KeyStatsList_Previews: PreviewProvider { - static var previews: some View { - KeyStatsList(keyStats: - KeyStatsModel( - companyName: "Apple inc", - employees: 123, - marketcap: 123, - float: 123, - sharesOutstanding: 123, - beta: 123.12, - peRatio: 123.4, - dividendYield: 123.4, - ttmDividendRate: 123.4, - ttmEPS: 123.4, - avg10Volume: 123, - avg30Volume: 123, - day50MovingAvg: 123.4, - day200MovingAvg: 123.4, - week52Change: 123.4, - week52High: 123.4, - week52Low: 123.4, - week52HighSplitAdjustOnly: 123.4, - week52LowSplitAdjustOnly: 123.4, - maxChangePercent: 123.4, - ytdChangePercent: 123.4, - day5ChangePercent: 123.4, - day30ChangePercent: 123.4, - month1ChangePercent: 123.4, - month3ChangePercent: 123.4, - month6ChangePercent: 123.4, - year1ChangePercent: 123.4, - year2ChangePercent: 123.4, - year5ChangePercent: 123.4, - exDividendDate: "2020-01-01", - nextDividendDate: "2020-01-01", - nextEarningsDate: "2020-01-01" - ) - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/KeyStatsRow.swift --- a/LazyBear/Views/Company/Helpers/KeyStatsRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -// -// KeyStatsRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 23/6/21. -// - -import SwiftUI - -struct KeyStatsRow: View { - var label: String - @Environment(\.colorScheme) private var colorScheme - - var body: some View { - HStack { - Text("\(label)") - .font(.callout) - .fontWeight(.semibold) - .lineLimit(1) - - } - .padding() - .background( - Capsule() - .frame(height: 40) - .foregroundColor(Color("customSecondaryBackground")) - .if(colorScheme == .light) { content in - content.shadow(color: Color(.systemGray).opacity(0.25), radius: 10, x: 0.0, y: 0.0) - } - ) - } -} - -struct KeyStatsRow_Previews: PreviewProvider { - static var previews: some View { - KeyStatsRow(label: "Company Name") - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/NewsHelper.swift --- a/LazyBear/Views/Company/Helpers/NewsHelper.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -// -// NewsHelper.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/6/21. -// - -import SwiftUI - -struct NewsHelper: View { - var latestNews: [LatestNewsModel] - - var body: some View { - VStack(alignment: .leading) { - HStack { - Text("Latest news") - .font(.title) - .fontWeight(.semibold) - - Spacer() - - NavigationLink(destination: NewsList(latestNews: latestNews) - .navigationTitle("Latest news") - ) { - Text("See all") - .accentColor(Color.blue) - } - } - .padding(.bottom) - - let latestNewsPrefixed = latestNews.prefix(4) - ForEach(latestNewsPrefixed, id: \.self) { new in - if !new.headline.isEmpty { - NewsRow(new: new) - Divider() - } - } - } - .padding() - .background( - CustomRectangleBox() - ) - } -} - -struct NewsHelper_Previews: PreviewProvider { - static var previews: some View { - NewsHelper( - latestNews: [ - LatestNewsModel( - datetime: 1621037430000, - headline: "Chaos Monkeys' author calls Apple's statement on his departure defamatory", - image: "https://cloud.iexapis.com/v1/news/image/99abeb99-6d9e-47c8-ae7b-53404eacccec", - source: "Investing.com", - summary: "https://www.investing.com/news/stock-market-news", - url: "https://cloud.iexapis.com/v1/news/article/99abeb99-6d9e-47c8-ae7b-53404eacccec") - ] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/NewsList.swift --- a/LazyBear/Views/Company/Helpers/NewsList.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -// -// NewsList.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/6/21. -// - -import SwiftUI - -struct NewsList: View { - var latestNews: [LatestNewsModel] - - var body: some View { - ScrollView(showsIndicators: false) { - VStack { - ForEach(latestNews, id: \.self) { new in - if !new.headline.isEmpty { - NewsRow(new: new) - Divider() - .padding() - - } - } - } - .padding() - } - } -} - -struct NewsList_Previews: PreviewProvider { - static var previews: some View { - NewsList( - latestNews: [ - LatestNewsModel( - datetime: 1621037430000, - headline: "Chaos Monkeys' author calls Apple's statement on his departure defamatory", - image: "https://cloud.iexapis.com/v1/news/image/99abeb99-6d9e-47c8-ae7b-53404eacccec", - source: "Investing.com", - summary: "https://www.investing.com/news/stock-market-news", - url: "https://cloud.iexapis.com/v1/news/article/99abeb99-6d9e-47c8-ae7b-53404eacccec") - ] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/NewsRow.swift --- a/LazyBear/Views/Company/Helpers/NewsRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -// -// NewsRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/6/21. -// - -import SwiftUI - -struct NewsRow: View { - var new: LatestNewsModel - @State private var showWebArticle = false - - var body: some View { - HStack { - VStack(alignment: .leading) { - Text("\(convertEpoch(new.datetime, true)) ago") - .font(.caption2) - .opacity(0.5) - - Text(new.headline.capitalized) - .font(.headline) - .fontWeight(.semibold) - .fixedSize(horizontal: false, vertical: true) /// I need to add this to make lineLimit works correctly - .lineLimit(2) - } - - Spacer() - - Button(action: { showWebArticle = true }) { - Capsule() - .foregroundColor(Color(.secondarySystemBackground)) - .frame(width: 80, height: 35, alignment: .center) - .overlay( - Text("READ") - .font(.headline) - ) - } - } - .sheet(isPresented: $showWebArticle) { - SFSafariViewWrapper(url: URL(string: new.url)!) - .edgesIgnoringSafeArea(.bottom) - } - } -} - -struct NewsRow_Previews: PreviewProvider { - static var previews: some View { - NewsRow( - new: LatestNewsModel( - datetime: 1621037430000, - headline: "Chaos Monkeys' author calls Apple's statement on his departure defamatory", - image: "https://cloud.iexapis.com/v1/news/image/99abeb99-6d9e-47c8-ae7b-53404eacccec", - source: "Investing.com", - summary: "https://www.investing.com/news/stock-market-news", - url: "https://bloomberg.com") - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Helpers/SFSafariViewWrapper.swift --- a/LazyBear/Views/Company/Helpers/SFSafariViewWrapper.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -// -// SFSafariViewWrapper.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 21/6/21. -// - -import SwiftUI -import SafariServices - -struct SFSafariViewWrapper: UIViewControllerRepresentable { - let url: URL - func makeUIViewController(context: UIViewControllerRepresentableContext) -> SFSafariViewController { - return SFSafariViewController(url: url) - } - func updateUIViewController(_ uiViewController: SFSafariViewController, context: UIViewControllerRepresentableContext) { - return - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Networking/Company.swift --- a/LazyBear/Views/Company/Networking/Company.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -// -// Company.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 20/6/21. -// - -import SwiftUI -import Alamofire - -class Company: ObservableObject { - @Published var showView = false - @Published var showChart = true /// To show a ProgressView when the chart is refreshed (Date range selected) - @Published var data = CompanyResponse() - - func request(_ url: String, _ requestType: RequestType) { - if requestType == .refresh { self.showChart = false } - AF.request(url).responseDecodable(of: CompanyResponse.self) { response in - if let value = response.value { - switch requestType { - case .initial: - self.data = value - case .streaming: - self.data.quote = value.quote - case .refresh: - self.data.historicalPrices = value.historicalPrices - } - - self.showView = true - self.showChart = true - } - } - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Company/Networking/CompanyResponse.swift --- a/LazyBear/Views/Company/Networking/CompanyResponse.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -// -// CompanyResponse.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 20/6/21. -// - -import SwiftUI - -struct CompanyResponse: Codable { - var historicalPrices: [HistoricalPricesModel]? - var quote: [QuoteModel]? - var latestNews: [LatestNewsModel]? - var keyStats: KeyStatsModel? - var insiderRoster: [InsiderRosterModel]? - var insiderTransactions: [InsiderTransactionModel]? -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Global Helpers/RenameAction.swift --- a/LazyBear/Views/Global Helpers/RenameAction.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -// -// RenameAction.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 24/4/21. -// - -import SwiftUI - -struct RenameAction: View { - var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -struct RenameAction_Previews: PreviewProvider { - static var previews: some View { - RenameAction() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/CurrencyItem.swift --- a/LazyBear/Views/Home/Helpers/CurrencyItem.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -// -// CurrencyItem.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 12/4/21. -// - -import SwiftUI - -struct CurrencyItem: View { - var currency: CurrencyModel - @Environment(\.colorScheme) private var colorScheme - - var body: some View { - RoundedRectangle(cornerRadius: 8) - .foregroundColor(Color("customSecondaryBackground")) - .if(colorScheme == .light) { content in - content.shadow(color: Color(.systemGray).opacity(0.25), radius: 10, x: 0.0, y: 0.0) - } - .frame(width: 330, height: 50) - .overlay( - HStack { - Color.blue - .frame(width: 40) - .overlay( - Text(currency.flag) - ) - VStack(alignment: .leading) { - Text("USD/\(currency.symbol)") - .font(.headline) - - Text(currency.name) - .font(.callout) - } - - Spacer() - Text("\(currency.rate, specifier: "%.2f")") - .padding(.horizontal) - } - .clipShape(RoundedRectangle(cornerRadius: 8)) - ) - } -} - -struct CurrencyItem_Previews: PreviewProvider { - static var previews: some View { - CurrencyItem(currency: CurrencyModel(symbol: "AUD", name: "Australian dollar", flag: "🇺🇸", rate: 1.3116)) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/CurrencyRow.swift --- a/LazyBear/Views/Home/Helpers/CurrencyRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -// -// CurrencyRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 14/4/21. -// - -import SwiftUI - -struct CurrencyRow: View { - var latestCurrencies: [CurrencyModel] - - var body: some View { - VStack(alignment: .leading) { - HStack(alignment: .bottom) { - VStack(alignment: .leading) { - Text("Currencies") - .font(.title3) - .fontWeight(.semibold) - .padding([.top, .horizontal]) - - Text("Updated at 6:00 CET on every working day") - .font(.caption) - .opacity(0.5) - .padding(.horizontal) - } - - Spacer() - NavigationLink(destination: CurrencySheet(latestCurrencies: latestCurrencies) - .navigationTitle("Currencies") - ) { - HStack { - Text("See all") - Image(systemName: "chevron.right") - } - } - .padding(.horizontal) - } - - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 20) { - ForEach(latestCurrencies, id: \.self) { currency in - CurrencyItem(currency: currency) - } - } - .padding() - } - } - } -} - -struct CurrencyRow_Previews: PreviewProvider { - static var previews: some View { - CurrencyRow(latestCurrencies: [CurrencyModel(symbol: "AUD", name: "Australian dollar", flag: "🇺🇸", rate: 1.3116)]) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/CurrencySheet.swift --- a/LazyBear/Views/Home/Helpers/CurrencySheet.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -// -// CurrencySheet.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 13/6/21. -// - -import SwiftUI - -struct CurrencySheet: View { - var latestCurrencies: [CurrencyModel] - @Environment(\.presentationMode) private var currencySheetPresentation - - var body: some View { - NavigationView { - VStack { - List(latestCurrencies, id: \.self) { currency in - CurrencySheetRow(currency: currency) - } - } - .navigationTitle("Currencies") - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { - Button(action: {currencySheetPresentation.wrappedValue.dismiss()}) { - Image(systemName: "multiply") - } - } - } - } - } -} - -struct CurrencySheet_Previews: PreviewProvider { - static var previews: some View { - CurrencySheet(latestCurrencies: [CurrencyModel(symbol: "AUD", name: "Australian dollar", flag: "🇦🇺", rate: 1.2938)]) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/CurrencySheetRow.swift --- a/LazyBear/Views/Home/Helpers/CurrencySheetRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -// -// CurrencySheetRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 13/6/21. -// - -import SwiftUI - -struct CurrencySheetRow: View { - var currency: CurrencyModel - - var body: some View { - HStack { - Text(currency.flag) - .padding(.trailing) - - VStack(alignment: .leading) { - Text("USD/\(currency.symbol)") - .font(.headline) - - Text(currency.name) - .font(.callout) - } - - Spacer() - Text("\(currency.rate, specifier: "%.2f")") - .fontWeight(.semibold) - .padding(.horizontal) - } - } -} - -struct CurrencySheetRow_Previews: PreviewProvider { - static var previews: some View { - CurrencySheetRow(currency: CurrencyModel(symbol: "AUD", name: "Australian dollar", flag: "🇦🇺", rate: 1.2938)) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/SectorItem.swift --- a/LazyBear/Views/Home/Helpers/SectorItem.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -// -// SectorItem.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 28/3/21. -// - -import SwiftUI - -struct SectorItem: View { - @Environment(\.colorScheme) var colorScheme - var sector: SectorPerformanceModel - - var body: some View { - VStack { - Image(sector.name) - .resizable() - .background(Color.black) - .opacity(0.7) - .clipShape(Circle()) - .overlay(Circle().stroke(colorScheme == .dark ? Color(.secondarySystemBackground) : Color.white, lineWidth: 4)) - .shadow(color: Color.black.opacity(0.2), radius: 5) - .overlay( - VStack { - Text("\(sector.performance*100, specifier: "%.2f")%") - .font(.title) - .fontWeight(.semibold) - .foregroundColor(sector.performance < 0 ? .red: .green) - } - ) - - Text(sector.name) - .font(.caption) - .fontWeight(.semibold) - } - .frame(width: 170, height: 170) - } -} - -struct SectorItem_Previews: PreviewProvider { - static var previews: some View { - SectorItem(sector: SectorPerformanceModel(name: "Technology", performance: 0.04)) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/SectorRow.swift --- a/LazyBear/Views/Home/Helpers/SectorRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -// -// SectorRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 28/3/21. -// - -import SwiftUI - -struct SectorRow: View { - var sectorPerformance: [SectorPerformanceModel] - - var body: some View { - VStack(alignment: .leading) { - Text("Performance by sector") - .font(.title3) - .fontWeight(.semibold) - .padding([.top, .horizontal]) - - Text("Real-time data") - .font(.caption) - .opacity(0.5) - .padding([.horizontal, .bottom]) - - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 20) { - ForEach(sectorPerformance, id: \.self) { sector in - SectorItem(sector: sector) - } - } - .padding() - } - .frame(height: 170) - } - .padding(.bottom) - } -} - -struct SectorRow_Previews: PreviewProvider { - static var previews: some View { - SectorRow(sectorPerformance: [SectorPerformanceModel(name: "Technology", performance: 0.04)]) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/StockItem.swift --- a/LazyBear/Views/Home/Helpers/StockItem.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -// -// StockItem.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 13/6/21. -// - -import SwiftUI -import StockCharts - -struct StockItem: View { - var company: CompanyModel - @Environment(\.colorScheme) private var colorScheme - - var body: some View { - RoundedRectangle(cornerRadius: 20) - .foregroundColor(Color("customSecondaryBackground")) - .aspectRatio(0.8, contentMode: .fit) - .clipShape(RoundedRectangle(cornerRadius: 20)) - .if(colorScheme == .light) { content in - content.shadow(color: Color(.systemGray).opacity(0.25), radius: 10, x: 0.0, y: 0.0) - } - .overlay( - VStack(alignment: .leading) { - Group { - Text(company.symbol.uppercased()) - .fontWeight(.semibold) - .padding(.top) - - Text(company.companyName.capitalized) - .font(.callout) - .fontWeight(.semibold) - .opacity(0.6) - .lineLimit(1) - - if let latestPrice = company.latestPrice, let changePercent = company.changePercent { - VStack(alignment: .leading) { - Text("\(latestPrice, specifier: "%.2f")") - .foregroundColor(changePercent < 0 ? .red: .green) - .fontWeight(.semibold) - - Text("\(changePercent * 100, specifier: "%.2f")%") - .foregroundColor(changePercent < 0 ? .red: .green) - .font(.callout) - .fontWeight(.semibold) - } - .padding(.top) - } - } - .padding(.horizontal) - - Spacer() - - LineChartView(data: company.intradayPrices, dates: nil, hours: nil, dragGesture: false) - .padding(.vertical) - .clipShape(RoundedRectangle(cornerRadius: 20)) - } - ,alignment: .leading - ) - } -} - -struct StockItem_Previews: PreviewProvider { - static var previews: some View { - StockItem(company: CompanyModel(symbol: "aapl", companyName: "Apple Inc", latestPrice: 120.3, changePercent: 0.03, intradayPrices: [120.3])) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/StockRow.swift --- a/LazyBear/Views/Home/Helpers/StockRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -// -// StockRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 28/3/21. -// - -import SwiftUI - - -struct StockRow: View { - var listName: String - var companies: [CompanyModel] - - var body: some View { - VStack(alignment: .leading) { - HStack(alignment: .bottom) { - VStack(alignment: .leading) { - Text(adaptListTitle(listName)) - .font(.title3) - .fontWeight(.semibold) - .padding([.top, .horizontal]) - - Text("Real-time quotes") - .font(.caption) - .opacity(0.5) - .padding(.horizontal) - } - - Spacer() - NavigationLink(destination: StockSheet(listName: adaptListTitle(listName), companies: companies) - .navigationTitle(adaptListTitle(listName)) - ) { - HStack { - Text("See all") - Image(systemName: "chevron.right") - } - } - .padding(.horizontal) - } - - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 20) { - ForEach(companies, id: \.self) { company in - NavigationLink(destination:CompanyView(symbol: company.symbol, name: company.companyName) - .navigationTitle(company.symbol.uppercased()) - ) { - StockItem(company: company) - } - .buttonStyle(PlainButtonStyle()) - } - } - .padding() - } - .frame(height: 250) - } - } - - /* - Get list keys (mostactive, losers, active) and adapt them to diplay - */ - private func adaptListTitle(_ title: String) -> String { - if title == "mostactive" { - return "Most active" - } else { - return title.capitalized - } - } -} - - -struct StockRectangleRow_Previews: PreviewProvider { - static var previews: some View { - StockRow( - listName: "mostactive", - companies: [CompanyModel(symbol: "aapl", companyName: "Apple Inc", latestPrice: 120.3, changePercent: 0.03, intradayPrices: [120.3])] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/StockSheet.swift --- a/LazyBear/Views/Home/Helpers/StockSheet.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -// -// StockSheet.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 13/6/21. -// - -import SwiftUI - -struct StockSheet: View { - var listName: String - var companies: [CompanyModel] - - var body: some View { - VStack { - List(companies, id: \.self) { company in - NavigationLink(destination: - CompanyView(symbol: company.symbol, name: company.companyName) - .navigationTitle(company.symbol.uppercased()) - ) { - StockSheetRow(company: company) - } - } - } - } -} - -struct StockSheet_Previews: PreviewProvider { - static var previews: some View { - StockSheet( - listName: "Most active", - companies: [CompanyModel(symbol: "aapl", companyName: "Apple Inc", latestPrice: 120.3, changePercent: 0.03, intradayPrices: [120.3])] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/StockSheetRow.swift --- a/LazyBear/Views/Home/Helpers/StockSheetRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -// -// StockSheetRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 13/6/21. -// - -import SwiftUI -import StockCharts - -struct StockSheetRow: View { - var company: CompanyModel - - var body: some View { - HStack { - VStack(alignment: .leading) { - Text(company.symbol.uppercased()) - .fontWeight(.semibold) - - Text(company.companyName.capitalized) - .font(.callout) - .fontWeight(.semibold) - .opacity(0.6) - .lineLimit(1) - } - - Spacer() - LineChartView(data: company.intradayPrices, dates: nil, hours: nil, dragGesture: false) - .frame(width: 80) - .padding(.vertical, 10) - .padding(.horizontal) - - - if let latestPrice = company.latestPrice, let changePercent = company.changePercent { - VStack(alignment: .trailing) { - Text("\(latestPrice, specifier: "%.2f")") - .foregroundColor(changePercent < 0 ? .red: .green) - .fontWeight(.semibold) - - Text("\(changePercent * 100, specifier: "%.2f")%") - .foregroundColor(changePercent < 0 ? .red: .green) - .font(.callout) - .fontWeight(.semibold) - } - } - } - } -} - -struct StockSheetRow_Previews: PreviewProvider { - static var previews: some View { - StockSheetRow(company: CompanyModel(symbol: "aapl", companyName: "Apple Inc", latestPrice: 120.3, changePercent: 0.03, intradayPrices: [120.3])) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/TradingDatesItem.swift --- a/LazyBear/Views/Home/Helpers/TradingDatesItem.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -// -// TradingDatesItem.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 30/3/21. -// - -import SwiftUI - -struct TradingDatesItem: View { - var date: Date - @Environment(\.colorScheme) var colorScheme - - var body: some View { - RoundedRectangle(cornerRadius: 20) - .foregroundColor(Color(.secondarySystemBackground)) - .frame(width: 100, height: 100) - .overlay( - VStack { - Text(getDateComponents(.month, date)) - .fontWeight(.semibold) - - Text(getDateComponents(.day, date)) - .font(.title) - .fontWeight(.semibold) - .foregroundColor(Color(.blue)) - - Text(getDateComponents(.year, date)) - .font(.caption) - .fontWeight(.semibold) - } - ) - } -} - -struct TradingDatesItem_Previews: PreviewProvider { - static var previews: some View { - TradingDatesItem(date: Date()) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Helpers/TradingDatesSheet.swift --- a/LazyBear/Views/Home/Helpers/TradingDatesSheet.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -// -// TradingDateSheet.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 30/3/21. -// - -import SwiftUI - - -struct TradingDatesSheet: View { - var dates: [String] - @Environment(\.presentationMode) private var tradingDatesPresentation - - let columns = [GridItem(.adaptive(minimum: 100))] - - var body: some View { - NavigationView { - ScrollView { - LazyVGrid(columns: columns, spacing: 20) { - ForEach(dates, id: \.self) { date in - TradingDatesItem(date: convertStringToDate(date)) - } - } - .padding() - } - .navigationTitle("Holiday dates") - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { - Button(action: { tradingDatesPresentation.wrappedValue.dismiss() }) { - Image(systemName: "multiply") - .imageScale(.large) - } - } - } - } - } -} - -struct TradingDate_Previews: PreviewProvider { - static var previews: some View { - // Format is YYYY-MM-DD - TradingDatesSheet(dates: ["2021-01-01"]) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/HomeView.swift --- a/LazyBear/Views/Home/HomeView.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -// -// HomeView.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 28/3/21. -// - -import SwiftUI - -struct HomeView: View { - @ObservedObject var home = Home() - - @State private var showTradingDates = false - @State private var timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() /// Set recurrent price request - - static let taskDateFormat: DateFormatter = { - let formatter = DateFormatter() - formatter.dateStyle = .medium - return formatter - }() - - let dueDate = Date() - - var body: some View { - if home.showView { - NavigationView { - ScrollView(showsIndicators: false) { - VStack { - if let sectorPerformance = home.data.sectorPerformance { - SectorRow(sectorPerformance: sectorPerformance) - .listRowInsets(EdgeInsets()) - } - - if let lists = home.data.lists { - let listNames = Array(lists.keys.sorted()) - ForEach(listNames, id: \.self) { listName in - StockRow(listName: listName, companies: lists[listName]!) - .listRowInsets(EdgeInsets()) - } - } - - if let latestCurrencies = home.data.latestCurrencies { - CurrencyRow(latestCurrencies: latestCurrencies) - .listRowInsets(EdgeInsets()) - } - } - .onAppear { self.timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() } /// Restart timer - .onReceive(timer) { _ in home.request("https://api.lazybear.app/home/type=streaming", .streaming) } /// Receive timer notification - .onDisappear { self.timer.upstream.connect().cancel() } // Stop timer - .navigationTitle("\(dueDate, formatter: Self.taskDateFormat)") - .toolbar { - ToolbarItem(placement: .navigationBarTrailing) { - Button(action: { showTradingDates = true }) { - Image(systemName: "clock") - } - } - } - } - .background(Color("customBackground").edgesIgnoringSafeArea(.all)) - } - .navigationViewStyle(StackNavigationViewStyle()) - .sheet(isPresented: $showTradingDates) { - if let dates = home.data.tradingDates { - TradingDatesSheet(dates: dates) - } - } - } else { - ProgressView() - .onAppear { home.request("https://api.lazybear.app/home/type=initial", .initial) } - } - } -} - -struct HomeView_Previews: PreviewProvider { - static var previews: some View { - HomeView() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Networking/Home.swift --- a/LazyBear/Views/Home/Networking/Home.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -// -// Home.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 11/4/21. -// - -import SwiftUI -import Alamofire - -class Home: ObservableObject { - @Published var data = HomeResponse() - @Published var showView = false - @Published var triggerHaptic = false - - func request(_ url: String, _ requestType: RequestType) { - AF.request(url).responseDecodable(of: HomeResponse.self) { response in - if let value = response.value { - switch requestType { - case .initial: - self.data = value - default: - self.data.lists = value.lists - self.data.sectorPerformance = value.sectorPerformance - } - - self.triggerHaptic = true - self.showView = true - } - } - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Home/Networking/HomeResponse.swift --- a/LazyBear/Views/Home/Networking/HomeResponse.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -// -// HomeResponse.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 11/4/21. -// - -import SwiftUI - -struct HomeResponse: Codable { - var latestCurrencies: [CurrencyModel]? - var lists: [String: [CompanyModel]]? /// String = list name - var sectorPerformance: [SectorPerformanceModel]? - var tradingDates: [String]? -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Helpers/ProfileStockRow.swift --- a/LazyBear/Views/Profile/Helpers/ProfileStockRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -// -// ProfileStockRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 19/6/21. -// - -import SwiftUI - -struct ProfileStockRow: View { - var watchlistName: String - var companies: [CompanyModel] - - @State private var showWatchlistSheet = false - - var body: some View { - VStack(alignment: .leading) { - HStack(alignment: .bottom) { - VStack(alignment: .leading) { - Text(watchlistName) - .font(.title3) - .fontWeight(.semibold) - .padding([.top, .horizontal]) - - Text("Real-time quotes") - .font(.caption) - .opacity(0.5) - .padding(.horizontal) - } - - Spacer() - NavigationLink(destination: WatchlistSheet(listName: watchlistName, apiCompanies: companies) - .navigationTitle(watchlistName) - ) { - HStack { - Text("See all") - Image(systemName: "chevron.right") - } - } - .padding(.horizontal) - } - - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 20) { - ForEach(companies, id: \.self) { company in - StockItem(company: company) - } - } - .padding() - } - .frame(height: 250) - } - .padding(.bottom) - } -} - -struct ProfileStockRow_Previews: PreviewProvider { - static var previews: some View { - ProfileStockRow( - watchlistName: "mostactive", - companies: [CompanyModel(symbol: "aapl", companyName: "Apple Inc", latestPrice: 120.3, changePercent: 0.03, intradayPrices: [120.3])] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Helpers/RenameListSheet.swift --- a/LazyBear/Views/Profile/Helpers/RenameListSheet.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -// -// RenameListSheet.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 18/6/21. -// - -import SwiftUI -import Introspect - -struct RenameListSheet: View { - var oldWatchlistName: String - - @State private var newWatchlistName = String() - - @Environment(\.presentationMode) private var renameListSheetPresentation - @Environment(\.managedObjectContext) private var moc - @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) - var watchlistCompanies: FetchedResults - - var body: some View { - NavigationView { - Form { - let header = "Need ideas? Try my portfolio, or banks" - Section(header: Text(header)) { - TextField("Enter a name", text: $newWatchlistName) - .introspectTextField { textField in - textField.becomeFirstResponder() - } - } - } - .navigationTitle("Rename your watchlist") - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { - Button(action: { renameListSheetPresentation.wrappedValue.dismiss() }) { - Image(systemName: "multiply") - } - } - - ToolbarItem(placement: .navigationBarTrailing) { - if !newWatchlistName.isEmpty { - Button("Done", action: { renameWatchlist() }) - } - } - } - } - } - - /* - Rename watchlistName variable from each Core Data (WatchlistCompany) object - */ - private func renameWatchlist() { - for watchlistCompany in watchlistCompanies { - watchlistCompany.watchlistName = newWatchlistName - } - - do { - try moc.save() - renameListSheetPresentation.wrappedValue.dismiss() - - } catch { - print(error.localizedDescription) - } - } -} - -struct RenameListSheet_Previews: PreviewProvider { - @Environment(\.presentationMode) static var presentationMode - - static var previews: some View { - RenameListSheet(oldWatchlistName: "Old name") - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Helpers/WatchlistCreator.swift --- a/LazyBear/Views/Profile/Helpers/WatchlistCreator.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -// -// WatchlistCreator.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 30/4/21. -// - -import SwiftUI - -struct WatchlistCreator: View { - @ObservedObject var watchlistCreatorClass = WatchlistCreatorClass() - @State private var showSearchView = false - @State private var showCancelAlert = false - @State private var watchlistNameIsEmpty = false - - @Environment(\.managedObjectContext) private var moc - @Environment(\.presentationMode) private var watchlistCreatorPresentation - - var body: some View { - NavigationView { - Form { - Section(header: Text("Watchlist name")) { - TextField("Technologies, banks", text: $watchlistCreatorClass.name) - } - - Section(header: Text("Companies")) { - Button("Add companies", action: { showSearchView = true }) - - ForEach(watchlistCreatorClass.companies, id: \.self) { company in - HStack { - VStack(alignment: .leading) { - Text(company.symbol!.uppercased()) - .fontWeight(.semibold) - - Text(company.securityName!.capitalized) - .lineLimit(1) - } - - Spacer() - Button(action: { remove(company) }, label: { - Image(systemName: "multiply.circle") - .imageScale(.large) - }) - } - } - } - } - .navigationTitle("New watchlist") - .navigationBarTitleDisplayMode(.inline) - .toolbar { - ToolbarItem(placement: .navigationBarTrailing) { - Button("Done", action: { save() }) - } - - ToolbarItem(placement: .navigationBarLeading) { - Button("Cancel", action: { self.showCancelAlert = true }) - } - } - .alert(isPresented: $showCancelAlert) { /// Show alert when the user tries to exit the view without saving the new watchlist - Alert( - title: Text("Your watchlist won't be saved"), - message: Text("This action can't be undo"), - primaryButton: .destructive(Text("Exit")) { watchlistCreatorPresentation.wrappedValue.dismiss() }, - secondaryButton: .cancel() - ) - } - } - .alert(isPresented: $watchlistNameIsEmpty) { /// Show alert when the user tries to save the watchlist without a name - Alert( - title: Text("Give a name to your new watchlist"), - message: Text("Try My portfolio, Favourites, ..."), - dismissButton: .default(Text("Got it!")) - ) - } - .sheet(isPresented: $showSearchView) { - WatchlistCreatorList(watchlistCreatorClass: watchlistCreatorClass) - .environment(\.managedObjectContext, self.moc) - } - } - - /* - Search company in array and get the index -> Delete company at - this index from the array (Core Data) - */ - private func remove(_ company: SearchResponse) { - let index = watchlistCreatorClass.companies.firstIndex(of: company) - watchlistCreatorClass.companies.remove(at: index!) - } - - /* - Check if the watchlist name is empty when the user taps the Done button. - If it's not empty -> Save watchlist to Core Data - */ - private func save() { - if watchlistCreatorClass.name.isEmpty { - watchlistNameIsEmpty = true - } else { - for company in watchlistCreatorClass.companies { - let watchlistCompany = WatchlistCompany(context: moc) - watchlistCompany.name = company.securityName ?? "-" - watchlistCompany.symbol = company.symbol! - watchlistCompany.watchlistName = watchlistCreatorClass.name - } - - do { - try moc.save() - print("Watchlist created") - watchlistCreatorPresentation.wrappedValue.dismiss() // Dismiss view - } catch { - print(error.localizedDescription) - } - } - } -} - -struct CreateNewWatchlist_Previews: PreviewProvider { - static var previews: some View { - WatchlistCreator() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Helpers/WatchlistCreatorClass.swift --- a/LazyBear/Views/Profile/Helpers/WatchlistCreatorClass.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -// -// WatchlistCreatorClass.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 30/4/21. -// - -import SwiftUI - -class WatchlistCreatorClass: ObservableObject { - @Published var name = String() - @Published var companies = [SearchResponse]() -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Helpers/WatchlistCreatorList.swift --- a/LazyBear/Views/Profile/Helpers/WatchlistCreatorList.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -// -// WatchlistCreatorList.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 2/5/21. -// - -import SwiftUI -import Alamofire - -struct WatchlistCreatorList: View { - @ObservedObject var watchlistCreatorClass: WatchlistCreatorClass - - @State private var searchedCompany = String() - @State private var companies = [SearchResponse]() - - @Environment(\.presentationMode) private var watchlistCreatorListPresentation - @Environment(\.managedObjectContext) private var moc - - var body: some View { - NavigationView { - VStack { - WatchlistCreatorSearchBar(searchedCompany: $searchedCompany) - - List(companies, id: \.self) { company in - WatchlistCreatorRow(company: company, watchlistCreatorListPresentation: watchlistCreatorListPresentation, watchlistCreatorClass: watchlistCreatorClass) - .environment(\.managedObjectContext, self.moc) - } - } - .navigationTitle("Search") - .navigationBarTitleDisplayMode(.inline) - .onChange(of: searchedCompany, perform: { searchedCompany in - encodeAndRequest(searchedCompany) - }) - - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { - Button("Cancel", action: { watchlistCreatorListPresentation.wrappedValue.dismiss() }) - } - } - } - } - - /* - Get companies from the API that matches the searched text - */ - private func request(_ url: String) { - AF.request(url).responseDecodable(of: [SearchResponse].self) { response in - if let value = response.value { - self.companies = value - } - } - } - - /* - 1) Check if searchedCompany is empty - 2) Encode white spaces - 3) Request API - */ - private func encodeAndRequest(_ searchedCompany: String) { - if !searchedCompany.isEmpty { - let encodedSearchedCompany = searchedCompany.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) - request("https://api.lazybear.app/search/text=\(encodedSearchedCompany ?? "")") - } - } -} - -struct SearchCompanies_Previews: PreviewProvider { - static var previews: some View { - WatchlistCreatorList(watchlistCreatorClass: WatchlistCreatorClass()) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Helpers/WatchlistCreatorRow.swift --- a/LazyBear/Views/Profile/Helpers/WatchlistCreatorRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -// -// WatchlistCreatorRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 2/5/21. -// - -import SwiftUI - -struct WatchlistCreatorRow: View { - var company: SearchResponse - @Binding var watchlistCreatorListPresentation: PresentationMode - @ObservedObject var watchlistCreatorClass: WatchlistCreatorClass - - var body: some View { - Button(action: { saveCompany() }) { - HStack { - VStack(alignment: .leading) { - Text(company.symbol!.uppercased()) - .fontWeight(.semibold) - - Text(company.securityName ?? "-") - .font(.callout) - .fontWeight(.semibold) - .opacity(0.6) - .lineLimit(1) - } - - Spacer() - Image(systemName: "plus.circle") - .imageScale(.large) - .foregroundColor(Color.blue) - } - .contentShape(Rectangle()) - } - .buttonStyle(PlainButtonStyle()) - } - - /* - Save company when it's selected and dismiss view - */ - private func saveCompany() { - watchlistCreatorClass.companies.append(company) - $watchlistCreatorListPresentation.wrappedValue.dismiss() - } -} - -struct WatchlistCreatorRow_Previews: PreviewProvider { - @Environment(\.presentationMode) static var presentationMode - - static var previews: some View { - WatchlistCreatorRow(company: SearchResponse(currency: "USD", exchange: nil, region: "US", securityName: "Apple Inc", symbol: "AAPL"), watchlistCreatorListPresentation: presentationMode, watchlistCreatorClass: WatchlistCreatorClass()) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Helpers/WatchlistCreatorSearchBar.swift --- a/LazyBear/Views/Profile/Helpers/WatchlistCreatorSearchBar.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -// -// WatchlistCreatorSearchBar.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 2/5/21. -// - -import SwiftUI -import Introspect - -struct WatchlistCreatorSearchBar: View { - @Binding var searchedCompany: String - - var body: some View { - TextField("", text: $searchedCompany) - .introspectTextField { textField in - textField.becomeFirstResponder() - } - .padding(10) - .padding(.leading, 40) - .overlay( - Image(systemName: "magnifyingglass") - .imageScale(.large) - .opacity(0.4) - .padding(.horizontal) - ,alignment: .leading - ) - .background( - Color(.secondarySystemBackground) - .cornerRadius(10) - ) - .padding() - - } -} - -struct CustomSearchBar_Previews: PreviewProvider { - static var previews: some View { - WatchlistCreatorSearchBar(searchedCompany: .constant("")) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Helpers/WatchlistSheet.swift --- a/LazyBear/Views/Profile/Helpers/WatchlistSheet.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -// -// WatchlistSheet.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 16/6/21. -// - -import SwiftUI - -struct WatchlistSheet: View { - var listName: String - var apiCompanies: [CompanyModel] - - @Environment(\.managedObjectContext) private var moc - @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) - var watchlistCompanies: FetchedResults - - @State private var showDeleteListAlert = false - - var body: some View { - VStack { - List { - ForEach(watchlistCompanies.filter { $0.watchlistName == listName }, id: \.self) { watchlistCompany in - let apiCompany = apiCompanies.first(where: { $0.symbol == watchlistCompany.symbol }) - WatchlistSheetRow(apiCompany: apiCompany!, watchlistCompany: watchlistCompany) - } - .onDelete(perform: deleteCompany) - } - } - .navigationTitle(listName) - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { -// Button(action: { willRenameWatchlist = false; watchlistSheetPresentation.wrappedValue.dismiss()} ) { -// Image(systemName: "multiply") -// } - } - - ToolbarItem(placement: .navigationBarTrailing) { - Menu { - Section { -// Button(action: { willRenameWatchlist = true; watchlistSheetPresentation.wrappedValue.dismiss() }) { -// Label("Rename list", systemImage: "square.and.pencil") -// } - } - - if Set(watchlistCompanies.map { $0.watchlistName }).count > 1 { /// If there are only 1 watchlist (default) -> It cannot be deleted - Section(header: Text("Secondary actions")) { - Button(action: { showDeleteListAlert = true }) { - Label("Delete list", systemImage: "trash") - } - } - } - } - label: { - Label("Options", systemImage: "ellipsis.circle") - .imageScale(.large) - } - } - } - .alert(isPresented: $showDeleteListAlert) { /// Show delete list alert - Alert( - title: Text("Are you sure you want to delete this list?"), - message: Text("This action can't be undo"), - primaryButton: .destructive(Text("Delete")) { deleteList() }, - secondaryButton: .cancel() - ) - } - } - - /* - Delete company from watchlist. - */ - private func deleteCompany(at offsets: IndexSet) { - let watchlistCompaniesFiltered = watchlistCompanies.filter { $0.watchlistName == listName } - for index in offsets { - let company = watchlistCompaniesFiltered[index] - moc.delete(company) - } - do { - try moc.save() - print("Company deleted") - } catch { - print(error.localizedDescription) - } - } - - /* - Remove entire list if it's not the last one. - */ - private func deleteList() { - let watchlistCompaniesFiltered = watchlistCompanies.filter { $0.watchlistName == listName } - for company in watchlistCompaniesFiltered { - moc.delete(company) - } - do { - try moc.save() - print("List deleted") -// watchlistSheetPresentation.wrappedValue.dismiss() /// Dismiss view - } catch { - print(error.localizedDescription) - } - } -} - -struct WatchlistSheet_Previews: PreviewProvider { - static var previews: some View { - WatchlistSheet( - listName: "Most active", - apiCompanies: [CompanyModel(symbol: "aapl", companyName: "Apple Inc", latestPrice: 120.3, changePercent: 0.03, intradayPrices: [120.3])] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Helpers/WatchlistSheetRow.swift --- a/LazyBear/Views/Profile/Helpers/WatchlistSheetRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -// -// WatchlistSheetRow.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 18/6/21. -// - -import SwiftUI -import StockCharts -import CoreData - -struct WatchlistSheetRow: View { - var apiCompany: CompanyModel - var watchlistCompany: WatchlistCompany - - var body: some View { - HStack { - VStack(alignment: .leading) { - Text(watchlistCompany.symbol.uppercased()) - .fontWeight(.semibold) - - Text(watchlistCompany.name.capitalized) - .font(.callout) - .fontWeight(.semibold) - .opacity(0.6) - .lineLimit(1) - } - - Spacer() - LineChartView(data: apiCompany.intradayPrices, dates: nil, hours: nil, dragGesture: false) - .frame(width: 80) - .padding(.vertical, 10) - .padding(.horizontal) - - - if let latestPrice = apiCompany.latestPrice, let changePercent = apiCompany.changePercent { - VStack(alignment: .trailing) { - Text("\(latestPrice, specifier: "%.2f")") - .foregroundColor(changePercent < 0 ? .red: .green) - .fontWeight(.semibold) - - Text("\(changePercent * 100, specifier: "%.2f")%") - .foregroundColor(changePercent < 0 ? .red: .green) - .font(.callout) - .fontWeight(.semibold) - } - } - } - } -} - -struct WatchlistSheetRow_Previews: PreviewProvider { - static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) - - static var previews: some View { - let watchlistCompany = WatchlistCompany(context: moc) - watchlistCompany.name = "apple inc" - watchlistCompany.symbol = "aapl" - watchlistCompany.watchlistName = "Default" - - return WatchlistSheetRow( - apiCompany: CompanyModel(symbol: "aapl", companyName: "Apple Inc", latestPrice: 120.3, changePercent: 0.03, intradayPrices: [120.3]), - watchlistCompany: watchlistCompany - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Networking/Profile.swift --- a/LazyBear/Views/Profile/Networking/Profile.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -// -// Profile.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 7/5/21. -// - -import SwiftUI -import Alamofire - -class Profile: ObservableObject { - @Published var showView = false - @Published var data = ProfileResponse() - - func request(_ url: String, _ requestType: RequestType) { - AF.request(url).responseDecodable(of: ProfileResponse.self) { response in - if let value = response.value { - switch requestType { - case .initial: - self.data = value - default: - self.data = value - } - - self.showView = true - } - } - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/Networking/ProfileResponse.swift --- a/LazyBear/Views/Profile/Networking/ProfileResponse.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -// -// ProfileResponse.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 16/4/21. -// - -import SwiftUI - -struct ProfileResponse: Codable { - var quotes: [CompanyModel]? -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Profile/ProfileView.swift --- a/LazyBear/Views/Profile/ProfileView.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +0,0 @@ -// -// ProfileView.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 4/4/21. -// - -import SwiftUI -import CoreData - -struct ProfileView: View { - @ObservedObject var profile = Profile() - @Environment(\.managedObjectContext) private var moc - @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) - var watchlistCompanies: FetchedResults - - @State private var showCreateNewWatchlist = false - @State private var timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() /// Set recurrent price request - - var body: some View { - if profile.showView { - NavigationView { - ScrollView(showsIndicators: false) { - VStack { - if let apiCompanies = profile.data.quotes { - let watchlistsNames = Array(Set(watchlistCompanies.map { $0.watchlistName })).sorted() /// Get watchlistsNames in Core Data - ForEach(watchlistsNames, id: \.self) { watchlistName in - let companies = createWatchlistRow(apiCompanies, watchlistCompanies, watchlistName) - ProfileStockRow(watchlistName: watchlistName, companies: companies) - } - .listRowInsets(EdgeInsets()) - .onAppear { /// Request API again when Core Data changes to update the list - refreshList() - } - } - } - .onAppear { self.timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() } /// Start timer - .onDisappear { self.timer.upstream.connect().cancel() } /// Stop timer - .onReceive(timer) { _ in - if !showCreateNewWatchlist { - prepareUrl(.streaming) - } - } - .navigationTitle("My profile") - .toolbar { - ToolbarItem(placement: .navigationBarTrailing) { - Button(action: { showCreateNewWatchlist = true }) { - Image(systemName: "plus") - } - } - } - } - .background(Color("customBackground").edgesIgnoringSafeArea(.all)) - .fullScreenCover(isPresented: $showCreateNewWatchlist) { - WatchlistCreator() - .environment(\.managedObjectContext, self.moc) - } - } - .navigationViewStyle(StackNavigationViewStyle()) - } else { - ProgressView() - .onAppear { prepareUrl(.initial) } - } - } - - /* - At this point, we have the API response with the watchlist companies data requested and received. Now, we have to extract from the API response - the companies within the selected watchlist. To do that, we should do the following: - 1) Get an array of all the symbols within the specified watchlist. - 2) Iterate over watchlistSymbols and return the company (QuoteModel object) from apiCompanies that matches. - 3) Append this symbol to a new array. - */ - private func createWatchlistRow(_ apiCompanies: [CompanyModel], _ watchlistCompanies: FetchedResults, _ watchlistName: String) -> [CompanyModel] { - let watchlistSymbols = watchlistCompanies.filter({ $0.watchlistName == watchlistName }).map { $0.symbol } /// Get symbols contained in watchlistsName (Core Data) - - var companies = [CompanyModel]() - for watchlistSymbol in watchlistSymbols { - let company = apiCompanies.first(where: { $0.symbol == watchlistSymbol }) - companies.append(company!) - } - - return companies - } - - /* - When a company is added to a watchlist or a new watchlist is created -> call function - to make the API request and refresh correctly the list - */ - private func refreshList() { - if profile.data.quotes!.count < watchlistCompanies.count { - prepareUrl(.initial) - } - } - - /* - Get symbols in watchlists (Core Data) -> Prepare url -> Request - */ - private func prepareUrl(_ requestType: RequestType) { - let symbols = Set(watchlistCompanies.map { $0.symbol }) - let symbolsString = symbols.joined(separator:",") - - switch requestType { - case .initial: - let url = "https://api.lazybear.app/profile/type=initial/symbols=\(symbolsString)" - profile.request(url, .initial) - - default: - let url = "https://api.lazybear.app/profile/type=streaming/symbols=\(symbolsString)" - profile.request(url, .streaming) - } - } -} - -struct ProfileView_Previews: PreviewProvider { - static var previews: some View { - ProfileView() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Search/CompanyList.swift --- a/LazyBear/Views/Search/CompanyList.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -// -// CompanyList.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 3/4/21. -// - -import SwiftUI - -struct CompanyList: View { - var searchResult: [SearchResponse] - - var body: some View { - List(searchResult, id: \.self) { company in - NavigationLink(destination: - CompanyView(symbol: company.symbol!, name: company.securityName!) - .navigationTitle(company.symbol!.uppercased()) - ) { - SearchedCompanyItem(company: company) - } - } - } -} - -struct CompanyList_Previews: PreviewProvider { - static var previews: some View { - CompanyList(searchResult: - [ - SearchResponse( - currency: "USD", - region: "US", - securityName: "aaple inc", - symbol: "aapl"), - SearchResponse( - currency: "USD", - region: "US", - securityName: "aaple inc", - symbol: "aapl"), - SearchResponse( - currency: "USD", - region: "US", - securityName: "aaple inc", - symbol: "aapl"), - SearchResponse( - currency: "USD", - region: "US", - securityName: "aaple inc", - symbol: "aapl"), - SearchResponse( - currency: "USD", - region: "US", - securityName: "aaple inc", - symbol: "aapl") - ] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Search/Helpers/SearchedCompanyItem.swift --- a/LazyBear/Views/Search/Helpers/SearchedCompanyItem.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -// -// SearchedCompanyItem.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 3/4/21. -// - -import SwiftUI - -struct SearchedCompanyItem: View { - var company: SearchResponse - - @Environment(\.managedObjectContext) private var moc - @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) - var watchlistCompanies: FetchedResults - - @State private var showingWatchlistSelector = false - - var body: some View { - HStack { - Button(action: { self.showingWatchlistSelector = true }) { - let watchlistSymbols = watchlistCompanies.map { $0.symbol } - if watchlistSymbols.contains(company.symbol!) { - Image(systemName: "star.fill") - .foregroundColor(Color.yellow) - .imageScale(.large) - } else { - Image(systemName: "star") - .foregroundColor(Color.yellow) - .imageScale(.large) - } - } - .buttonStyle(PlainButtonStyle()) - - VStack(alignment: .leading) { - Text(company.symbol!.uppercased()) - .fontWeight(.semibold) - - Text(company.securityName!.capitalized) - .lineLimit(1) - } - - Spacer() - - VStack(alignment: .trailing) { - Text(company.currency!) - .fontWeight(.semibold) - - Text(company.region!) - } - } - .actionSheet(isPresented: $showingWatchlistSelector) { - ActionSheet(title: Text("Add to watchlist"), message: Text("Select"), buttons: generateButtons()) - } - } - - /* - Generate buttons for each watchlist to let the user selects to which watchlist - he wants to add the company - */ - private func generateButtons() -> [ActionSheet.Button] { - var actionButtons = [ActionSheet.Button]() - let watchlists = Set(watchlistCompanies.map { $0.watchlistName }) - - for watchlistName in watchlists { - actionButtons.append( - .default(Text(watchlistName)) { - addCompany(company.symbol!, company.securityName!, watchlistName) - } - ) - } - - actionButtons.append(.cancel()) - - return actionButtons - } - - /* - When the user taps the watchlist -> save the company to CoreData - */ - private func addCompany(_ symbol: String, _ name: String, _ watchlistName: String) { - let watchlistCompany = WatchlistCompany(context: moc) - watchlistCompany.symbol = symbol - watchlistCompany.name = name - watchlistCompany.watchlistName = watchlistName - do { - try moc.save() - print("Company saved") - } catch { - print(error.localizedDescription) - } - } -} - -struct CompanyRow_Previews: PreviewProvider { - static var previews: some View { - SearchedCompanyItem(company: SearchResponse(currency: "USD", region: "US", securityName: "apple inc", symbol: "aapl")) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Search/Networking/Search.swift --- a/LazyBear/Views/Search/Networking/Search.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -// -// Search.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 16/4/21. -// - -import SwiftUI -import Alamofire - -class Search: ObservableObject { - @Published var data = [SearchResponse()] - @Published var showSearchList = false - - func request(_ url: String) { - AF.request(url).responseDecodable(of: [SearchResponse].self) { response in - if let value = response.value { - self.data = value - self.showSearchList = true - } - } - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Search/Networking/SearchResponse.swift --- a/LazyBear/Views/Search/Networking/SearchResponse.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -// -// SearchResponse.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 16/4/21. -// - -import SwiftUI - -struct SearchResponse: Codable, Hashable { - var currency: String? - var exchange: String? - var region: String? - var securityName: String? - var symbol: String? -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Search/SearchView.swift --- a/LazyBear/Views/Search/SearchView.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -// -// SearchView.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 1/4/21. -// - -import SwiftUI -import SwiftlySearch - -struct SearchView: View { - @ObservedObject var search = Search() - @State private var searchedText = String() - @Environment(\.presentationMode) private var searchViewPresentation - - var body: some View { - NavigationView { - VStack(alignment: .leading) { - if search.showSearchList { - CompanyList(searchResult: search.data) - } else { - VStack(alignment: .center) { - Image("suitBear") - .resizable() - .scaledToFit() - - Text("Are you looking for something?") - .font(.title2) - .fontWeight(.semibold) - .multilineTextAlignment(.center) - .padding(.bottom) - - Text("Use the search bar to find your favourite company. Type the stock symbol or name, I'll find it") - .multilineTextAlignment(.center) - } - .padding(.horizontal) - } - } - .navigationTitle("Search") - .navigationBarTitleDisplayMode(.inline) - .navigationBarSearch($searchedText) - .onChange(of: searchedText, perform: { searchedText in - encodeAndRequest(searchedText) - }) - } - .background(Color("customBackground").edgesIgnoringSafeArea(.all)) - .navigationViewStyle(StackNavigationViewStyle()) - } - - /* - 1) Check if searchedText is empty - 2) Encode white spaces - 3) Make API request - */ - private func encodeAndRequest(_ searchedText: String) { - if !searchedText.isEmpty { - let encodedSearchedText = searchedText.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) - search.request("https://api.lazybear.app/search/text=\(encodedSearchedText ?? "")") - } else { - search.showSearchList = false - } - } -} - -struct SearchView_Previews: PreviewProvider { - static var previews: some View { - SearchView() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBear/Views/Welcome/WelcomeView.swift --- a/LazyBear/Views/Welcome/WelcomeView.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -// -// WelcomeView.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 28/3/21. -// - -import SwiftUI - -struct WelcomeView: View { - @Environment(\.presentationMode) var welcomeView - - var body: some View { - GeometryReader { proxy in - NavigationView { - VStack { - Image("default") - .resizable() - .frame(width: proxy.size.width*0.25, height: proxy.size.width*0.25) - .cornerRadius(25) - .shadow(color: Color.black.opacity(0.3), radius: 10) - .padding(.vertical) - - Text("Lazybear") - .font(.largeTitle) - .fontWeight(.bold) - .padding(.bottom) - - Text("Create watchlists, add companies, and follow the markets in real time.") - .font(.title3) - .fontWeight(.semibold) - .multilineTextAlignment(.center) - } - .padding(.horizontal) - .navigationBarTitleDisplayMode(.inline) - .toolbar { - ToolbarItem(placement: .navigationBarTrailing) { - Button("Done", action: { dismissWelcome() }) - } - } - } - } - } - - private func dismissWelcome() { - UserDefaults.standard.set(true, forKey: "IsAppAlreadyLaunchedOnce") - welcomeView.wrappedValue.dismiss() - } -} - -struct WelcomeView_Previews: PreviewProvider { - static var previews: some View { - WelcomeView() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearTests/LazyBearTests.swift --- a/LazyBearTests/LazyBearTests.swift Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBearTests/LazyBearTests.swift Sat Jul 17 09:33:26 2021 +0100 @@ -1,13 +1,14 @@ // -// LazyBearTests.swift -// LazyBearTests +// lazybearTests.swift +// lazybearTests // -// Created by Dennis Concepción Martín on 16/4/21. +// Created by Dennis Concepción Martín on 17/07/2021. // import XCTest +@testable import lazybear -class LazyBearTests: XCTestCase { +class lazybearTests: XCTestCase { override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. @@ -24,7 +25,7 @@ func testPerformanceExample() throws { // This is an example of a performance test case. - measure { + self.measure { // Put the code you want to measure the time of here. } } diff -r daeac7c7c586 -r 783b567800d9 LazyBearUITests/LazyBearUITests.swift --- a/LazyBearUITests/LazyBearUITests.swift Mon Jul 12 11:04:34 2021 +0100 +++ b/LazyBearUITests/LazyBearUITests.swift Sat Jul 17 09:33:26 2021 +0100 @@ -1,13 +1,13 @@ // -// LazyBearUITests.swift -// LazyBearUITests +// lazybearUITests.swift +// lazybearUITests // -// Created by Dennis Concepción Martín on 16/4/21. +// Created by Dennis Concepción Martín on 17/07/2021. // import XCTest -class LazyBearUITests: XCTestCase { +class lazybearUITests: XCTestCase { override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. @@ -24,7 +24,6 @@ func testExample() throws { // UI tests must launch the application that they test. - let app = XCUIApplication() app.launch() @@ -33,7 +32,7 @@ } func testLaunchPerformance() throws { - if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { // This measures how long it takes to launch your application. measure(metrics: [XCTApplicationLaunchMetric()]) { XCUIApplication().launch() diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : "<=145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -{ - "assets" : [ - { - "filename" : "Circular.imageset", - "idiom" : "watch", - "role" : "circular" - }, - { - "filename" : "Extra Large.imageset", - "idiom" : "watch", - "role" : "extra-large" - }, - { - "filename" : "Graphic Bezel.imageset", - "idiom" : "watch", - "role" : "graphic-bezel" - }, - { - "filename" : "Graphic Circular.imageset", - "idiom" : "watch", - "role" : "graphic-circular" - }, - { - "filename" : "Graphic Corner.imageset", - "idiom" : "watch", - "role" : "graphic-corner" - }, - { - "filename" : "Graphic Extra Large.imageset", - "idiom" : "watch", - "role" : "graphic-extra-large" - }, - { - "filename" : "Graphic Large Rectangular.imageset", - "idiom" : "watch", - "role" : "graphic-large-rectangular" - }, - { - "filename" : "Modular.imageset", - "idiom" : "watch", - "role" : "modular" - }, - { - "filename" : "Utilitarian.imageset", - "idiom" : "watch", - "role" : "utilitarian" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : "<=145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : "<=145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : "<=145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : "<=145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Assets.xcassets/Contents.json --- a/LazyBearWatchOS Extension/Assets.xcassets/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/ComplicationController.swift --- a/LazyBearWatchOS Extension/ComplicationController.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -// -// ComplicationController.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 19/6/21. -// - -import ClockKit - - -class ComplicationController: NSObject, CLKComplicationDataSource { - - // MARK: - Complication Configuration - - func getComplicationDescriptors(handler: @escaping ([CLKComplicationDescriptor]) -> Void) { - let descriptors = [ - CLKComplicationDescriptor(identifier: "complication", displayName: "LazyBear", supportedFamilies: CLKComplicationFamily.allCases) - // Multiple complication support can be added here with more descriptors - ] - - // Call the handler with the currently supported complication descriptors - handler(descriptors) - } - - func handleSharedComplicationDescriptors(_ complicationDescriptors: [CLKComplicationDescriptor]) { - // Do any necessary work to support these newly shared complication descriptors - } - - // MARK: - Timeline Configuration - - func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { - // Call the handler with the last entry date you can currently provide or nil if you can't support future timelines - handler(nil) - } - - func getPrivacyBehavior(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationPrivacyBehavior) -> Void) { - // Call the handler with your desired behavior when the device is locked - handler(.showOnLockScreen) - } - - // MARK: - Timeline Population - - func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) { - // Call the handler with the current timeline entry - handler(nil) - } - - func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) { - // Call the handler with the timeline entries after the given date - handler(nil) - } - - // MARK: - Sample Templates - - func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) { - // This method will be called once per supported complication, and the results will be cached - handler(nil) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/ComplicationViews.swift --- a/LazyBearWatchOS Extension/ComplicationViews.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -// -// ComplicationViews.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 28/06/2021. -// - -import SwiftUI -import ClockKit - -// MARK: - Graphic Rectangular Full View Chart -struct ComplicationGraphicRectangularFullViewChart: View { - @State var home: HomeResponse - - var body: some View { - Text("Hello") - } -} - - -// MARK: - Complications Preview -struct ComplicationViews_Previews: PreviewProvider { - static var previews: some View { - Group { - CLKComplicationTemplateGraphicRectangularFullView(ComplicationGraphicRectangularFullViewChart()) - .previewContext() - } - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/ContentView.swift --- a/LazyBearWatchOS Extension/ContentView.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -// -// ContentView.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 19/6/21. -// - -import SwiftUI - -struct ContentView: View { - var body: some View { - NavigationView { - VStack { - WatchOSProfileView() - } - .navigationTitle("Lazybear") - } - } -} - -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Info.plist --- a/LazyBearWatchOS Extension/Info.plist Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - LazyBearWatchOS Extension - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - CLKComplicationPrincipalClass - $(PRODUCT_MODULE_NAME).ComplicationController - NSExtension - - NSExtensionAttributes - - WKAppBundleIdentifier - dennis.LazyBear.watchkitapp - - NSExtensionPointIdentifier - com.apple.watchkit - - UIBackgroundModes - - remote-notification - - - diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/LazyBearApp.swift --- a/LazyBearWatchOS Extension/LazyBearApp.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -// -// LazyBearApp.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 19/6/21. -// - -import SwiftUI -import CoreData - -@main -struct LazyBearApp: App { - let persistenceController = PersistenceController.shared // Core Data init - - @SceneBuilder var body: some Scene { - WindowGroup { - ContentView() - .environment(\.managedObjectContext, persistenceController.container.viewContext) - } - - WKNotificationScene(controller: NotificationController.self, category: "myCategory") - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/LazyBearWatchOS Extension.entitlements --- a/LazyBearWatchOS Extension/LazyBearWatchOS Extension.entitlements Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ - - - - - aps-environment - development - com.apple.developer.icloud-container-identifiers - - iCloud.app.lazybear - - com.apple.developer.icloud-services - - CloudKit - - - diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/NotificationController.swift --- a/LazyBearWatchOS Extension/NotificationController.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -// -// NotificationController.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 19/6/21. -// - -import WatchKit -import SwiftUI -import UserNotifications - -class NotificationController: WKUserNotificationHostingController { - - override var body: NotificationView { - return NotificationView() - } - - override func willActivate() { - // This method is called when watch view controller is about to be visible to user - super.willActivate() - } - - override func didDeactivate() { - // This method is called when watch view controller is no longer visible - super.didDeactivate() - } - - override func didReceive(_ notification: UNNotification) { - // This method is called when a notification needs to be presented. - // Implement it if you use a dynamic notification interface. - // Populate your dynamic notification interface as quickly as possible. - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/NotificationView.swift --- a/LazyBearWatchOS Extension/NotificationView.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -// -// NotificationView.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 19/6/21. -// - -import SwiftUI - -struct NotificationView: View { - var body: some View { - Text("Hello, World!") - } -} - -struct NotificationView_Previews: PreviewProvider { - static var previews: some View { - NotificationView() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Preview Content/Preview Assets.xcassets/Contents.json --- a/LazyBearWatchOS Extension/Preview Content/Preview Assets.xcassets/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/PushNotificationPayload.apns --- a/LazyBearWatchOS Extension/PushNotificationPayload.apns Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -{ - "aps": { - "alert": { - "body": "Test message", - "title": "Optional title", - "subtitle": "Optional subtitle" - }, - "category": "myCategory", - "thread-id": "5280" - }, - - "WatchKit Simulator Actions": [ - { - "title": "First Button", - "identifier": "firstButtonAction" - } - ], - - "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App." -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Views/Helpers/WatchOSChartHelper.swift --- a/LazyBearWatchOS Extension/Views/Helpers/WatchOSChartHelper.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -// -// WatchOSChartHelper.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 27/06/2021. -// - -import SwiftUI -import StockCharts - -struct WatchOSChartHelper: View { - @ObservedObject var company: Company - - var body: some View { - VStack(alignment: .leading) { - if let quote = company.data.quote?.first { - if let latestPrice = quote.latestPrice, let changePercent = quote.changePercent { - Text("\(latestPrice, specifier: "%.2f")") - .font(.title) - .fontWeight(.semibold) - .foregroundColor(changePercent < 0 ? .red: .green) - - Text("\(changePercent * 100, specifier: "%.2f")%") - .fontWeight(.semibold) - .foregroundColor(changePercent < 0 ? .red: .green) - } - - if let historicalPrices = company.data.historicalPrices { - let prices = historicalPrices.compactMap { $0.close } - LineChartView(data: prices, dates: nil, hours: nil, dragGesture: false) - .padding(.top) - .frame(height: 90) - } - } - } - } -} - -struct StockView_Previews: PreviewProvider { - static var previews: some View { - WatchOSChartHelper(company: Company()) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Views/Helpers/WatchOSCompanyRow.swift --- a/LazyBearWatchOS Extension/Views/Helpers/WatchOSCompanyRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -// -// WatchOSCompanyRow.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 22/6/21. -// - -import SwiftUI - -struct WatchOSCompanyRow: View { - var company: CompanyModel - - var body: some View { - VStack(alignment: .leading) { - HStack { - Text(company.symbol.uppercased()) - .font(.caption2) - .fontWeight(.semibold) - - Spacer() - if let changePercent = company.changePercent { - VStack { - Text("\(changePercent * 100, specifier: "%.2f")%") - .foregroundColor(changePercent < 0 ? .red: .green) - } - } - } - - if let latestPrice = company.latestPrice { - Text("\(latestPrice, specifier: "%.2f")") - .foregroundColor(company.changePercent ?? 0.0 < 0 ? .red: .green) - .font(.title2) - } - } - .padding() - .background( - RoundedRectangle(cornerRadius: 10) - .foregroundColor(company.changePercent ?? 0.0 < 0 ? .red: .green) - .opacity(0.2) - ) - } -} - -struct WatchOSCompanyRow_Previews: PreviewProvider { - static var previews: some View { - WatchOSCompanyRow(company: - CompanyModel( - symbol: "aapl", - companyName: "Apple Inc", - latestPrice: 120.3, - changePercent: 0.03, - intradayPrices: [120.3] - ) - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Views/Helpers/WatchOSNewsDetail.swift --- a/LazyBearWatchOS Extension/Views/Helpers/WatchOSNewsDetail.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -// -// WatchOSNewsDetail.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 27/06/2021. -// - -import SwiftUI - -struct WatchOSNewsDetail: View { - var new: LatestNewsModel - - var body: some View { - ScrollView { - VStack(alignment: .leading) { - Text("\(convertEpoch(new.datetime, true)) ago") - .font(.footnote) - .opacity(0.5) - - Text(new.headline.capitalized) - .font(.headline) - .fontWeight(.semibold) - - Text(new.summary) - .font(.footnote) - } - } - } -} - -struct WatchOSNewsDetail_Previews: PreviewProvider { - static var previews: some View { - WatchOSNewsDetail( - new: LatestNewsModel( - datetime: 16210374, - headline: "Chaos Monkeys' author calls Apple's statement on his departure defamatory", - image: "https://cloud.iexapis.com/v1/news/image/99abeb99-6d9e-47c8-ae7b-53404eacccec", - source: "Investing.com", - summary: "https://www.investing.com/news/stock-market-news", - url: "https://bloomberg.com") - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Views/Helpers/WatchOSNewsList.swift --- a/LazyBearWatchOS Extension/Views/Helpers/WatchOSNewsList.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -// -// WatchOSNewsList.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 27/06/2021. -// - -import SwiftUI - -struct WatchOSNewsList: View { - var latestNews: [LatestNewsModel]? - - var body: some View { - VStack { - if let latestNews = latestNews { - List(latestNews, id: \.self) { new in - NavigationLink(destination: WatchOSNewsDetail(new: new) - .navigationTitle("News") - ) { - WatchOSNewsRow(new: new) - } - } - } else { - // Handle if there is no data - } - } - } -} - -struct WatchOSNewsList_Previews: PreviewProvider { - static var previews: some View { - WatchOSNewsList( - latestNews: [ - LatestNewsModel( - datetime: 1621037, - headline: "Chaos Monkeys' author calls Apple's statement on his departure defamatory", - image: "https://cloud.iexapis.com/v1/news/image/99abeb99-6d9e-47c8-ae7b-53404eacccec", - source: "Investing.com", - summary: "https://www.investing.com/news/stock-market-news", - url: "https://bloomberg.com") - ] - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Views/Helpers/WatchOSNewsRow.swift --- a/LazyBearWatchOS Extension/Views/Helpers/WatchOSNewsRow.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -// -// WatchOSNewsRow.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 27/06/2021. -// - -import SwiftUI - -struct WatchOSNewsRow: View { - var new: LatestNewsModel - - var body: some View { - HStack { - VStack(alignment: .leading) { - Text("\(convertEpoch(new.datetime, true)) ago") - .font(.footnote) - .opacity(0.5) - - Text(new.headline.capitalized) - .font(.headline) - .fontWeight(.semibold) - .fixedSize(horizontal: false, vertical: true) /// I need to add this to make lineLimit works correctly - .lineLimit(3) - } - } - } -} - -struct WatchOSNewsRow_Previews: PreviewProvider { - static var previews: some View { - WatchOSNewsRow( - new: LatestNewsModel( - datetime: 1621037, - headline: "Chaos Monkeys' author calls Apple's statement on his departure defamatory", - image: "https://cloud.iexapis.com/v1/news/image/99abeb99-6d9e-47c8-ae7b-53404eacccec", - source: "Investing.com", - summary: "https://www.investing.com/news/stock-market-news", - url: "https://bloomberg.com") - ) - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Views/WatchOSCompanyView.swift --- a/LazyBearWatchOS Extension/Views/WatchOSCompanyView.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -// -// WatchOSCompanyView.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 27/06/2021. -// - -import SwiftUI - -struct WatchOSCompanyView: View { - var symbol: String - @ObservedObject var company = Company() - @State private var timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() /// Set recurrent price request - - var body: some View { - if company.showView { - ScrollView { - VStack(alignment: .leading) { - Text(symbol) - .fontWeight(.semibold) - - WatchOSChartHelper(company: company) - .padding(.bottom) - - NavigationLink("Latest news", destination: WatchOSNewsList(latestNews: company.data.latestNews).navigationTitle("Latest news")) - - Text("Real-time data") - .font(.footnote) - .opacity(0.7) - .padding(.top) - } - .onAppear { self.timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() } /// Start timer - .onDisappear { self.timer.upstream.connect().cancel() } /// Stop timer - .onReceive(timer) { _ in company.request("https://api.lazybear.app/company/symbol=\(symbol)/type=initial/range=5d", .streaming) } - } - } else { - ProgressView() - .onAppear { - company.request("https://api.lazybear.app/company/symbol=\(symbol)/type=initial/range=5d/watch=true", .initial) - } - } - } -} - -struct WatchOSCompanyView_Previews: PreviewProvider { - static var previews: some View { - WatchOSCompanyView(symbol: "AAPL") - .navigationTitle("Apple Inc") - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS Extension/Views/WatchOSProfileView.swift --- a/LazyBearWatchOS Extension/Views/WatchOSProfileView.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -// -// WatchOSProfileView.swift -// LazyBearWatchOS Extension -// -// Created by Dennis Concepción Martín on 22/6/21. -// - -import SwiftUI -import CoreData - -struct WatchOSProfileView: View { - @ObservedObject var profile = Profile() - @FetchRequest(entity: WatchlistCompany.entity(), sortDescriptors: []) var watchlistCompanies: FetchedResults - @State private var timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() /// Set recurrent price request - - var body: some View { - if profile.showView { - ScrollView { - VStack { - if let companies = profile.data.quotes { - ForEach(companies, id: \.self) { company in - NavigationLink(destination: WatchOSCompanyView(symbol: company.symbol) - .navigationTitle(company.companyName.capitalized) - ) { - WatchOSCompanyRow(company: company) - } - .buttonStyle(PlainButtonStyle()) - } - } - } - .navigationTitle("Lazybear") - .onAppear { self.timer = Timer.publish(every: 10, on: .main, in: .common).autoconnect() } /// Start timer - .onDisappear { self.timer.upstream.connect().cancel() } /// Stop timer - .onReceive(timer) { _ in prepareUrl(.streaming) } - } - } else { - ProgressView() - .onAppear { prepareUrl(.initial) } - } - } - - /* - Get symbols in watchlists (Core Data) -> Prepare url -> Request - */ - private func prepareUrl(_ requestType: RequestType) { - let symbols = Set(watchlistCompanies.map { $0.symbol }) - let symbolsString = symbols.joined(separator:",") - - switch requestType { - case .initial: - let url = "https://api.lazybear.app/profile/type=initial/symbols=\(symbolsString)" - profile.request(url, .initial) - - default: - let url = "https://api.lazybear.app/profile/type=streaming/symbols=\(symbolsString)" - profile.request(url, .streaming) - } - } -} - -struct WatchOSProfileView_Previews: PreviewProvider { - static var previews: some View { - WatchOSProfileView() - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AccentColor.colorset/Contents.json --- a/LazyBearWatchOS/Assets.xcassets/AccentColor.colorset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/Contents.json --- a/LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_24pt@2x.png", - "idiom" : "watch", - "role" : "notificationCenter", - "scale" : "2x", - "size" : "24x24", - "subtype" : "38mm" - }, - { - "filename" : "icon_27,5pt@2x.png", - "idiom" : "watch", - "role" : "notificationCenter", - "scale" : "2x", - "size" : "27.5x27.5", - "subtype" : "42mm" - }, - { - "filename" : "icon_29pt@2x.png", - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "icon_29pt@3x.png", - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "icon_40pt@2x.png", - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "40x40", - "subtype" : "38mm" - }, - { - "filename" : "icon_44pt@2x.png", - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "44x44", - "subtype" : "40mm" - }, - { - "filename" : "icon_50pt@2x.png", - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "50x50", - "subtype" : "44mm" - }, - { - "filename" : "icon_86pt@2x.png", - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "86x86", - "subtype" : "38mm" - }, - { - "filename" : "icon_98pt@2x.png", - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "98x98", - "subtype" : "42mm" - }, - { - "filename" : "icon_108pt@2x.png", - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "108x108", - "subtype" : "44mm" - }, - { - "filename" : "icon_1024pt@1x.png", - "idiom" : "watch-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_1024pt@1x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_1024pt@1x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_108pt@2x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_108pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_24pt@2x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_24pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_27,5pt@2x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_27,5pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_29pt@2x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_29pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_29pt@3x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_29pt@3x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_40pt@2x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_40pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_44pt@2x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_44pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_50pt@2x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_50pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_86pt@2x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_86pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_98pt@2x.png Binary file LazyBearWatchOS/Assets.xcassets/AppIcon.appiconset/icon_98pt@2x.png has changed diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Assets.xcassets/Contents.json --- a/LazyBearWatchOS/Assets.xcassets/Contents.json Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOS/Info.plist --- a/LazyBearWatchOS/Info.plist Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Lazybear - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - WKCompanionAppBundleIdentifier - dennis.LazyBear - WKWatchKitApp - - - diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOSTests/Info.plist --- a/LazyBearWatchOSTests/Info.plist Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOSTests/LazyBearWatchOSTests.swift --- a/LazyBearWatchOSTests/LazyBearWatchOSTests.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -// -// LazyBearWatchOSTests.swift -// LazyBearWatchOSTests -// -// Created by Dennis Concepción Martín on 19/6/21. -// - -import XCTest -@testable import LazyBearWatchOS_WatchKit_Extension - -class LazyBearWatchOSTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() throws { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOSUITests/Info.plist --- a/LazyBearWatchOSUITests/Info.plist Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff -r daeac7c7c586 -r 783b567800d9 LazyBearWatchOSUITests/LazyBearWatchOSUITests.swift --- a/LazyBearWatchOSUITests/LazyBearWatchOSUITests.swift Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -// -// LazyBearWatchOSUITests.swift -// LazyBearWatchOSUITests -// -// Created by Dennis Concepción Martín on 19/6/21. -// - -import XCTest - -class LazyBearWatchOSUITests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - // UI tests must launch the application that they test. - let app = XCUIApplication() - app.launch() - - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testLaunchPerformance() throws { - if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { - // This measures how long it takes to launch your application. - measure(metrics: [XCTApplicationLaunchMetric()]) { - XCUIApplication().launch() - } - } - } -} diff -r daeac7c7c586 -r 783b567800d9 README.md --- a/README.md Mon Jul 12 11:04:34 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -# lazybear