From b225a492fc8272f37de5a5a0141452563fb8ae98 Mon Sep 17 00:00:00 2001 From: Gianni Carlo Date: Mon, 3 Jun 2024 23:14:30 -0500 Subject: [PATCH] Add support for second onboarding --- BookPlayer.xcodeproj/project.pbxproj | 108 +++++++ BookPlayer/AppDelegate.swift | 2 +- .../small-family-pic.imageset/Contents.json | 12 + .../small-family-picture.jpg | Bin 0 -> 174935 bytes .../Coordinators/LibraryListCoordinator.swift | 42 +++ .../Coordinators/LoginCoordinator.swift | 2 +- BookPlayer/Coordinators/MainCoordinator.swift | 13 +- .../ItemListViewController.swift | 4 +- .../ItemList Screen/ItemListViewModel.swift | 4 + .../Login Screen/LoginViewController.swift | 2 +- .../Profile/Login Screen/LoginViewModel.swift | 56 +++- .../SecondOnboardingCoordinator.swift | 79 +++++ .../SecondOnboardingResponse.swift | 20 ++ .../SecondOnboardingType.swift | 13 + .../StoryAccountSubscriptionService.swift | 32 ++ .../Support/SupportFlowCoordinator.swift | 132 ++++++++ .../Support/SupportProfileView.swift | 95 ++++++ .../Services/ListSyncRefreshService.swift | 1 + .../Icons Screen/IconsViewModel.swift | 4 +- BookPlayer/Settings/SettingsViewModel.swift | 2 +- .../Themes Screen/ThemesViewModel.swift | 4 +- BookPlayer/Utils/AlertPresenter.swift | 4 +- .../Utils/Views/StoryViewer/LoadingBar.swift | 36 +++ .../Views/StoryViewer/PricingBoxView.swift | 67 +++++ .../Views/StoryViewer/StoryActionView.swift | 147 +++++++++ .../StoryViewer/StoryBackgroundView.swift | 28 ++ .../Views/StoryViewer/StoryProgress.swift | 37 +++ .../StoryViewer/StorySkipControlsView.swift | 127 ++++++++ .../Utils/Views/StoryViewer/StoryView.swift | 155 ++++++++++ .../Views/StoryViewer/StoryViewModel.swift | 42 +++ .../Utils/Views/StoryViewer/StoryViewer.swift | 82 +++++ .../StoryViewer/StoryViewerViewModel.swift | 102 +++++++ .../ItemListCoordinatorTests.swift | 3 +- .../Mocks/AccountServiceMock.swift | 23 +- IAP-Configuration.storekit | 281 +++++++++++++++++- Shared/Services/Account/AccountAPI.swift | 11 + Shared/Services/Account/AccountService.swift | 62 +++- Shared/Services/Account/PricingModel.swift | 83 ++++++ Shared/Services/Events/EventsAPI.swift | 36 +++ Shared/Services/Events/EventsService.swift | 33 ++ Shared/Services/Sync/SyncService.swift | 3 +- Shared/Styleguide/Fonts.swift | 6 + Shared/Styleguide/Spacing.swift | 4 + 43 files changed, 1953 insertions(+), 46 deletions(-) create mode 100644 BookPlayer/Assets.xcassets/small-family-pic.imageset/Contents.json create mode 100644 BookPlayer/Assets.xcassets/small-family-pic.imageset/small-family-picture.jpg create mode 100644 BookPlayer/SecondOnboarding/SecondOnboardingCoordinator.swift create mode 100644 BookPlayer/SecondOnboarding/SecondOnboardingResponse.swift create mode 100644 BookPlayer/SecondOnboarding/SecondOnboardingType.swift create mode 100644 BookPlayer/SecondOnboarding/StoryAccountSubscriptionService.swift create mode 100644 BookPlayer/SecondOnboarding/Support/SupportFlowCoordinator.swift create mode 100644 BookPlayer/SecondOnboarding/Support/SupportProfileView.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/LoadingBar.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/PricingBoxView.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/StoryActionView.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/StoryBackgroundView.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/StoryProgress.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/StorySkipControlsView.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/StoryView.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/StoryViewModel.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/StoryViewer.swift create mode 100644 BookPlayer/Utils/Views/StoryViewer/StoryViewerViewModel.swift create mode 100644 Shared/Services/Events/EventsAPI.swift create mode 100644 Shared/Services/Events/EventsService.swift diff --git a/BookPlayer.xcodeproj/project.pbxproj b/BookPlayer.xcodeproj/project.pbxproj index 435c918bd..70b88b704 100644 --- a/BookPlayer.xcodeproj/project.pbxproj +++ b/BookPlayer.xcodeproj/project.pbxproj @@ -331,6 +331,10 @@ 6309F1272B0CF658002B86A4 /* BookPlaybackToggleIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6309F1252B0CF1C1002B86A4 /* BookPlaybackToggleIntent.swift */; }; 630F115E2AE7EEBA000A997A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 419B375B23B8D6DB00128A8F /* Localizable.strings */; }; 630F115F2AE7EECA000A997A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4140EA34227288EF0009F794 /* Assets.xcassets */; }; + 63125D0E2C36D84E00D35533 /* EventsAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63125D0D2C36D84E00D35533 /* EventsAPI.swift */; }; + 63125D0F2C36D84E00D35533 /* EventsAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63125D0D2C36D84E00D35533 /* EventsAPI.swift */; }; + 63125D122C36D97400D35533 /* EventsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63125D112C36D97400D35533 /* EventsService.swift */; }; + 63125D132C36D97400D35533 /* EventsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63125D112C36D97400D35533 /* EventsService.swift */; }; 631B360C2ABE8ACC001F4C1C /* BPModalOnlyPresentationFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631B360B2ABE8ACC001F4C1C /* BPModalOnlyPresentationFlow.swift */; }; 631C75C72AB92BE20013E7E5 /* BPCoordinatorPresentationFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631C75C62AB92BE20013E7E5 /* BPCoordinatorPresentationFlow.swift */; }; 631C75C92AB92C540013E7E5 /* BPPushPresentationFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631C75C82AB92C540013E7E5 /* BPPushPresentationFlow.swift */; }; @@ -346,6 +350,17 @@ 634BA5462C0BD0190015314D /* pride@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 634BA5442C0BD0180015314D /* pride@3x.png */; }; 634BA5492C0BD06B0015314D /* pride-ipad@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 634BA5472C0BD06B0015314D /* pride-ipad@3x.png */; }; 634BA54A2C0BD06B0015314D /* pride-ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 634BA5482C0BD06B0015314D /* pride-ipad@2x.png */; }; + 634BA54C2C0C21AF0015314D /* SecondOnboardingCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA54B2C0C21AF0015314D /* SecondOnboardingCoordinator.swift */; }; + 634BA58D2C14D5330015314D /* SecondOnboardingType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA58C2C14D5330015314D /* SecondOnboardingType.swift */; }; + 634BA5902C14FB730015314D /* StoryViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA58F2C14FB730015314D /* StoryViewer.swift */; }; + 634BA5932C160B890015314D /* LoadingBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA5922C160B890015314D /* LoadingBar.swift */; }; + 634BA5952C1611230015314D /* StoryProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA5942C1611230015314D /* StoryProgress.swift */; }; + 634BA5972C161FBE0015314D /* StoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA5962C161FBE0015314D /* StoryView.swift */; }; + 634BA5A12C174F9D0015314D /* StoryViewerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA5A02C174F9D0015314D /* StoryViewerViewModel.swift */; }; + 634BA5A32C17661D0015314D /* StoryBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA5A22C17661C0015314D /* StoryBackgroundView.swift */; }; + 634BA5A52C176B5A0015314D /* StoryActionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA5A42C176B5A0015314D /* StoryActionView.swift */; }; + 634BA5A72C1777BB0015314D /* PricingBoxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA5A62C1777BA0015314D /* PricingBoxView.swift */; }; + 634BA5AD2C180F5E0015314D /* StoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634BA5AC2C180F5E0015314D /* StoryViewModel.swift */; }; 634E67462AFC7DEF00595BAC /* BookStartPlaybackIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634E67432AFB2DF500595BAC /* BookStartPlaybackIntent.swift */; }; 6354CD9C2B4902CE006D9551 /* DebugInformationActivityItemSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6354CD9B2B4902CE006D9551 /* DebugInformationActivityItemSource.swift */; }; 6356F9B52AC7CC5600B7A027 /* CancelSleepTimerIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6356F9B42AC7CC5600B7A027 /* CancelSleepTimerIntent.swift */; }; @@ -388,7 +403,12 @@ 63B230452B8CCF1800AEECED /* SyncJobType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B230442B8CCF1800AEECED /* SyncJobType.swift */; }; 63B230462B8CCF1800AEECED /* SyncJobType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B230442B8CCF1800AEECED /* SyncJobType.swift */; }; 63B3B6902B1F625B007A367C /* StorageCloudDeletedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B3B68F2B1F625B007A367C /* StorageCloudDeletedView.swift */; }; + 63B407432C1B0CC1000A3B19 /* StorySkipControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B407422C1B0CC1000A3B19 /* StorySkipControlsView.swift */; }; 63B50F052B692E4200BCABBA /* ListSyncRefreshService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B50F042B692E4200BCABBA /* ListSyncRefreshService.swift */; }; + 63B760E82C31FFC600AA98C7 /* SupportFlowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B760E72C31FFC600AA98C7 /* SupportFlowCoordinator.swift */; }; + 63B760F72C32734000AA98C7 /* SecondOnboardingResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B760F62C32734000AA98C7 /* SecondOnboardingResponse.swift */; }; + 63B760F92C32738E00AA98C7 /* StoryAccountSubscriptionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B760F82C32738E00AA98C7 /* StoryAccountSubscriptionService.swift */; }; + 63B760FC2C33B77F00AA98C7 /* SupportProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B760FB2C33B77F00AA98C7 /* SupportProfileView.swift */; }; 63C1A8AF2B09158600C4B418 /* BookStartPlaybackIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634E67432AFB2DF500595BAC /* BookStartPlaybackIntent.swift */; }; 63C1A8B02B0915EE00C4B418 /* WidgetUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418445C2258AE11E0072DD13 /* WidgetUtils.swift */; }; 63C1A8B12B09165400C4B418 /* RecentBooksWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41ADD6D92570AC6300660C64 /* RecentBooksWidgetView.swift */; }; @@ -1070,6 +1090,8 @@ 6308260F2AF6C9B0002ACE0D /* SharedIconWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedIconWidget.swift; sourceTree = ""; }; 630826132AF6CA81002ACE0D /* SharedIconWidgetEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedIconWidgetEntry.swift; sourceTree = ""; }; 6309F1252B0CF1C1002B86A4 /* BookPlaybackToggleIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookPlaybackToggleIntent.swift; sourceTree = ""; }; + 63125D0D2C36D84E00D35533 /* EventsAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsAPI.swift; sourceTree = ""; }; + 63125D112C36D97400D35533 /* EventsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsService.swift; sourceTree = ""; }; 631B360B2ABE8ACC001F4C1C /* BPModalOnlyPresentationFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BPModalOnlyPresentationFlow.swift; sourceTree = ""; }; 631C75C62AB92BE20013E7E5 /* BPCoordinatorPresentationFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BPCoordinatorPresentationFlow.swift; sourceTree = ""; }; 631C75C82AB92C540013E7E5 /* BPPushPresentationFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BPPushPresentationFlow.swift; sourceTree = ""; }; @@ -1084,6 +1106,17 @@ 634BA5442C0BD0180015314D /* pride@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pride@3x.png"; sourceTree = ""; }; 634BA5472C0BD06B0015314D /* pride-ipad@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pride-ipad@3x.png"; sourceTree = ""; }; 634BA5482C0BD06B0015314D /* pride-ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pride-ipad@2x.png"; sourceTree = ""; }; + 634BA54B2C0C21AF0015314D /* SecondOnboardingCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondOnboardingCoordinator.swift; sourceTree = ""; }; + 634BA58C2C14D5330015314D /* SecondOnboardingType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondOnboardingType.swift; sourceTree = ""; }; + 634BA58F2C14FB730015314D /* StoryViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryViewer.swift; sourceTree = ""; }; + 634BA5922C160B890015314D /* LoadingBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingBar.swift; sourceTree = ""; }; + 634BA5942C1611230015314D /* StoryProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryProgress.swift; sourceTree = ""; }; + 634BA5962C161FBE0015314D /* StoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryView.swift; sourceTree = ""; }; + 634BA5A02C174F9D0015314D /* StoryViewerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryViewerViewModel.swift; sourceTree = ""; }; + 634BA5A22C17661C0015314D /* StoryBackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryBackgroundView.swift; sourceTree = ""; }; + 634BA5A42C176B5A0015314D /* StoryActionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryActionView.swift; sourceTree = ""; }; + 634BA5A62C1777BA0015314D /* PricingBoxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PricingBoxView.swift; sourceTree = ""; }; + 634BA5AC2C180F5E0015314D /* StoryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryViewModel.swift; sourceTree = ""; }; 634E67432AFB2DF500595BAC /* BookStartPlaybackIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookStartPlaybackIntent.swift; sourceTree = ""; }; 6354CD9B2B4902CE006D9551 /* DebugInformationActivityItemSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugInformationActivityItemSource.swift; sourceTree = ""; }; 6356F9B42AC7CC5600B7A027 /* CancelSleepTimerIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CancelSleepTimerIntent.swift; sourceTree = ""; }; @@ -1131,7 +1164,12 @@ 63B230412B8CCE8600AEECED /* Realm+BookPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Realm+BookPlayer.swift"; sourceTree = ""; }; 63B230442B8CCF1800AEECED /* SyncJobType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncJobType.swift; sourceTree = ""; }; 63B3B68F2B1F625B007A367C /* StorageCloudDeletedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageCloudDeletedView.swift; sourceTree = ""; }; + 63B407422C1B0CC1000A3B19 /* StorySkipControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorySkipControlsView.swift; sourceTree = ""; }; 63B50F042B692E4200BCABBA /* ListSyncRefreshService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListSyncRefreshService.swift; sourceTree = ""; }; + 63B760E72C31FFC600AA98C7 /* SupportFlowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportFlowCoordinator.swift; sourceTree = ""; }; + 63B760F62C32734000AA98C7 /* SecondOnboardingResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondOnboardingResponse.swift; sourceTree = ""; }; + 63B760F82C32738E00AA98C7 /* StoryAccountSubscriptionService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryAccountSubscriptionService.swift; sourceTree = ""; }; + 63B760FB2C33B77F00AA98C7 /* SupportProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportProfileView.swift; sourceTree = ""; }; 63C6C2E52B5029BC00FFE0D8 /* SettingsAutolockView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsAutolockView.swift; sourceTree = ""; }; 63C6C2E72B5029FE00FFE0D8 /* SettingsAutolockViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsAutolockViewModel.swift; sourceTree = ""; }; 63C6C30B2B538B7A00FFE0D8 /* SyncTasksStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncTasksStorage.swift; sourceTree = ""; }; @@ -1649,6 +1687,7 @@ 418B6CFA1D2707F800F974FB /* BookPlayer */ = { isa = PBXGroup; children = ( + 634BA58B2C14D5100015314D /* SecondOnboarding */, 4151A6DE26E4A13E00E49DBE /* Coordinators */, 69343D3121338440000C425E /* Services */, C3A479112094C8A800D92122 /* Utils */, @@ -2049,6 +2088,7 @@ 62AAE22B274AA3EB001EB9FF /* LibraryService.swift */, 9FDDD2E0289BFCE20020C428 /* LibraryService+Sync.swift */, 41EB071A2752FA6B00EFEE13 /* PlaybackService.swift */, + 63125D102C36D96800D35533 /* Events */, 9FC1E4612814F68F00522FA8 /* Account */, 9FD8FE4C286566FF00EB2C3D /* Sync */, ); @@ -2095,6 +2135,15 @@ path = SharedIconWidget; sourceTree = ""; }; + 63125D102C36D96800D35533 /* Events */ = { + isa = PBXGroup; + children = ( + 63125D0D2C36D84E00D35533 /* EventsAPI.swift */, + 63125D112C36D97400D35533 /* EventsService.swift */, + ); + path = Events; + sourceTree = ""; + }; 631C75CA2AB92C5C0013E7E5 /* PresentationFlow */ = { isa = PBXGroup; children = ( @@ -2106,6 +2155,44 @@ path = PresentationFlow; sourceTree = ""; }; + 634BA58B2C14D5100015314D /* SecondOnboarding */ = { + isa = PBXGroup; + children = ( + 634BA58E2C14FB010015314D /* Support */, + 634BA58C2C14D5330015314D /* SecondOnboardingType.swift */, + 63B760F62C32734000AA98C7 /* SecondOnboardingResponse.swift */, + 63B760F82C32738E00AA98C7 /* StoryAccountSubscriptionService.swift */, + 634BA54B2C0C21AF0015314D /* SecondOnboardingCoordinator.swift */, + ); + path = SecondOnboarding; + sourceTree = ""; + }; + 634BA58E2C14FB010015314D /* Support */ = { + isa = PBXGroup; + children = ( + 63B760E72C31FFC600AA98C7 /* SupportFlowCoordinator.swift */, + 63B760FB2C33B77F00AA98C7 /* SupportProfileView.swift */, + ); + path = Support; + sourceTree = ""; + }; + 634BA5912C160B720015314D /* StoryViewer */ = { + isa = PBXGroup; + children = ( + 634BA5A02C174F9D0015314D /* StoryViewerViewModel.swift */, + 634BA5AC2C180F5E0015314D /* StoryViewModel.swift */, + 634BA58F2C14FB730015314D /* StoryViewer.swift */, + 634BA5A22C17661C0015314D /* StoryBackgroundView.swift */, + 634BA5962C161FBE0015314D /* StoryView.swift */, + 63B407422C1B0CC1000A3B19 /* StorySkipControlsView.swift */, + 634BA5A42C176B5A0015314D /* StoryActionView.swift */, + 634BA5A62C1777BA0015314D /* PricingBoxView.swift */, + 634BA5922C160B890015314D /* LoadingBar.swift */, + 634BA5942C1611230015314D /* StoryProgress.swift */, + ); + path = StoryViewer; + sourceTree = ""; + }; 6356F9C82AC89F1600B7A027 /* AppIntents */ = { isa = PBXGroup; children = ( @@ -2585,6 +2672,7 @@ 9F1804B727A4AEC500FEDFE5 /* AccessibleSliderView.swift */, 9F22DE3F288D8BC800056FCD /* BaseLabel.swift */, 9FB20EB629A423410021663B /* InterfaceUpdater.swift */, + 634BA5912C160B720015314D /* StoryViewer */, ); path = Views; sourceTree = ""; @@ -3233,6 +3321,7 @@ 41A90C4927564DAA00C30394 /* BookPlayerError.swift in Sources */, 41C23402272E1960006BC7B8 /* SimpleTheme.swift in Sources */, 638E64CF2B8E1CFD00DCFA3B /* SyncTasksCountService.swift in Sources */, + 63125D132C36D97400D35533 /* EventsService.swift in Sources */, 4140EA7D227289CB0009F794 /* LibraryItem+CoreDataProperties.swift in Sources */, 63B230462B8CCF1800AEECED /* SyncJobType.swift in Sources */, 4140EA73227289A80009F794 /* Notification+BookPlayerKit.swift in Sources */, @@ -3265,6 +3354,7 @@ 4140EA7A227289C20009F794 /* Book+CoreDataClass.swift in Sources */, 9F49072D2903663800054AD6 /* SortType.swift in Sources */, 6357F11A2A8BA084007947FC /* BPURLSession.swift in Sources */, + 63125D0F2C36D84E00D35533 /* EventsAPI.swift in Sources */, 9FBDBC7E287940D900D315A2 /* ContentsResponse.swift in Sources */, 63B2303E2B8CCDFD00AEECED /* MigrationStoredSyncTasks.swift in Sources */, 4140EA7C227289C70009F794 /* LibraryItem+CoreDataClass.swift in Sources */, @@ -3349,12 +3439,14 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 634BA58D2C14D5330015314D /* SecondOnboardingType.swift in Sources */, 9F82DF9C27DFE46B001B0EA8 /* PhoneWatchConnectivityService.swift in Sources */, 9F00A600295001C0005EA316 /* ItemDetailsArtworkSectionView.swift in Sources */, 410D0FF11EDF659900A52EB9 /* PlayerManager.swift in Sources */, 41AD3DAF221E678600DC41E1 /* PlusViewController.swift in Sources */, 9F4691F02800C97000A8F0E8 /* CompleteAccountViewModel.swift in Sources */, 9F2681AD2888B26100359BD3 /* LoginBenefitView.swift in Sources */, + 634BA5A72C1777BB0015314D /* PricingBoxView.swift in Sources */, 9F588DBF2902C798000DA799 /* ComposedButton.swift in Sources */, 41B2A5F121CD857800917584 /* AddCellView.swift in Sources */, 4151A6B326E491A800E49DBE /* NibLoadableView.swift in Sources */, @@ -3390,6 +3482,7 @@ 63C1A8B02B0915EE00C4B418 /* WidgetUtils.swift in Sources */, 41B2A5ED21CCC6D100917584 /* AppNavigationController.swift in Sources */, 9F22DE40288D8BC800056FCD /* BaseLabel.swift in Sources */, + 63B407432C1B0CC1000A3B19 /* StorySkipControlsView.swift in Sources */, 41B2AC8E1D43CCE8005382A9 /* ChaptersViewController.swift in Sources */, 9FBDDB8927DC454B005FB447 /* AppTabBarController.swift in Sources */, 9F4A0F782839574B00F9C959 /* PlayerSettingsViewModel.swift in Sources */, @@ -3410,6 +3503,7 @@ C375AF1920DD99E000AC034D /* ArtworkControl.swift in Sources */, 41544A1421BAF41400740AD2 /* ItemSelectionViewController.swift in Sources */, 9F5011F92A6580800075FEBA /* ShakeMotionService.swift in Sources */, + 634BA5932C160B890015314D /* LoadingBar.swift in Sources */, 9F64C6242793C3DA00B2493C /* PlayerControlsViewModel.swift in Sources */, 6356F9B52AC7CC5600B7A027 /* CancelSleepTimerIntent.swift in Sources */, 6356F9C12AC823EE00B7A027 /* LastBookStartPlaybackIntent.swift in Sources */, @@ -3420,16 +3514,20 @@ 41188D2826ED4D5C0017124E /* ItemListViewController.swift in Sources */, 41188D2426ED2BA30017124E /* LoadingCoordinator.swift in Sources */, 4151A6DD26E4A13A00E49DBE /* MainCoordinator.swift in Sources */, + 634BA54C2C0C21AF0015314D /* SecondOnboardingCoordinator.swift in Sources */, 63C6C2E62B5029BC00FFE0D8 /* SettingsAutolockView.swift in Sources */, 41964C832220B4F700FF1A2F /* ContributorCellView.swift in Sources */, 4124122826D19A8700B099DB /* StorageViewModel.swift in Sources */, 4158387926EB8D8800F4A12B /* LoadingViewController.swift in Sources */, 6356F9D02ACB01C700B7A027 /* PausePlaybackIntent.swift in Sources */, + 634BA5952C1611230015314D /* StoryProgress.swift in Sources */, 4151A6E026E4A17900E49DBE /* Coordinator.swift in Sources */, 9FF710BB2A215558006490E0 /* QueuedSyncTasksViewModel.swift in Sources */, 418EA78B268D6EF100F6BAEB /* ImportTableViewCell.swift in Sources */, 9F2DC9D92A008B19006CDF1F /* PricingOptionsView.swift in Sources */, + 634BA5902C14FB730015314D /* StoryViewer.swift in Sources */, 41188D2026ECDDD50017124E /* BookmarkCoordinator.swift in Sources */, + 634BA5A12C174F9D0015314D /* StoryViewerViewModel.swift in Sources */, 4142964921F2E2BA004356DA /* ThemeCellView.swift in Sources */, 9F4691F72800F85600A8F0E8 /* AccountViewModel.swift in Sources */, 4160A0A123F304530039166B /* LocalizableLabel.swift in Sources */, @@ -3441,6 +3539,7 @@ D6BA8F162A4CA94800C2BD9A /* StorageRowView.swift in Sources */, 9F3C436A284181690066D99A /* DataInitializerCoordinator.swift in Sources */, 9F3C436B284181C70066D99A /* AlertPresenter.swift in Sources */, + 63B760FC2C33B77F00AA98C7 /* SupportProfileView.swift in Sources */, 9F00A6212950F44B005EA316 /* ImagePicker.swift in Sources */, 9F00A6242951F2F3005EA316 /* ItemDetailsFormViewModel.swift in Sources */, 41DA44BD26FAEC4F00F3A05D /* BookActivityItemProvider.swift in Sources */, @@ -3448,6 +3547,7 @@ 4138CE1C26E5B42F0014F11E /* BookmarksViewModel.swift in Sources */, 9F3D0CE528C2BF5C00E9E8A3 /* ButtonFreeViewController.swift in Sources */, 4197240021874D5F00AB1190 /* UserActivityManager.swift in Sources */, + 634BA5972C161FBE0015314D /* StoryView.swift in Sources */, 41D4F2EF21053944009F1B1E /* IndexPath+BookPlayer.swift in Sources */, 6356F9C52AC86D9200B7A027 /* BPAppShortcuts.swift in Sources */, 69343D332133844D000C425E /* VoiceOverService.swift in Sources */, @@ -3465,6 +3565,7 @@ 418CABB125EF28FC00D8C878 /* MappingModel_v3_to_v4.xcmappingmodel in Sources */, 63C6C2E82B5029FE00FFE0D8 /* SettingsAutolockViewModel.swift in Sources */, 410D00FA26DDCE6C00D11A45 /* ChaptersViewModel.swift in Sources */, + 63B760F72C32734000AA98C7 /* SecondOnboardingResponse.swift in Sources */, 41640A3724416EE8004FB97B /* Intents.intentdefinition in Sources */, 41AD3DA1221C7CAB00DC41E1 /* Icon.swift in Sources */, 9F22DE3C288D7D4300056FCD /* AccountSectionContainerView.swift in Sources */, @@ -3480,6 +3581,7 @@ 9FEC87B027FA9F0F006C71D5 /* LoginViewController.swift in Sources */, 9F00A5FA294F8BFE005EA316 /* ClearableTextField.swift in Sources */, 9F5FBB08293EDCD8009F4B0E /* ItemDetailsViewController.swift in Sources */, + 634BA5AD2C180F5E0015314D /* StoryViewModel.swift in Sources */, 9F2681B628898A7300359BD3 /* LoginDisclaimerView.swift in Sources */, 63C1A8B12B09165400C4B418 /* RecentBooksWidgetView.swift in Sources */, 9FD8D95829DC53750074C2D8 /* CoreServices.swift in Sources */, @@ -3513,11 +3615,13 @@ 9F2DA27F27F0C68D00C8EF2B /* CarPlaySceneDelegate.swift in Sources */, 4193E202243A91AE004D6A82 /* ActionParserService.swift in Sources */, 41A359C3276232E00020D5F5 /* MappingModel_v7_to_v8.xcmappingmodel in Sources */, + 63B760F92C32738E00AA98C7 /* StoryAccountSubscriptionService.swift in Sources */, 9F5F12DB2976E8CD00F061A0 /* ProfileView.swift in Sources */, 41C8ABD126836F50003B67D1 /* ImportViewModel.swift in Sources */, 41188D1E26ECDAA30017124E /* MiniPlayerViewModel.swift in Sources */, 41B2A5DE21CAF20E00917584 /* ThemesViewController.swift in Sources */, 41D20DAF25D5F5A100AAEE30 /* MappingModel_v1_to_v2.xcmappingmodel in Sources */, + 634BA5A32C17661D0015314D /* StoryBackgroundView.swift in Sources */, 9FF383D12A40F97000BBAC11 /* MappingModel_v8_to_v9.xcmappingmodel in Sources */, 63B3B6902B1F625B007A367C /* StorageCloudDeletedView.swift in Sources */, 9F134605293D0A410089B1DE /* ThemeViewModel.swift in Sources */, @@ -3529,9 +3633,11 @@ 63B50F052B692E4200BCABBA /* ListSyncRefreshService.swift in Sources */, 416A297D2568671F00605395 /* AVPlayer+BookPlayer.swift in Sources */, 41E79BEB26C60DC600EA9FFF /* PlayerViewModel.swift in Sources */, + 634BA5A52C176B5A0015314D /* StoryActionView.swift in Sources */, 635907A02B161B14002FA524 /* DebugInformationFileActivityItemProvider.swift in Sources */, 9F5FBB0A293EE0C2009F4B0E /* ItemDetailsViewModel.swift in Sources */, 6309F1262B0CF1C1002B86A4 /* BookPlaybackToggleIntent.swift in Sources */, + 63B760E82C31FFC600AA98C7 /* SupportFlowCoordinator.swift in Sources */, 9FC1A29F28C0D8CC00F25906 /* BookmarksActivityItemProvider.swift in Sources */, D6BA8F182A4D66CD00C2BD9A /* StorageView.swift in Sources */, 9F64C6212793C31600B2493C /* PlayerControlsCoordinator.swift in Sources */, @@ -3588,6 +3694,7 @@ 4124AB2125DFE1A60007C839 /* CoreDataStack.swift in Sources */, 41A1B11F226F88C500EA0400 /* Chapter+CoreDataClass.swift in Sources */, 4138CE1626E584B60014F11E /* BookmarkType.swift in Sources */, + 63125D0E2C36D84E00D35533 /* EventsAPI.swift in Sources */, 412AB7092701421600969618 /* ManualOrderMigrationUtils.swift in Sources */, 9F1345B82938DF360089B1DE /* UIFont+BookPlayer.swift in Sources */, 639AC98C2AD9F2840053AFC6 /* BPTaskDownloadDelegate.swift in Sources */, @@ -3608,6 +3715,7 @@ 639E12DB2B8AC65B00C875F7 /* RealmMigrationManager.swift in Sources */, 41A1B124226F88C500EA0400 /* Book+CoreDataProperties.swift in Sources */, 41A1B108226E9DF800EA0400 /* DataManager.swift in Sources */, + 63125D122C36D97400D35533 /* EventsService.swift in Sources */, 41A1B131226FE33500EA0400 /* Constants.swift in Sources */, 4124AB1725DFE07E0007C839 /* DataMigrationManager.swift in Sources */, 9FDDD2DE289BEE590020C428 /* SyncJobScheduler.swift in Sources */, diff --git a/BookPlayer/AppDelegate.swift b/BookPlayer/AppDelegate.swift index f8327a1c3..2f8d8f445 100644 --- a/BookPlayer/AppDelegate.swift +++ b/BookPlayer/AppDelegate.swift @@ -130,7 +130,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, BPLogger { syncService = sharedSyncService } else { syncService = SyncService( - isActive: accountService.hasActiveSubscription(), + isActive: accountService.hasSyncEnabled(), libraryService: libraryService ) AppDelegate.shared?.syncService = syncService diff --git a/BookPlayer/Assets.xcassets/small-family-pic.imageset/Contents.json b/BookPlayer/Assets.xcassets/small-family-pic.imageset/Contents.json new file mode 100644 index 000000000..cce15b503 --- /dev/null +++ b/BookPlayer/Assets.xcassets/small-family-pic.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "small-family-picture.jpg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BookPlayer/Assets.xcassets/small-family-pic.imageset/small-family-picture.jpg b/BookPlayer/Assets.xcassets/small-family-pic.imageset/small-family-picture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec35f1f581fe4b580fdbc23fbd6ea5910079231b GIT binary patch literal 174935 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

`% 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 literal 0 HcmV?d00001 diff --git a/BookPlayer/Coordinators/LibraryListCoordinator.swift b/BookPlayer/Coordinators/LibraryListCoordinator.swift index 1a157ad2f..8f22401a3 100644 --- a/BookPlayer/Coordinators/LibraryListCoordinator.swift +++ b/BookPlayer/Coordinators/LibraryListCoordinator.swift @@ -19,9 +19,35 @@ class LibraryListCoordinator: ItemListCoordinator, UINavigationControllerDelegat weak var importCoordinator: ImportCoordinator? /// Reference to ongoing library fetch task var contentsFetchTask: Task<(), Error>? + /// Account service + let accountService: AccountServiceProtocol private var disposeBag = Set() + /// Initializer + init( + flow: BPCoordinatorPresentationFlow, + playerManager: PlayerManagerProtocol, + libraryService: LibraryServiceProtocol, + playbackService: PlaybackServiceProtocol, + syncService: SyncServiceProtocol, + importManager: ImportManager, + listRefreshService: ListSyncRefreshService, + accountService: AccountServiceProtocol + ) { + self.accountService = accountService + + super.init( + flow: flow, + playerManager: playerManager, + libraryService: libraryService, + playbackService: playbackService, + syncService: syncService, + importManager: importManager, + listRefreshService: listRefreshService + ) + } + // swiftlint:disable:next function_body_length override func start() { let vc = ItemListViewController.instantiate(from: .Main) @@ -84,6 +110,7 @@ class LibraryListCoordinator: ItemListCoordinator, UINavigationControllerDelegat func handleLibraryLoaded() { loadLastBookIfNeeded() syncList() + showSecondOnboarding() bindImportObserverIfNeeded() bindDownloadErrorObserver() @@ -94,6 +121,21 @@ class LibraryListCoordinator: ItemListCoordinator, UINavigationControllerDelegat } } + func showSecondOnboarding() { + guard let anonymousId = accountService.getAnonymousId() else { return } + + let coordinator = SecondOnboardingCoordinator( + flow: .modalOnlyFlow( + presentingController: flow.navigationController, + modalPresentationStyle: .fullScreen + ), + anonymousId: anonymousId, + accountService: accountService, + eventsService: EventsService() + ) + coordinator.start() + } + func bindImportObserverIfNeeded() { guard fileSubscription == nil, diff --git a/BookPlayer/Coordinators/LoginCoordinator.swift b/BookPlayer/Coordinators/LoginCoordinator.swift index 855473666..e0d2f68cd 100644 --- a/BookPlayer/Coordinators/LoginCoordinator.swift +++ b/BookPlayer/Coordinators/LoginCoordinator.swift @@ -29,7 +29,7 @@ class LoginCoordinator: Coordinator, AlertPresenter { func start() { let viewModel = LoginViewModel(accountService: self.accountService) - viewModel.coordinator = self + viewModel.alertPresenter = self viewModel.onTransition = { routes in switch routes { case .completeAccount: diff --git a/BookPlayer/Coordinators/MainCoordinator.swift b/BookPlayer/Coordinators/MainCoordinator.swift index 206d1cefa..dc16b8612 100644 --- a/BookPlayer/Coordinators/MainCoordinator.swift +++ b/BookPlayer/Coordinators/MainCoordinator.swift @@ -91,7 +91,8 @@ class MainCoordinator: NSObject { listRefreshService: ListSyncRefreshService( playerManager: playerManager, syncService: syncService - ) + ), + accountService: self.accountService ) playerManager.syncProgressDelegate = libraryCoordinator self.libraryCoordinator = libraryCoordinator @@ -127,17 +128,19 @@ class MainCoordinator: NSObject { .sink(receiveValue: { [weak self] _ in guard let self = self, - let account = self.accountService.getAccount() + self.accountService.hasAccount() else { return } - if account.hasSubscription, !account.id.isEmpty { + if self.accountService.hasSyncEnabled() { if !self.syncService.isActive { self.syncService.isActive = true self.getLibraryCoordinator()?.syncList() } } else { - self.syncService.isActive = false - self.syncService.cancelAllJobs() + if self.syncService.isActive { + self.syncService.isActive = false + self.syncService.cancelAllJobs() + } } }) diff --git a/BookPlayer/Library/ItemList Screen/ItemListViewController.swift b/BookPlayer/Library/ItemList Screen/ItemListViewController.swift index 6ca6f6e60..eefbbe7dd 100644 --- a/BookPlayer/Library/ItemList Screen/ItemListViewController.swift +++ b/BookPlayer/Library/ItemList Screen/ItemListViewController.swift @@ -217,7 +217,7 @@ class ItemListViewController: UIViewController, MVVMControllerProtocol, Storyboa do { try await viewModel.refreshAppState() tableView.refreshControl?.endRefreshing() - } catch { + } catch BPSyncRefreshError.scheduledTasks { tableView.refreshControl?.endRefreshing() /// Allow the refresh animation to complete and avoid jumping when showing the alert @@ -235,6 +235,8 @@ class ItemListViewController: UIViewController, MVVMControllerProtocol, Storyboa ] )) } + } catch { + tableView.refreshControl?.endRefreshing() } } } diff --git a/BookPlayer/Library/ItemList Screen/ItemListViewModel.swift b/BookPlayer/Library/ItemList Screen/ItemListViewModel.swift index f80535a78..e5fa6a8f3 100644 --- a/BookPlayer/Library/ItemList Screen/ItemListViewModel.swift +++ b/BookPlayer/Library/ItemList Screen/ItemListViewModel.swift @@ -979,6 +979,10 @@ class ItemListViewModel: ViewModelProtocol { /// Check if there's any pending file to import await coordinator.getMainCoordinator()?.getLibraryCoordinator()?.notifyPendingFiles() + guard syncService.isActive else { + throw BPSyncRefreshError.disabled + } + guard await syncService.queuedJobsCount() == 0 else { throw BPSyncRefreshError.scheduledTasks } diff --git a/BookPlayer/Profile/Login Screen/LoginViewController.swift b/BookPlayer/Profile/Login Screen/LoginViewController.swift index 4a6115ae5..dee5a826b 100644 --- a/BookPlayer/Profile/Login Screen/LoginViewController.swift +++ b/BookPlayer/Profile/Login Screen/LoginViewController.swift @@ -11,7 +11,7 @@ import BookPlayerKit import Foundation import Themeable -class LoginViewController: UIViewController, MVVMControllerProtocol { +class LoginViewController: UIViewController { var viewModel: LoginViewModel! // MARK: - UI components diff --git a/BookPlayer/Profile/Login Screen/LoginViewModel.swift b/BookPlayer/Profile/Login Screen/LoginViewModel.swift index e362cddcc..668c2a238 100644 --- a/BookPlayer/Profile/Login Screen/LoginViewModel.swift +++ b/BookPlayer/Profile/Login Screen/LoginViewModel.swift @@ -10,7 +10,12 @@ import AuthenticationServices import BookPlayerKit import Foundation -class LoginViewModel: ViewModelProtocol { +protocol LoginViewModelProtocol: ObservableObject { + func handleSignIn(authorization: ASAuthorization) + func dismiss() +} + +class LoginViewModel: LoginViewModelProtocol { enum Routes { case completeAccount case dismiss @@ -18,7 +23,7 @@ class LoginViewModel: ViewModelProtocol { var onTransition: BPTransition? - weak var coordinator: LoginCoordinator! + weak var alertPresenter: AlertPresenter! let accountService: AccountServiceProtocol init(accountService: AccountServiceProtocol) { @@ -27,14 +32,27 @@ class LoginViewModel: ViewModelProtocol { /// This should only be used when running the app in the simulator func setupTestAccount() { - do { - let token: String = Bundle.main.configurationValue(for: .mockedBearerToken) - try self.accountService.loginTestAccount(token: token) - } catch { - self.coordinator.showError(error) - } + Task { + await MainActor.run { [weak self] in + self?.alertPresenter.showLoader() + } + do { + let token: String = Bundle.main.configurationValue(for: .mockedBearerToken) + try await self.accountService.loginTestAccount(token: token) + await MainActor.run { [weak self] in + self?.alertPresenter.stopLoader() + } + } catch { + await MainActor.run { [weak self, error] in + self?.alertPresenter.stopLoader() + self?.handleError(error) + } + } - onTransition?(.completeAccount) + await MainActor.run { [weak self] in + self?.onTransition?(.completeAccount) + } + } } func handleSignIn(authorization: ASAuthorization) { @@ -44,13 +62,13 @@ class LoginViewModel: ViewModelProtocol { let tokenData = appleIDCredential.identityToken, let token = String(data: tokenData, encoding: .utf8) else { - self.coordinator.showError(AccountError.missingToken) + handleError(AccountError.missingToken) return } Task { [weak self, accountService, token, appleIDCredential] in await MainActor.run { [weak self] in - self?.coordinator.showLoader() + self?.alertPresenter.showLoader() } do { @@ -60,7 +78,7 @@ class LoginViewModel: ViewModelProtocol { ) await MainActor.run { [weak self, account] in - self?.coordinator.stopLoader() + self?.alertPresenter.stopLoader() if let account = account, !account.hasSubscription { @@ -71,8 +89,8 @@ class LoginViewModel: ViewModelProtocol { } } catch { await MainActor.run { [weak self, error] in - self?.coordinator.stopLoader() - self?.coordinator.showError(error) + self?.alertPresenter.stopLoader() + self?.handleError(error) } } } @@ -83,6 +101,14 @@ class LoginViewModel: ViewModelProtocol { } func handleError(_ error: Error) { - self.coordinator.showError(error) + alertPresenter.showAlert( + "error_title".localized, + message: error.localizedDescription, + completion: nil + ) + } + + func dismiss() { + onTransition?(.dismiss) } } diff --git a/BookPlayer/SecondOnboarding/SecondOnboardingCoordinator.swift b/BookPlayer/SecondOnboarding/SecondOnboardingCoordinator.swift new file mode 100644 index 000000000..aab15e591 --- /dev/null +++ b/BookPlayer/SecondOnboarding/SecondOnboardingCoordinator.swift @@ -0,0 +1,79 @@ +// +// SecondOnboardingCoordinator.swift +// BookPlayer +// +// Created by Gianni Carlo on 1/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import BookPlayerKit +import Foundation +import SwiftUI + +/// Handle second onboarding flows +class SecondOnboardingCoordinator: Coordinator { + let anonymousId: String + let accountService: AccountServiceProtocol + let eventsService: EventsServiceProtocol + let flow: BPCoordinatorPresentationFlow + unowned var presentedController: UIViewController? + + init( + flow: BPCoordinatorPresentationFlow, + anonymousId: String, + accountService: AccountServiceProtocol, + eventsService: EventsServiceProtocol + ) { + self.flow = flow + self.anonymousId = anonymousId + self.accountService = accountService + self.eventsService = eventsService + } + + func start() { + Task { + let response: SecondOnboardingResponse = try await accountService.getSecondOnboarding() + + await showOnboarding(data: response) + } + } + + @MainActor + func showOnboarding(data: SecondOnboardingResponse) { + switch data.type { + case .support: + let coordinator = SupportFlowCoordinator( + flow: flow, + anonymousId: anonymousId, + onboardingId: data.onboardingId, + stories: data.support, + accountService: accountService, + eventsService: eventsService + ) + coordinator.start() + } + } + + func showAlert(_ content: BPAlertContent) { + presentedController?.showAlert(content) + } + + func showLoader() { + if let vc = presentedController { + LoadingUtils.loadAndBlock(in: vc) + } + } + + func stopLoader() { + if let vc = presentedController { + LoadingUtils.stopLoading(in: vc) + } + } + + func showCongrats() { + presentedController?.view.startConfetti() + presentedController?.showAlert("thanks_amazing_title".localized, message: nil) { [weak self] in + self?.flow.finishPresentation(animated: true) + } + } +} diff --git a/BookPlayer/SecondOnboarding/SecondOnboardingResponse.swift b/BookPlayer/SecondOnboarding/SecondOnboardingResponse.swift new file mode 100644 index 000000000..8ddd6dccf --- /dev/null +++ b/BookPlayer/SecondOnboarding/SecondOnboardingResponse.swift @@ -0,0 +1,20 @@ +// +// SecondOnboardingResponse.swift +// BookPlayer +// +// Created by Gianni Carlo on 1/7/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import Foundation + +struct SecondOnboardingResponse: Codable { + let onboardingId: String + let type: SecondOnboardingType + let support: [StoryViewModel] + + enum CodingKeys: String, CodingKey { + case type, support + case onboardingId = "onboarding_id" + } +} diff --git a/BookPlayer/SecondOnboarding/SecondOnboardingType.swift b/BookPlayer/SecondOnboarding/SecondOnboardingType.swift new file mode 100644 index 000000000..a438ce2da --- /dev/null +++ b/BookPlayer/SecondOnboarding/SecondOnboardingType.swift @@ -0,0 +1,13 @@ +// +// SecondOnboardingType.swift +// BookPlayer +// +// Created by Gianni Carlo on 8/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import Foundation + +enum SecondOnboardingType: String, Codable { + case support +} diff --git a/BookPlayer/SecondOnboarding/StoryAccountSubscriptionService.swift b/BookPlayer/SecondOnboarding/StoryAccountSubscriptionService.swift new file mode 100644 index 000000000..dc64903eb --- /dev/null +++ b/BookPlayer/SecondOnboarding/StoryAccountSubscriptionService.swift @@ -0,0 +1,32 @@ +// +// StoryAccountSubscriptionService.swift +// BookPlayer +// +// Created by Gianni Carlo on 1/7/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import BookPlayerKit +import Foundation + +protocol StoryAccountSubscriptionProtocol { + func hasAccount() -> Bool + func subscribe(option: PricingOption) async throws -> Bool + func getSecondOnboarding() async throws -> T +} + +struct StoryAccountSubscriptionService: StoryAccountSubscriptionProtocol { + var accountService: AccountServiceProtocol + + func hasAccount() -> Bool { + return accountService.hasAccount() + } + + func subscribe(option: PricingOption) async throws -> Bool { + return try await accountService.subscribe(option: option) + } + + func getSecondOnboarding() async throws -> T { + return try await accountService.getSecondOnboarding() + } +} diff --git a/BookPlayer/SecondOnboarding/Support/SupportFlowCoordinator.swift b/BookPlayer/SecondOnboarding/Support/SupportFlowCoordinator.swift new file mode 100644 index 000000000..8831bfac7 --- /dev/null +++ b/BookPlayer/SecondOnboarding/Support/SupportFlowCoordinator.swift @@ -0,0 +1,132 @@ +// +// SupportFlowCoordinator.swift +// BookPlayer +// +// Created by Gianni Carlo on 30/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import BookPlayerKit +import Foundation +import SwiftUI + +/// Handle second onboarding flows +class SupportFlowCoordinator: Coordinator, AlertPresenter { + let accountService: AccountServiceProtocol + let eventsService: EventsServiceProtocol + let stories: [StoryViewModel] + let flow: BPCoordinatorPresentationFlow + let anonymousId: String + let onboardingId: String + unowned var presentedController: UIViewController? + + init( + flow: BPCoordinatorPresentationFlow, + anonymousId: String, + onboardingId: String, + stories: [StoryViewModel], + accountService: AccountServiceProtocol, + eventsService: EventsServiceProtocol + ) { + self.flow = flow + self.anonymousId = anonymousId + self.onboardingId = onboardingId + self.stories = stories + self.accountService = accountService + self.eventsService = eventsService + } + + func start() { + let subscriptionService = StoryAccountSubscriptionService(accountService: accountService) + let viewModel = StoryViewerViewModel( + subscriptionService: subscriptionService, + stories: stories + ) + + viewModel.onTransition = { route in + switch route { + case .dismiss: + self.dismiss() + case .showAlert(let model): + self.showAlert(model) + case .showLoader(let flag): + if flag { + self.showLoader() + } else { + self.stopLoader() + } + case .success: + self.showCongrats() + } + } + + let vc = UIHostingController(rootView: StoryViewer(viewModel: viewModel)) + presentedController = vc + flow.startPresentation(vc, animated: true) + eventsService.sendEvent( + "second_onboarding_start", + payload: [ + "rc_id": anonymousId, + "onboarding_id": onboardingId, + ] + ) + } + + func dismiss() { + eventsService.sendEvent( + "second_onboarding_skip", + payload: [ + "rc_id": anonymousId, + "onboarding_id": onboardingId, + ] + ) + flow.finishPresentation(animated: true) + } + + func showAlert(_ content: BPAlertContent) { + presentedController?.showAlert(content) + } + + func showLoader() { + if let vc = presentedController { + LoadingUtils.loadAndBlock(in: vc) + } + } + + func stopLoader() { + if let vc = presentedController { + LoadingUtils.stopLoading(in: vc) + } + } + + func showCongrats() { + eventsService.sendEvent( + "second_onboarding_subscription", + payload: [ + "rc_id": anonymousId, + "onboarding_id": onboardingId, + ] + ) + presentedController?.view.startConfetti() + presentedController?.showAlert("thanks_amazing_title".localized, message: nil) { [weak self] in + if self?.accountService.getAccountId() != nil { + self?.flow.finishPresentation(animated: true) + } else { + self?.showCreateProfile() + } + } + } + + func showCreateProfile() { + let viewModel = LoginViewModel(accountService: accountService) + viewModel.alertPresenter = self + viewModel.onTransition = { _ in + self.flow.finishPresentation(animated: true) + } + + let vc = UIHostingController(rootView: SupportProfileView(viewModel: viewModel)) + vc.modalPresentationStyle = .overFullScreen + presentedController?.present(vc, animated: true) + } +} + diff --git a/BookPlayer/SecondOnboarding/Support/SupportProfileView.swift b/BookPlayer/SecondOnboarding/Support/SupportProfileView.swift new file mode 100644 index 000000000..fb81ab64e --- /dev/null +++ b/BookPlayer/SecondOnboarding/Support/SupportProfileView.swift @@ -0,0 +1,95 @@ +// +// SupportProfileView.swift +// BookPlayer +// +// Created by Gianni Carlo on 1/7/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import AuthenticationServices +import BookPlayerKit +import SwiftUI + +struct SupportProfileView: View { + @StateObject var themeViewModel = ThemeViewModel() + @ObservedObject var viewModel: Model + + var body: some View { + ZStack { + themeViewModel.systemBackgroundColor + .ignoresSafeArea() + VStack { + HStack { + Button(action: { + viewModel.dismiss() + }, label: { + Image(systemName: "xmark") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 23) + .foregroundColor(themeViewModel.linkColor) + }) + Spacer() + } + .frame(height: 56) + .accessibilityHidden(true) + Spacer() + Image(systemName: "person.crop.circle") + .resizable() + .foregroundColor(themeViewModel.secondaryColor.opacity(0.5)) + .aspectRatio(contentMode: .fit) + .frame(maxWidth: 150) + .padding([.bottom], Spacing.M) + .accessibilityHidden(true) + + Group { + Text("Create your profile") + .font(Font(Fonts.titleStory)) + .foregroundColor(themeViewModel.primaryColor) + .padding() + Text("To enable cloud sync, sign into your profile. You can always do this later from within the Profile tab") + .font(Font(Fonts.bodyStory)) + .foregroundColor(themeViewModel.primaryColor) + .multilineTextAlignment(.center) + } + .padding([.bottom], Spacing.M) + + Spacer() + SignInWithAppleButton { request in + request.requestedScopes = [.email] + } onCompletion: { result in + switch result { + case .success(let authorization): + viewModel.handleSignIn(authorization: authorization) + default: + break + } + } + .signInWithAppleButtonStyle(themeViewModel.useDarkVariant ? .white : .black) + .frame(height: 45) + Button(action: { + viewModel.dismiss() + }, label: { + Text("Not now") + .underline() + .font(Font(Fonts.body)) + .foregroundColor(themeViewModel.secondaryColor) + }) + .padding([.top], Spacing.S5) + } + .padding([.horizontal], Spacing.M) + } + } +} + +private class MockLoginViewModelProtocol: LoginViewModelProtocol { + func handleSignIn(authorization: ASAuthorization) { + print("Sign in") + } + + func dismiss() {} +} + +#Preview { + SupportProfileView(viewModel: MockLoginViewModelProtocol()) +} diff --git a/BookPlayer/Services/ListSyncRefreshService.swift b/BookPlayer/Services/ListSyncRefreshService.swift index 7019db367..9bbd703a3 100644 --- a/BookPlayer/Services/ListSyncRefreshService.swift +++ b/BookPlayer/Services/ListSyncRefreshService.swift @@ -12,6 +12,7 @@ import Foundation enum BPSyncRefreshError: Error { /// There are queued tasks and can't fetch remote data case scheduledTasks + case disabled } class ListSyncRefreshService: BPLogger { diff --git a/BookPlayer/Settings/Icons Screen/IconsViewModel.swift b/BookPlayer/Settings/Icons Screen/IconsViewModel.swift index addf4bdb2..8b3e5f200 100644 --- a/BookPlayer/Settings/Icons Screen/IconsViewModel.swift +++ b/BookPlayer/Settings/Icons Screen/IconsViewModel.swift @@ -27,7 +27,7 @@ final class IconsViewModel { @Published var account: Account? var hasSubscription: Bool { - return account?.hasSubscription == true + return accountService.hasSyncEnabled() } /// Callback to handle actions on this screen @@ -65,7 +65,7 @@ final class IconsViewModel { } func hasMadeDonation() -> Bool { - return (self.account?.donationMade ?? false) || account?.hasSubscription == true + return accountService.hasPlusAccess() } func showPro() { diff --git a/BookPlayer/Settings/SettingsViewModel.swift b/BookPlayer/Settings/SettingsViewModel.swift index c8e3a83f2..33ba2d952 100644 --- a/BookPlayer/Settings/SettingsViewModel.swift +++ b/BookPlayer/Settings/SettingsViewModel.swift @@ -76,7 +76,7 @@ class SettingsViewModel: ViewModelProtocol { } func hasMadeDonation() -> Bool { - return account?.hasSubscription == true + return accountService.hasSyncEnabled() } /// Handle registering the value in `UserDefaults` diff --git a/BookPlayer/Settings/Themes Screen/ThemesViewModel.swift b/BookPlayer/Settings/Themes Screen/ThemesViewModel.swift index f52a39890..aa3083748 100644 --- a/BookPlayer/Settings/Themes Screen/ThemesViewModel.swift +++ b/BookPlayer/Settings/Themes Screen/ThemesViewModel.swift @@ -27,7 +27,7 @@ final class ThemesViewModel { @Published var account: Account? var hasSubscription: Bool { - return account?.hasSubscription == true + return accountService.hasSyncEnabled() } /// Callback to handle actions on this screen @@ -65,7 +65,7 @@ final class ThemesViewModel { } func hasMadeDonation() -> Bool { - return (self.account?.donationMade ?? false) || account?.hasSubscription == true + return accountService.hasPlusAccess() } func showPro() { diff --git a/BookPlayer/Utils/AlertPresenter.swift b/BookPlayer/Utils/AlertPresenter.swift index 4d678be16..d4a1e0872 100644 --- a/BookPlayer/Utils/AlertPresenter.swift +++ b/BookPlayer/Utils/AlertPresenter.swift @@ -8,7 +8,7 @@ import Foundation -protocol AlertPresenter { +protocol AlertPresenter: AnyObject { func showAlert(_ title: String?, message: String?, completion: (() -> Void)?) func showLoader() func stopLoader() @@ -17,7 +17,7 @@ protocol AlertPresenter { /// Empty implementation of `AlertPresenter` /// - Note: the need of this means that the `AppDelegate.loadPlayer` could benefit from having an async version /// so we don't need to pass an `AlertPresenter` as a parameter -struct VoidAlertPresenter: AlertPresenter { +class VoidAlertPresenter: AlertPresenter { func showAlert(_ title: String?, message: String?, completion: (() -> Void)?) {} func showLoader() {} diff --git a/BookPlayer/Utils/Views/StoryViewer/LoadingBar.swift b/BookPlayer/Utils/Views/StoryViewer/LoadingBar.swift new file mode 100644 index 000000000..b66348697 --- /dev/null +++ b/BookPlayer/Utils/Views/StoryViewer/LoadingBar.swift @@ -0,0 +1,36 @@ +// +// LoadingBar.swift +// BookPlayer +// +// Created by Gianni Carlo on 9/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import SwiftUI + +struct LoadingBar: View { + var progress: CGFloat + + var body: some View { + GeometryReader { geometry in + ZStack(alignment: .leading) { + Rectangle() + .foregroundColor(Color.gray.opacity(0.9)) + .cornerRadius(5) + + Rectangle() + .frame(width: geometry.size.width * progress, height: nil, alignment: .leading) + .foregroundColor(Color.white.opacity(0.9)) + .cornerRadius(5) + } + } + } +} + +#Preview { + VStack { + LoadingBar(progress: 0.7) + .frame(height: 2) + .padding() + }.background(Color.black) +} diff --git a/BookPlayer/Utils/Views/StoryViewer/PricingBoxView.swift b/BookPlayer/Utils/Views/StoryViewer/PricingBoxView.swift new file mode 100644 index 000000000..6d6a0f4c0 --- /dev/null +++ b/BookPlayer/Utils/Views/StoryViewer/PricingBoxView.swift @@ -0,0 +1,67 @@ +// +// PricingBoxView.swift +// BookPlayer +// +// Created by Gianni Carlo on 10/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import BookPlayerKit +import SwiftUI + +struct PricingBoxView: View { + @Binding var title: String + @Binding var isSelected: Bool + + var imageLength: CGFloat = 16 + var imageName: String { + isSelected ? "checkmark.circle" : "circle" + } + var foregroundColor: Color { + isSelected + ? Color(UIColor(hex: "3488D1")) + : Color(UIColor(hex: "334046")) + } + var backgroundColor: Color { + isSelected + ? Color.white + : Color(UIColor(hex: "F8F8F8")) + } + + var body: some View { + VStack(spacing: 0) { + HStack { + Spacer() + Image(systemName: imageName) + .resizable() + .frame(width: imageLength, height: imageLength) + .foregroundColor(foregroundColor) + .padding([.trailing, .top], Spacing.S3) + } + Text(title) + .font(Font(Fonts.titleLarge)) + .foregroundColor(foregroundColor) + Text("/month") + .font(Font(Fonts.titleRegular)) + .foregroundColor(foregroundColor.opacity(0.7)) + } + .padding([.bottom]) + .background(backgroundColor) + .clipShape(RoundedRectangle(cornerRadius: 12)) + .contentShape(Rectangle()) + .accessibilityElement(children: .combine) + .accessibilityAddTraits(.isButton) + .frame(maxWidth: 88) + + } +} + +#Preview { + ZStack { + StoryBackgroundView() + PricingBoxView( + title: .constant("$1.99"), + isSelected: .constant(true) + ) + } +} diff --git a/BookPlayer/Utils/Views/StoryViewer/StoryActionView.swift b/BookPlayer/Utils/Views/StoryViewer/StoryActionView.swift new file mode 100644 index 000000000..cecb2f618 --- /dev/null +++ b/BookPlayer/Utils/Views/StoryViewer/StoryActionView.swift @@ -0,0 +1,147 @@ +// +// StoryActionView.swift +// BookPlayer +// +// Created by Gianni Carlo on 10/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import BookPlayerKit +import SwiftUI + +struct StoryActionView: View { + @Binding var action: StoryActionType + @State private var selected: PricingOption + @State private var showSlider = false + @State private var sliderValue: Double + private var sliderSelectedOption: PricingOption? { + let intValue = Int(ceil(sliderValue)) + + return PricingOption.parseValue(intValue) + } + var onSubscription: (PricingOption) -> Void + var onDismiss: () -> Void + + init( + action: Binding, + onSubscription: @escaping (PricingOption) -> Void, + onDismiss: @escaping () -> Void + ) { + self._action = action + self.selected = action.wrappedValue.defaultOption + self.sliderValue = action.wrappedValue.defaultOption.cost + self.onSubscription = onSubscription + self.onDismiss = onDismiss + } + + var body: some View { + VStack { + if showSlider, + let sliderOptions = action.sliderOptions { + VStack { + Text(String(format: "$%.0f/mo", sliderValue)) + .font(Font(Fonts.pricingTitle)) + .foregroundColor(.white) + .accessibilityHidden(true) + Slider( + value: $sliderValue, + in: sliderOptions.min...sliderOptions.max, + step: 1.0 + ) { + Text("Pay what you think is fair") + } minimumValueLabel: { + Text(String(format: "$%.0f", action.options.first!.cost)) + .font(Font(Fonts.title)) + .foregroundColor(.white) + .accessibilityHidden(true) + } maximumValueLabel: { + Text(String(format: "$%.0f", action.options.last!.cost)) + .font(Font(Fonts.title)) + .foregroundColor(.white) + .accessibilityHidden(true) + } + + Text("Pay what you think is fair") + .multilineTextAlignment(.center) + .font(Font(Fonts.title)) + .foregroundColor(.white) + .opacity(0.8) + .accessibilityHidden(true) + } + .padding([.bottom], Spacing.L1) + + } else { + HStack(spacing: Spacing.S1) { + Spacer() + ForEach(action.options) { option in + PricingBoxView( + title: .constant(option.title), + isSelected: .constant(selected == option) + ) + .onTapGesture { + selected = option + } + } + Spacer() + } + if action.sliderOptions != nil { + Button(action: { + showSlider.toggle() + }, label: { + Text("Choose custom amount") + .font(Font(Fonts.title)) + .foregroundColor(.white) + .underline() + .padding([.top], Spacing.S4) + }) + } + } + + Button(action: { + if showSlider, + let option = sliderSelectedOption { + onSubscription(option) + } else { + onSubscription(selected) + } + }, label: { + Text(action.button) + .contentShape(Rectangle()) + .font(Font(Fonts.headline)) + .frame(height: 45) + .frame(maxWidth: .infinity) + .foregroundColor(Color(UIColor(hex: "334046"))) + .background(Color.white) + .cornerRadius(6) + }) + .padding([.top], Spacing.L1) + if let dismiss = action.dismiss { + Button(action: { + onDismiss() + }, label: { + Text(dismiss) + .underline() + .font(Font(Fonts.body)) + .foregroundColor(.white) + }) + .padding([.top], Spacing.S5) + } + } + } +} + +#Preview { + ZStack { + StoryBackgroundView() + StoryActionView( + action: .constant(.init( + options: [.supportTier4, .supportTier7, .supportTier10], + defaultOption: .proMonthly, + sliderOptions: .init(min: 3.99, max: 9.99), + button: "Continue" + )), + onSubscription: { option in print(option.title) }, + onDismiss: {} + ) + } +} diff --git a/BookPlayer/Utils/Views/StoryViewer/StoryBackgroundView.swift b/BookPlayer/Utils/Views/StoryViewer/StoryBackgroundView.swift new file mode 100644 index 000000000..6920c0624 --- /dev/null +++ b/BookPlayer/Utils/Views/StoryViewer/StoryBackgroundView.swift @@ -0,0 +1,28 @@ +// +// StoryBackgroundView.swift +// BookPlayer +// +// Created by Gianni Carlo on 10/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import SwiftUI + +struct StoryBackgroundView: View { + var body: some View { + Rectangle() + .fill(LinearGradient( + gradient: Gradient(colors: [ + Color(UIColor(hex: "4285C5")), + Color(UIColor(hex: "3D4494")) + ]), + startPoint: .bottomLeading, + endPoint: .topTrailing + )) + .ignoresSafeArea() + } +} + +#Preview { + StoryBackgroundView() +} diff --git a/BookPlayer/Utils/Views/StoryViewer/StoryProgress.swift b/BookPlayer/Utils/Views/StoryViewer/StoryProgress.swift new file mode 100644 index 000000000..5feafba2b --- /dev/null +++ b/BookPlayer/Utils/Views/StoryViewer/StoryProgress.swift @@ -0,0 +1,37 @@ +// +// StoryProgress.swift +// BookPlayer +// +// Created by Gianni Carlo on 9/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import SwiftUI + +struct StoryProgress: View { + @Binding var storiesCount: Int + @Binding var progress: Double + + var body: some View { + HStack(alignment: .center, spacing: 4) { + ForEach(0.. Void + var onPause: () -> Void + var onResume: () -> Void + @State var touchDateReference: Date? + + var longPressSkip: some Gesture { + DragGesture(minimumDistance: 0) + .onChanged { _ in + if touchDateReference == nil { + touchDateReference = Date() + onPause() + } + } + .onEnded { _ in + guard let touchDateReference else { return } + + let time = touchDateReference.distance(to: Date()) + + defer { + self.touchDateReference = nil + } + + if time <= 0.3 { + onSkip() + } + + onResume() + } + } + + var body: some View { + HStack(alignment: .center, spacing: 0) { + Rectangle() + .foregroundColor(.clear) + .contentShape(Rectangle()) + .gesture(longPressSkip) + .accessibilityAction { + onSkip() + } + .accessibilityValue("Previous") + + Rectangle() + .foregroundColor(.clear) + .accessibilityHidden(true) + } + .accessibilityElement(children: .contain) + } +} + +struct StoryForwardControlView: View { + var onSkip: () -> Void + var onPause: () -> Void + var onResume: () -> Void + @State var touchDateReference: Date? + + var longPressSkip: some Gesture { + DragGesture(minimumDistance: 0) + .onChanged { _ in + if touchDateReference == nil { + touchDateReference = Date() + onPause() + } + } + .onEnded { _ in + guard let touchDateReference else { return } + + let time = touchDateReference.distance(to: Date()) + + defer { + self.touchDateReference = nil + } + + if time <= 0.3 { + onSkip() + } + + onResume() + } + } + + var body: some View { + HStack(alignment: .center, spacing: 0) { + Rectangle() + .foregroundColor(.clear) + .accessibilityHidden(true) + Rectangle() + .foregroundColor(.clear) + .contentShape(Rectangle()) + .gesture(longPressSkip) + .accessibilityAction { + onSkip() + } + .accessibilityValue("Next") + } + .accessibilityElement(children: .contain) + } +} + +#Preview { + Group { + StoryRewindControlView(onSkip: { + print("onSkip") + }, onPause: { + print("onPause") + }, onResume: { + print("onResume") + }) + StoryForwardControlView(onSkip: { + print("onSkip") + }, onPause: { + print("onPause") + }, onResume: { + print("onResume") + }) + } +} diff --git a/BookPlayer/Utils/Views/StoryViewer/StoryView.swift b/BookPlayer/Utils/Views/StoryViewer/StoryView.swift new file mode 100644 index 000000000..2f9e9bfa9 --- /dev/null +++ b/BookPlayer/Utils/Views/StoryViewer/StoryView.swift @@ -0,0 +1,155 @@ +// +// StoryView.swift +// BookPlayer +// +// Created by Gianni Carlo on 9/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import BookPlayerKit +import SwiftUI + +struct StoryView: View { + @Binding var model: StoryViewModel + var onPrevious: () -> Void + var onNext: () -> Void + var onPause: () -> Void + var onResume: () -> Void + var onSubscription: (PricingOption) -> Void + var onDismiss: () -> Void + + var body: some View { + ZStack { + StoryRewindControlView( + onSkip: onPrevious, + onPause: onPause, + onResume: onResume + ) + .accessibilityHidden(true) + VStack { + VStack { + Text(model.title) + .shadow(radius: 2, y: 3) + .font(Font(Fonts.titleStory)) + .padding() + .allowsHitTesting(false) + + Text(model.body) + .font(Font(Fonts.bodyStory)) + .padding([.bottom, .leading, .trailing]) + .multilineTextAlignment(.center) + .allowsHitTesting(false) + + if let image = model.image { + switch image { + case "family-pic": + Image(.smallFamilyPic) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(maxWidth: 300) + .cornerRadius(9) + .allowsHitTesting(false) + .padding() + .accessibilityHidden(true) + case "app-icon": + HStack(alignment: .center) { + VStack { + Image(uiImage: UIImage(named: "retro-icon@3x")!) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 90, height: 90) + .cornerRadius(9) + Text("2016") + .font(.callout.weight(.bold)) + } + + Image(systemName: "arrow.forward") + .resizable() + .aspectRatio(contentMode: .fit) + .opacity(0.6) + .font(.largeTitle.weight(.bold)) + .frame(width: 40, height: 20) + .padding([.leading, .trailing], Spacing.S3) + .offset(y: -Spacing.S1) + VStack { + Image(uiImage: UIImage(named: "default-icon@3x")!) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 90, height: 90) + .cornerRadius(9) + Text("Now") + .font(.callout.weight(.bold)) + } + } + .allowsHitTesting(false) + .padding([.top], Spacing.L1) + .padding([.leading, .trailing]) + .accessibilityHidden(true) + default: + EmptyView() + } + + } + } + .accessibilityElement(children: .combine) + + if let action = Binding($model.action) { + StoryActionView( + action: action, + onSubscription: onSubscription, + onDismiss: onDismiss + ) + .padding([.leading, .trailing]) + .padding([.top], Spacing.L1) + } + + Spacer() + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .animation(.smooth, value: model.title) + .accessibilityElement(children: .contain) + .accessibilitySortPriority(1) + .zIndex(1) + StoryForwardControlView( + onSkip: onNext, + onPause: onPause, + onResume: onResume + ) + .accessibilityHidden(model.action != nil) + } + } +} + +#Preview { + ZStack { + StoryBackgroundView() + StoryView(model: .constant( + StoryViewModel( + title: "Story title", + body: "Story body", + duration: 2, + action: .init( + options: [ + .supportTier3, + .proMonthly, + .supportTier10 + ], + defaultOption: .proMonthly, + button: "" + ) + )), onPrevious: { + print("Previous") + }, onNext: { + print("Next") + }, onPause: { + print("Pause") + }, onResume: { + print("Resume") + }, onSubscription: { option in + print(option.title) + }, onDismiss: { + print("Dismiss") + }) + .foregroundColor(.white) + } +} diff --git a/BookPlayer/Utils/Views/StoryViewer/StoryViewModel.swift b/BookPlayer/Utils/Views/StoryViewer/StoryViewModel.swift new file mode 100644 index 000000000..d9071cb41 --- /dev/null +++ b/BookPlayer/Utils/Views/StoryViewer/StoryViewModel.swift @@ -0,0 +1,42 @@ +// +// StoryViewModel.swift +// BookPlayer +// +// Created by Gianni Carlo on 10/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import BookPlayerKit +import Foundation + +struct StoryActionType: Codable { + var options: [PricingOption] + var defaultOption: PricingOption + var sliderOptions: SliderOptions? + var button: String + var dismiss: String? + + enum CodingKeys: String, CodingKey { + case options, button, dismiss + case defaultOption = "default_option" + case sliderOptions = "slider_options" + } +} + +struct SliderOptions: Codable { + var min: Double + var max: Double +} + +struct StoryViewModel: Identifiable, Equatable, Codable { + static func == (lhs: StoryViewModel, rhs: StoryViewModel) -> Bool { + lhs.id == rhs.id + } + + var id: String { title } + var title: String + var body: String + var image: String? + var duration: TimeInterval + var action: StoryActionType? +} diff --git a/BookPlayer/Utils/Views/StoryViewer/StoryViewer.swift b/BookPlayer/Utils/Views/StoryViewer/StoryViewer.swift new file mode 100644 index 000000000..b5c69de5f --- /dev/null +++ b/BookPlayer/Utils/Views/StoryViewer/StoryViewer.swift @@ -0,0 +1,82 @@ +// +// StoryViewer.swift +// BookPlayer +// +// Created by Gianni Carlo on 8/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import BookPlayerKit +import SwiftUI + +struct StoryViewer: View { + @State var firstSeen = false + @ObservedObject var viewModel: StoryViewerViewModel + + var body: some View { + ZStack(alignment: .top) { + StoryBackgroundView() + .accessibilityHidden(true) + StoryProgress( + storiesCount: .constant(viewModel.storiesCount), + progress: $viewModel.progress + ) + .padding([.trailing, .leading, .bottom]) + .accessibilityHidden(true) + StoryView( + model: $viewModel.currentModel, + onPrevious: viewModel.previous, + onNext: viewModel.next, + onPause: viewModel.pause, + onResume: viewModel.start, + onSubscription: viewModel.handleSubscription(option:), + onDismiss: viewModel.handleDismiss + ) + .foregroundColor(Color.white) + .padding() + .offset(y: Spacing.L1) + } + .onAppear { viewModel.start() } + .onChange( + of: viewModel.currentModel, + perform: { _ in + UIAccessibility.post(notification: .screenChanged, argument: nil) + }) + } +} + +private class PreviewSubscriptionServiceMock: StoryAccountSubscriptionProtocol { + func hasAccount() -> Bool { + return true + } + + func getSecondOnboarding() async throws -> T { + throw BPSyncRefreshError.disabled + } + + func subscribe(option: PricingOption) async throws -> Bool { + return true + } +} + +#Preview { + StoryViewer( + viewModel: StoryViewerViewModel( + subscriptionService: PreviewSubscriptionServiceMock(), + stories: [ + StoryViewModel( + title: "Story 1", + body: + "Body 1", + image: "app-icon", + duration: 10, action: .none), + StoryViewModel( + title: "Story 2", + body: + "Body 2", + duration: 5, + action: .init( + options: [.supportTier4, .supportTier7, .supportTier10], defaultOption: .supportTier7, + sliderOptions: .init(min: 3.99, max: 9.99), button: "Continue", dismiss: "Not now")), + ])) +} diff --git a/BookPlayer/Utils/Views/StoryViewer/StoryViewerViewModel.swift b/BookPlayer/Utils/Views/StoryViewer/StoryViewerViewModel.swift new file mode 100644 index 000000000..0eccd2e1e --- /dev/null +++ b/BookPlayer/Utils/Views/StoryViewer/StoryViewerViewModel.swift @@ -0,0 +1,102 @@ +// +// StoryTimer.swift +// BookPlayer +// +// Created by Gianni Carlo on 10/6/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import BookPlayerKit +import Combine +import Foundation + +class StoryViewerViewModel: ObservableObject { + enum Routes { + case showLoader(Bool) + case showAlert(BPAlertContent) + case success + case dismiss + } + + @Published var currentModel: StoryViewModel + @Published var progress: Double = 0 + @Published var isOnLastStory: Bool = false + + let subscriptionService: StoryAccountSubscriptionProtocol + public var storiesCount: Int { stories.count } + + /// Callback to handle actions on this screen + var onTransition: BPTransition? + private var stories: [StoryViewModel] + private let publisher: Timer.TimerPublisher + private var cancellable: Cancellable? + + init( + subscriptionService: StoryAccountSubscriptionProtocol, + stories: [StoryViewModel] + ) { + self.subscriptionService = subscriptionService + self.stories = stories + self.currentModel = stories.first! + self.publisher = Timer.publish(every: 0.1, on: .main, in: .default) + } + + func start() { + guard !UIAccessibility.isVoiceOverRunning else { return } + + cancellable?.cancel() + cancellable = publisher.autoconnect().sink(receiveValue: { [weak self] _ in + guard let self else { return } + var newProgress = self.progress + (0.1 / self.currentModel.duration) + if Int(newProgress) >= self.storiesCount { newProgress = Double(self.storiesCount) - 0.01 } + self.progress = newProgress + self.currentModel = self.stories[Int(newProgress)] + }) + } + + func next() { + guard min(Int(progress) + 1, storiesCount) != storiesCount else { + return + } + let newProgress = max((Int(progress) + 1) % storiesCount, 0) + progress = Double(newProgress) + isOnLastStory = stories.count - Int(progress) == 1 + currentModel = stories[newProgress] + } + + func previous() { + let newProgress = max((Int(self.progress) - 1) % storiesCount, 0) + progress = Double(newProgress) + isOnLastStory = stories.count - Int(progress) == 1 + currentModel = stories[newProgress] + } + + func pause() { + cancellable?.cancel() + } + + func handleSubscription(option: PricingOption) { + Task { @MainActor [weak self] in + guard let self = self else { return } + + self.onTransition?(.showLoader(true)) + + do { + let userCancelled = try await self.subscriptionService.subscribe(option: option) + self.onTransition?(.showLoader(false)) + if !userCancelled { + self.onTransition?(.success) + } + } catch { + self.onTransition?(.showLoader(false)) + self.onTransition?(.showAlert( + BPAlertContent.errorAlert(message: error.localizedDescription) + )) + } + } + } + + func handleDismiss() { + onTransition?(.dismiss) + } +} diff --git a/BookPlayerTests/Coordinators/ItemListCoordinatorTests.swift b/BookPlayerTests/Coordinators/ItemListCoordinatorTests.swift index 93c23bf9b..0de8dab83 100644 --- a/BookPlayerTests/Coordinators/ItemListCoordinatorTests.swift +++ b/BookPlayerTests/Coordinators/ItemListCoordinatorTests.swift @@ -40,7 +40,8 @@ class LibraryListCoordinatorTests: XCTestCase { listRefreshService: ListSyncRefreshService( playerManager: playerManagerMock, syncService: syncServiceMock - ) + ), + accountService: coreServices.accountService ) self.libraryListCoordinator.start() diff --git a/BookPlayerTests/Mocks/AccountServiceMock.swift b/BookPlayerTests/Mocks/AccountServiceMock.swift index 7b09cd02b..ac16a243b 100644 --- a/BookPlayerTests/Mocks/AccountServiceMock.swift +++ b/BookPlayerTests/Mocks/AccountServiceMock.swift @@ -11,8 +11,20 @@ import Foundation import RevenueCat class AccountServiceMock: AccountServiceProtocol { - func hasActiveSubscription() -> Bool { - return account?.hasSubscription == true + func getAnonymousId() -> String? { + return nil + } + + func hasSyncEnabled() -> Bool { + return false + } + + func hasPlusAccess() -> Bool { + return false + } + + func getSecondOnboarding() async throws -> T { + throw BookPlayerError.cancelledTask } var account: Account? @@ -81,6 +93,11 @@ class AccountServiceMock: AccountServiceProtocol { return true } + func subscribe(option: BookPlayerKit.PricingOption) async throws -> Bool { + self.account?.hasSubscription = true + return true + } + func restorePurchases() async throws -> CustomerInfo { self.account?.hasSubscription = true return try await Purchases.shared.customerInfo() @@ -93,7 +110,7 @@ class AccountServiceMock: AccountServiceProtocol { return self.account } - func loginTestAccount(token: String) throws {} + func loginTestAccount(token: String) async throws {} func logout() throws {} diff --git a/IAP-Configuration.storekit b/IAP-Configuration.storekit index 5e53a93f5..1993f28e2 100644 --- a/IAP-Configuration.storekit +++ b/IAP-Configuration.storekit @@ -96,7 +96,59 @@ } ], "settings" : { - "_compatibilityTimeRate" : 6, + "_compatibilityTimeRate" : { + "3" : 6 + }, + "_failTransactionsEnabled" : false, + "_locale" : "en_US", + "_storefront" : "USA", + "_storeKitErrors" : [ + { + "current" : null, + "enabled" : false, + "name" : "Load Products" + }, + { + "current" : null, + "enabled" : false, + "name" : "Purchase" + }, + { + "current" : null, + "enabled" : false, + "name" : "Verification" + }, + { + "current" : null, + "enabled" : false, + "name" : "App Store Sync" + }, + { + "current" : null, + "enabled" : false, + "name" : "Subscription Status" + }, + { + "current" : null, + "enabled" : false, + "name" : "App Transaction" + }, + { + "current" : null, + "enabled" : false, + "name" : "Manage Subscriptions Sheet" + }, + { + "current" : null, + "enabled" : false, + "name" : "Refund Request Sheet" + }, + { + "current" : null, + "enabled" : false, + "name" : "Offer Code Redeem Sheet" + } + ], "_timeRate" : 15 }, "subscriptionGroups" : [ @@ -156,12 +208,237 @@ "referenceName" : "pro.subscription.yearly", "subscriptionGroupID" : "652B5FC0", "type" : "RecurringSubscription" + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "0.99", + "familyShareable" : false, + "groupNumber" : 1, + "internalID" : "EE383201", + "introductoryOffer" : null, + "localizations" : [ + { + "description" : "", + "displayName" : "", + "locale" : "en_US" + } + ], + "productID" : "com.tortugapower.audiobookplayer.subscription.support.1", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "subscription.support.1", + "subscriptionGroupID" : "652B5FC0", + "type" : "RecurringSubscription" + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "1.99", + "familyShareable" : false, + "groupNumber" : 1, + "internalID" : "FCF99805", + "introductoryOffer" : null, + "localizations" : [ + { + "description" : "", + "displayName" : "", + "locale" : "en_US" + } + ], + "productID" : "com.tortugapower.audiobookplayer.subscription.support.2", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "subscription.support.2", + "subscriptionGroupID" : "652B5FC0", + "type" : "RecurringSubscription" + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "2.99", + "familyShareable" : false, + "groupNumber" : 1, + "internalID" : "B7B02088", + "introductoryOffer" : null, + "localizations" : [ + { + "description" : "", + "displayName" : "", + "locale" : "en_US" + } + ], + "productID" : "com.tortugapower.audiobookplayer.subscription.support.3", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "subscription.support.3", + "subscriptionGroupID" : "652B5FC0", + "type" : "RecurringSubscription" + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "3.99", + "familyShareable" : false, + "groupNumber" : 1, + "internalID" : "570A9BCB", + "introductoryOffer" : null, + "localizations" : [ + { + "description" : "", + "displayName" : "", + "locale" : "en_US" + } + ], + "productID" : "com.tortugapower.audiobookplayer.subscription.support.4", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "subscription.support.4", + "subscriptionGroupID" : "652B5FC0", + "type" : "RecurringSubscription" + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "5.99", + "familyShareable" : false, + "groupNumber" : 1, + "internalID" : "4F02881E", + "introductoryOffer" : null, + "localizations" : [ + { + "description" : "", + "displayName" : "", + "locale" : "en_US" + } + ], + "productID" : "com.tortugapower.audiobookplayer.subscription.support.6", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "subscription.support.6", + "subscriptionGroupID" : "652B5FC0", + "type" : "RecurringSubscription" + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "6.99", + "familyShareable" : false, + "groupNumber" : 1, + "internalID" : "2DCC769A", + "introductoryOffer" : null, + "localizations" : [ + { + "description" : "", + "displayName" : "", + "locale" : "en_US" + } + ], + "productID" : "com.tortugapower.audiobookplayer.subscription.support.7", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "subscription.support.7", + "subscriptionGroupID" : "652B5FC0", + "type" : "RecurringSubscription" + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "7.99", + "familyShareable" : false, + "groupNumber" : 1, + "internalID" : "A977972B", + "introductoryOffer" : null, + "localizations" : [ + { + "description" : "", + "displayName" : "", + "locale" : "en_US" + } + ], + "productID" : "com.tortugapower.audiobookplayer.subscription.support.8", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "subscription.support.8", + "subscriptionGroupID" : "652B5FC0", + "type" : "RecurringSubscription" + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "8.99", + "familyShareable" : false, + "groupNumber" : 1, + "internalID" : "9410B8C0", + "introductoryOffer" : null, + "localizations" : [ + { + "description" : "", + "displayName" : "", + "locale" : "en_US" + } + ], + "productID" : "com.tortugapower.audiobookplayer.subscription.support.9", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "subscription.support.9", + "subscriptionGroupID" : "652B5FC0", + "type" : "RecurringSubscription" + }, + { + "adHocOffers" : [ + + ], + "codeOffers" : [ + + ], + "displayPrice" : "9.99", + "familyShareable" : false, + "groupNumber" : 1, + "internalID" : "0DEF0B7A", + "introductoryOffer" : null, + "localizations" : [ + { + "description" : "", + "displayName" : "", + "locale" : "en_US" + } + ], + "productID" : "com.tortugapower.audiobookplayer.subscription.support.10", + "recurringSubscriptionPeriod" : "P1M", + "referenceName" : "subscription.support.10", + "subscriptionGroupID" : "652B5FC0", + "type" : "RecurringSubscription" } ] } ], "version" : { - "major" : 2, + "major" : 3, "minor" : 0 } } diff --git a/Shared/Services/Account/AccountAPI.swift b/Shared/Services/Account/AccountAPI.swift index ec63ca421..05aff5fc5 100644 --- a/Shared/Services/Account/AccountAPI.swift +++ b/Shared/Services/Account/AccountAPI.swift @@ -11,6 +11,7 @@ import Foundation public enum AccountAPI { case login(token: String) case delete + case secondOnboarding(anonymousId: String, firstSeen: Double, region: String) } extension AccountAPI: Endpoint { @@ -20,6 +21,8 @@ extension AccountAPI: Endpoint { return "/v1/user/login" case .delete: return "/v1/user/delete" + case .secondOnboarding: + return "/v1/user/second_onboarding" } } @@ -29,6 +32,8 @@ extension AccountAPI: Endpoint { return .post case .delete: return .delete + case .secondOnboarding: + return .post } } @@ -38,6 +43,12 @@ extension AccountAPI: Endpoint { return ["token_id": token] case .delete: return nil + case .secondOnboarding(let anonymousId, let firstSeen, let region): + return [ + "rc_id": anonymousId, + "first_seen": firstSeen, + "region": region + ] } } } diff --git a/Shared/Services/Account/AccountService.swift b/Shared/Services/Account/AccountService.swift index 95fbd94cf..5bf545477 100644 --- a/Shared/Services/Account/AccountService.swift +++ b/Shared/Services/Account/AccountService.swift @@ -21,6 +21,10 @@ public enum AccountError: Error { case missingToken } +public enum SecondOnboardingError: Error { + case notApplicable +} + extension AccountError: LocalizedError { public var errorDescription: String? { switch self { @@ -38,9 +42,11 @@ extension AccountError: LocalizedError { public protocol AccountServiceProtocol { func getAccountId() -> String? + func getAnonymousId() -> String? func getAccount() -> Account? func hasAccount() -> Bool - func hasActiveSubscription() -> Bool + func hasSyncEnabled() -> Bool + func hasPlusAccess() -> Bool func createAccount(donationMade: Bool) @@ -57,9 +63,10 @@ public protocol AccountServiceProtocol { func getSubscriptionOptions() async throws -> [PricingModel] func subscribe(option: PricingModel) async throws -> Bool + func subscribe(option: PricingOption) async throws -> Bool func restorePurchases() async throws -> CustomerInfo - func loginTestAccount(token: String) throws + func loginTestAccount(token: String) async throws func login( with token: String, userId: String @@ -70,6 +77,8 @@ public protocol AccountServiceProtocol { func logout() throws func deleteAccount() async throws -> String + + func getSecondOnboarding() async throws -> T } public final class AccountService: AccountServiceProtocol { @@ -104,6 +113,10 @@ public final class AccountService: AccountServiceProtocol { } } + public func getAnonymousId() -> String? { + return Purchases.shared.cachedCustomerInfo?.id + } + public func getAccount() -> Account? { let context = self.dataManager.getContext() let fetch: NSFetchRequest = Account.fetchRequest() @@ -123,8 +136,16 @@ public final class AccountService: AccountServiceProtocol { return false } - public func hasActiveSubscription() -> Bool { - return getAccount()?.hasSubscription == true + public func hasSyncEnabled() -> Bool { + return Purchases.shared.cachedCustomerInfo?.entitlements.all["pro"]?.isActive == true + } + + public func hasPlusAccess() -> Bool { + let entitlements = Purchases.shared.cachedCustomerInfo?.entitlements.all + + return entitlements?["plus"]?.isActive == true || + entitlements?["pro"]?.isActive == true || + getAccount()?.donationMade == true } public func createAccount(donationMade: Bool) { @@ -208,7 +229,15 @@ public final class AccountService: AccountServiceProtocol { } public func subscribe(option: PricingModel) async throws -> Bool { - let products = await Purchases.shared.products([option.id]) + return try await subscribe(productId: option.id) + } + + public func subscribe(option: PricingOption) async throws -> Bool { + return try await subscribe(productId: option.rawValue) + } + + private func subscribe(productId: String) async throws -> Bool { + let products = await Purchases.shared.products([productId]) guard let product = products.first else { throw AccountError.emptyProducts @@ -227,15 +256,18 @@ public final class AccountService: AccountServiceProtocol { return try await Purchases.shared.restorePurchases() } - public func loginTestAccount(token: String) throws { + public func loginTestAccount(token: String) async throws { + let userId = "001918.a2d23624056d45618b7c2699d98c535e.2333" self.updateAccount( - id: "001918.a2d23624056d45618b7c2699d98c535e.2333", + id: userId, email: "gcarlo89@hotmail.com", donationMade: true, hasSubscription: true ) try self.keychain.setAccessToken(token) + + _ = try await Purchases.shared.logIn(userId) } public func login( @@ -301,4 +333,20 @@ public final class AccountService: AccountServiceProtocol { return response.message } + + public func getSecondOnboarding() async throws -> T { + guard + let customerInfo = Purchases.shared.cachedCustomerInfo, + customerInfo.activeSubscriptions.isEmpty, + let countryCode = await Storefront.currentStorefront?.countryCode + else { + throw SecondOnboardingError.notApplicable + } + + return try await provider.request(.secondOnboarding( + anonymousId: customerInfo.id, + firstSeen: customerInfo.firstSeen.timeIntervalSince1970, + region: countryCode + )) + } } diff --git a/Shared/Services/Account/PricingModel.swift b/Shared/Services/Account/PricingModel.swift index f54094a83..d053f75e2 100644 --- a/Shared/Services/Account/PricingModel.swift +++ b/Shared/Services/Account/PricingModel.swift @@ -17,3 +17,86 @@ public struct PricingModel: Identifiable, Equatable { self.title = title } } + +public enum PricingOption: String, Identifiable, Codable { + public var id: Self { self } + + public static func parseValue(_ value: Int) -> Self? { + switch value { + case 3: + return .supportTier3 + case 4: + return .supportTier4 + case 5: + return .proMonthly + case 6: + return .supportTier6 + case 7: + return .supportTier7 + case 8: + return .supportTier8 + case 9: + return .supportTier9 + case 10: + return .supportTier10 + default: + return nil + } + } + + case proMonthly = "com.tortugapower.audiobookplayer.subscription.pro" + case proYearly = "com.tortugapower.audiobookplayer.subscription.pro.yearly" + case supportTier3 = "com.tortugapower.audiobookplayer.subscription.support.3" + case supportTier4 = "com.tortugapower.audiobookplayer.subscription.support.4" + case supportTier6 = "com.tortugapower.audiobookplayer.subscription.support.6" + case supportTier7 = "com.tortugapower.audiobookplayer.subscription.support.7" + case supportTier8 = "com.tortugapower.audiobookplayer.subscription.support.8" + case supportTier9 = "com.tortugapower.audiobookplayer.subscription.support.9" + case supportTier10 = "com.tortugapower.audiobookplayer.subscription.support.10" + + public var title: String { + switch self { + case .proMonthly: + return "$4.99" + case .proYearly: + return "$49.99" + case .supportTier3: + return "$2.99" + case .supportTier4: + return "$3.99" + case .supportTier6: + return "$5.99" + case .supportTier7: + return "$6.99" + case .supportTier8: + return "$7.99" + case .supportTier9: + return "$8.99" + case .supportTier10: + return "$9.99" + } + } + + public var cost: Double { + switch self { + case .proMonthly: + return 4.99 + case .proYearly: + return 49.99 + case .supportTier3: + return 2.99 + case .supportTier4: + return 3.99 + case .supportTier6: + return 5.99 + case .supportTier7: + return 6.99 + case .supportTier8: + return 7.99 + case .supportTier9: + return 8.99 + case .supportTier10: + return 9.99 + } + } +} diff --git a/Shared/Services/Events/EventsAPI.swift b/Shared/Services/Events/EventsAPI.swift new file mode 100644 index 000000000..514ae50bc --- /dev/null +++ b/Shared/Services/Events/EventsAPI.swift @@ -0,0 +1,36 @@ +// +// EventsAPI.swift +// BookPlayer +// +// Created by Gianni Carlo on 4/7/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import Foundation + +public enum EventsAPI { + case sendEvent(event: String, payload: [String: Any]) +} + +extension EventsAPI: Endpoint { + public var path: String { + switch self { + case .sendEvent: + return "/v1/user/events" + } + } + + public var method: HTTPMethod { + switch self { + case .sendEvent: + return .post + } + } + + public var parameters: [String: Any]? { + switch self { + case .sendEvent(let event, let payload): + return ["event": event, "event_data": payload] + } + } +} diff --git a/Shared/Services/Events/EventsService.swift b/Shared/Services/Events/EventsService.swift new file mode 100644 index 000000000..c7cb5f3e0 --- /dev/null +++ b/Shared/Services/Events/EventsService.swift @@ -0,0 +1,33 @@ +// +// EventsService.swift +// BookPlayer +// +// Created by Gianni Carlo on 4/7/24. +// Copyright © 2024 Tortuga Power. All rights reserved. +// + +import Foundation + +public protocol EventsServiceProtocol { + func sendEvent(_ event: String, payload: [String: Any]) +} + +public class EventsService: EventsServiceProtocol, BPLogger { + let client: NetworkClientProtocol + private let provider: NetworkProvider + + public init(client: NetworkClientProtocol = NetworkClient()) { + self.client = client + self.provider = NetworkProvider(client: client) + } + + public func sendEvent(_ event: String, payload: [String : Any]) { + Task { + do { + let _: Empty = try await provider.request(.sendEvent(event: event, payload: payload)) + } catch { + Self.logger.trace("Failed to send event \(event), error: \(error.localizedDescription)") + } + } + } +} diff --git a/Shared/Services/Sync/SyncService.swift b/Shared/Services/Sync/SyncService.swift index 8754f7a8b..9835f3050 100644 --- a/Shared/Services/Sync/SyncService.swift +++ b/Shared/Services/Sync/SyncService.swift @@ -148,8 +148,7 @@ public final class SyncService: SyncServiceProtocol, BPLogger { func bindObservers() { NotificationCenter.default.publisher(for: .logout, object: nil) - .sink(receiveValue: { [weak self] _ in - self?.isActive = false + .sink(receiveValue: { _ in UserDefaults.standard.set( false, forKey: Constants.UserDefaults.hasScheduledLibraryContents diff --git a/Shared/Styleguide/Fonts.swift b/Shared/Styleguide/Fonts.swift index 6d0903964..ba79a3b30 100644 --- a/Shared/Styleguide/Fonts.swift +++ b/Shared/Styleguide/Fonts.swift @@ -11,7 +11,13 @@ import UIKit public struct Fonts { public static let title = UIFont.preferredFont(with: 16, style: .headline, weight: .semibold) public static let titleRegular = UIFont.preferredFont(with: 16, style: .headline, weight: .regular) + public static let titleLarge = UIFont.preferredFont(with: 20, style: .largeTitle, weight: .semibold) public static let body = UIFont.preferredFont(with: 14, style: .body, weight: .regular) public static let headline = UIFont.preferredFont(forTextStyle: .headline) public static let subheadline = UIFont.preferredFont(forTextStyle: .subheadline) + + public static let titleStory = UIFont.preferredFont(with: 24, style: .largeTitle, weight: .heavy) + public static let bodyStory = UIFont.preferredFont(with: 20, style: .title1, weight: .regular) + + public static let pricingTitle = UIFont.preferredFont(with: 40, style: .largeTitle, weight: .heavy) } diff --git a/Shared/Styleguide/Spacing.swift b/Shared/Styleguide/Spacing.swift index 94bb8ff51..f0d1cee48 100644 --- a/Shared/Styleguide/Spacing.swift +++ b/Shared/Styleguide/Spacing.swift @@ -9,6 +9,8 @@ import Foundation public struct Spacing { + /// Value: 2 + public static let S5: CGFloat = 2 /// Value: 4 public static let S4: CGFloat = 4 /// Value: 6 @@ -23,4 +25,6 @@ public struct Spacing { public static let M: CGFloat = 24 /// Value: 32 public static let L: CGFloat = 32 + /// Value: 44 + public static let L1: CGFloat = 44 }