From 931d72c8f465c01ba0afefdbdb9f2c514e5fed47 Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Thu, 31 Oct 2024 15:53:55 -0400 Subject: [PATCH 01/28] show resume lesson modal --- godtools.xcodeproj/project.pbxproj | 4 ++ .../LessonListItemProgressDomainModel.swift | 11 ++++ .../Presentation/Lesson/LessonViewModel.swift | 4 +- .../ResumeLessonProgressModal.swift | 36 +++++++++++++ godtools/App/Flows/App/AppFlow.swift | 54 ++++++++++++++++--- godtools/App/Flows/Flow/FlowStep.swift | 2 + godtools/App/Flows/Lesson/LessonFlow.swift | 5 +- .../ToolNavigation/ToolNavigationFlow.swift | 20 ++++--- .../Pages/MobileContentPagesViewModel.swift | 4 ++ .../MobileContentPagesInitialPageConfig.swift | 4 +- 10 files changed, 125 insertions(+), 19 deletions(-) create mode 100644 godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift diff --git a/godtools.xcodeproj/project.pbxproj b/godtools.xcodeproj/project.pbxproj index 65a251385d..a9718ce659 100644 --- a/godtools.xcodeproj/project.pbxproj +++ b/godtools.xcodeproj/project.pbxproj @@ -1546,6 +1546,7 @@ D4960CC62CC6D77B0090B114 /* GetTranslatedPercentage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CC52CC6D77B0090B114 /* GetTranslatedPercentage.swift */; }; D4960CC82CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CC72CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift */; }; D4960CCC2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCB2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift */; }; + D4960CCE2CD177980090B114 /* ResumeLessonProgressModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */; }; D496B9062A9E702200CBEA19 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = D496B9052A9E702200CBEA19 /* SearchBar.swift */; }; D4997E0E28D4CED800205B4C /* YouTubeiOSPlayerHelper in Frameworks */ = {isa = PBXBuildFile; productRef = D4997E0D28D4CED800205B4C /* YouTubeiOSPlayerHelper */; }; D4AFA4452BAC93B400318023 /* ToolFilterLanguagesInterfaceStringsDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4AFA4442BAC93B400318023 /* ToolFilterLanguagesInterfaceStringsDomainModel.swift */; }; @@ -3260,6 +3261,7 @@ D4960CC52CC6D77B0090B114 /* GetTranslatedPercentage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetTranslatedPercentage.swift; sourceTree = ""; }; D4960CC72CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserLessonProgressDomainModel.swift; sourceTree = ""; }; D4960CCB2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MobileContentPagesInitialPageConfig.swift; sourceTree = ""; }; + D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeLessonProgressModal.swift; sourceTree = ""; }; D496B9052A9E702200CBEA19 /* SearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = ""; }; D4AFA4442BAC93B400318023 /* ToolFilterLanguagesInterfaceStringsDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolFilterLanguagesInterfaceStringsDomainModel.swift; sourceTree = ""; }; D4AFA4462BAC950800318023 /* GetToolFilterLanguagesInterfaceStringsRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetToolFilterLanguagesInterfaceStringsRepositoryInterface.swift; sourceTree = ""; }; @@ -11916,6 +11918,7 @@ isa = PBXGroup; children = ( D4E7EE062C90E5D800F75DA6 /* LessonCompletionProgressBar.swift */, + D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */, ); path = Presentation; sourceTree = ""; @@ -13839,6 +13842,7 @@ 450D63AC2AC8A84600B90319 /* TrackActionAnalyticsPropertiesDomainModel.swift in Sources */, 4598BD112BF7DF6800196463 /* AuthenticationProviderResponse.swift in Sources */, 45308EBF2BDC27C800A49D96 /* LessonEvaluationScaleDomainModel.swift in Sources */, + D4960CCE2CD177980090B114 /* ResumeLessonProgressModal.swift in Sources */, 454CA1FA2B7BC2E6009A3976 /* StoreInitialAppLanguageUseCase.swift in Sources */, 45CE7FD42926A0940056168A /* AccountSectionsView.swift in Sources */, 4595E0E52A852DF400D88DAE /* RealmUserDetails+UserDetailsDataModelType.swift in Sources */, diff --git a/godtools/App/Features/Lessons/Domain/Entities/LessonListItemProgressDomainModel.swift b/godtools/App/Features/Lessons/Domain/Entities/LessonListItemProgressDomainModel.swift index 11dae084d7..226e880fab 100644 --- a/godtools/App/Features/Lessons/Domain/Entities/LessonListItemProgressDomainModel.swift +++ b/godtools/App/Features/Lessons/Domain/Entities/LessonListItemProgressDomainModel.swift @@ -13,3 +13,14 @@ enum LessonListItemProgressDomainModel { case inProgress(progress: Double, progressString: String) case complete(completeString: String) } + +extension LessonListItemProgressDomainModel { + var inProgress: Bool { + switch self { + case .inProgress: + return true + default: + return false + } + } +} diff --git a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift index dccab38b20..5c0dc8a004 100644 --- a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift +++ b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift @@ -17,12 +17,12 @@ class LessonViewModel: MobileContentPagesViewModel { let progress: ObservableValue> = ObservableValue(value: AnimatableValue(value: 0, animated: false)) - init(flowDelegate: FlowDelegate, renderer: MobileContentRenderer, resource: ResourceModel, primaryLanguage: LanguageModel, initialPage: MobileContentPagesPage?, resourcesRepository: ResourcesRepository, translationsRepository: TranslationsRepository, mobileContentEventAnalytics: MobileContentRendererEventAnalyticsTracking, getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase, getTranslatedLanguageName: GetTranslatedLanguageName, storeLessonProgressUseCase: StoreUserLessonProgressUseCase, trainingTipsEnabled: Bool, incrementUserCounterUseCase: IncrementUserCounterUseCase) { + init(flowDelegate: FlowDelegate, renderer: MobileContentRenderer, resource: ResourceModel, primaryLanguage: LanguageModel, initialPage: MobileContentPagesPage?, initialPageConfig: MobileContentPagesInitialPageConfig?, resourcesRepository: ResourcesRepository, translationsRepository: TranslationsRepository, mobileContentEventAnalytics: MobileContentRendererEventAnalyticsTracking, getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase, getTranslatedLanguageName: GetTranslatedLanguageName, storeLessonProgressUseCase: StoreUserLessonProgressUseCase, trainingTipsEnabled: Bool, incrementUserCounterUseCase: IncrementUserCounterUseCase) { self.flowDelegate = flowDelegate self.storeLessonProgressUseCase = storeLessonProgressUseCase - let initialPageConfig = MobileContentPagesInitialPageConfig(shouldNavigateToStartPageIfLastPage: true, shouldNavigateToPreviousVisiblePageIfHiddenPage: true) + let initialPageConfig = initialPageConfig ?? MobileContentPagesInitialPageConfig(shouldRestartAtBeginning: true, shouldNavigateToStartPageIfLastPage: true, shouldNavigateToPreviousVisiblePageIfHiddenPage: true) super.init(renderer: renderer, initialPage: initialPage, initialPageConfig: initialPageConfig, resourcesRepository: resourcesRepository, translationsRepository: translationsRepository, mobileContentEventAnalytics: mobileContentEventAnalytics, getCurrentAppLanguageUseCase: getCurrentAppLanguageUseCase, getTranslatedLanguageName: getTranslatedLanguageName, initialPageRenderingType: .visiblePages, trainingTipsEnabled: trainingTipsEnabled, incrementUserCounterUseCase: incrementUserCounterUseCase, selectedLanguageIndex: nil) } diff --git a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift new file mode 100644 index 0000000000..e2648566a3 --- /dev/null +++ b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift @@ -0,0 +1,36 @@ +// +// ResumeLessonProgressModal.swift +// godtools +// +// Created by Rachael Skeath on 10/29/24. +// Copyright © 2024 Cru. All rights reserved. +// + +import SwiftUI + +struct ResumeLessonProgressModal: View { + + private let buttonHeight: CGFloat = 48 + private let startOverClosure: () -> Void + private let continueClosure: () -> Void + + init(startOverClosure: @escaping () -> Void, continueClosure: @escaping () -> Void) { + self.startOverClosure = startOverClosure + self.continueClosure = continueClosure + } + + var body: some View { + Text("Resume Progress") + + Text("Pickup where you left off?") + + HStack { + GTWhiteButton(title: "Start Over", width: 133, height: buttonHeight) { + startOverClosure() + } + GTBlueButton(title: "Continue", width: 133, height: buttonHeight) { + continueClosure() + } + } + } +} diff --git a/godtools/App/Flows/App/AppFlow.swift b/godtools/App/Flows/App/AppFlow.swift index c5e98a9276..75ba839c57 100644 --- a/godtools/App/Flows/App/AppFlow.swift +++ b/godtools/App/Flows/App/AppFlow.swift @@ -204,10 +204,20 @@ class AppFlow: NSObject, ToolNavigationFlow, Flow { case .lessonTappedFromLessonsList(let lessonListItem, let languageFilter): - if let languageFilter = languageFilter { - navigateToTool(toolDataModelId: lessonListItem.dataModelId, languageIds: [languageFilter.languageId], selectedLanguageIndex: 0, trainingTipsEnabled: false) + if lessonListItem.lessonProgress.inProgress { + let resumeLessonModal = getResumeLessonModal(startOverClosure: { + + self.navigateToLesson(restartAtBeginning: true, lessonListItem: lessonListItem, languageFilter: languageFilter) + + }, continueClosure: { + + self.navigateToLesson(restartAtBeginning: false, lessonListItem: lessonListItem, languageFilter: languageFilter) + }) + + navigationController.present(resumeLessonModal, animated: true) + } else { - navigateToToolInAppLanguage(toolDataModelId: lessonListItem.dataModelId, trainingTipsEnabled: false) + navigateToLesson(restartAtBeginning: false, lessonListItem: lessonListItem, languageFilter: languageFilter) } case .lessonLanguageFilterTappedFromLessons: @@ -745,7 +755,7 @@ extension AppFlow { extension AppFlow { - private func navigateToToolInAppLanguage(toolDataModelId: String, trainingTipsEnabled: Bool, shouldPersistToolSettings: Bool = false) { + private func navigateToToolInAppLanguage(toolDataModelId: String, trainingTipsEnabled: Bool, shouldPersistToolSettings: Bool = false, initialPageConfig: MobileContentPagesInitialPageConfig? = nil) { let languagesRepository: LanguagesRepository = appDiContainer.dataLayer.getLanguagesRepository() @@ -758,7 +768,7 @@ extension AppFlow { languageIds = Array() } - navigateToTool(toolDataModelId: toolDataModelId, languageIds: languageIds, selectedLanguageIndex: nil, trainingTipsEnabled: trainingTipsEnabled, shouldPersistToolSettings: shouldPersistToolSettings) + navigateToTool(toolDataModelId: toolDataModelId, languageIds: languageIds, selectedLanguageIndex: nil, trainingTipsEnabled: trainingTipsEnabled, shouldPersistToolSettings: shouldPersistToolSettings, initialPageConfig: initialPageConfig) } private func navigateToToolWithUserToolLanguageSettingsApplied(toolDataModelId: String, trainingTipsEnabled: Bool) { @@ -811,8 +821,23 @@ extension AppFlow { navigateToTool(toolDataModelId: toolDataModelId, languageIds: languageIds, selectedLanguageIndex: selectedLanguageIndex, trainingTipsEnabled: trainingTipsEnabled, shouldPersistToolSettings: shouldPersistToolSettings) } + + private func navigateToLesson(restartAtBeginning: Bool, lessonListItem: LessonListItemDomainModel, languageFilter: LessonFilterLanguageDomainModel?) { + + let initialPageConfig = MobileContentPagesInitialPageConfig( + shouldRestartAtBeginning: restartAtBeginning, + shouldNavigateToStartPageIfLastPage: true, + shouldNavigateToPreviousVisiblePageIfHiddenPage: true + ) - private func navigateToTool(toolDataModelId: String, languageIds: [String], selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, shouldPersistToolSettings: Bool = false) { + if let languageFilter = languageFilter { + navigateToTool(toolDataModelId: lessonListItem.dataModelId, languageIds: [languageFilter.languageId], selectedLanguageIndex: 0, trainingTipsEnabled: false, initialPageConfig: initialPageConfig) + } else { + navigateToToolInAppLanguage(toolDataModelId: lessonListItem.dataModelId, trainingTipsEnabled: false, initialPageConfig: initialPageConfig) + } + } + + private func navigateToTool(toolDataModelId: String, languageIds: [String], selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, shouldPersistToolSettings: Bool = false, initialPageConfig: MobileContentPagesInitialPageConfig? = nil) { let languagesRepository: LanguagesRepository = appDiContainer.dataLayer.getLanguagesRepository() @@ -835,6 +860,7 @@ extension AppFlow { selectedLanguageIndex: selectedLanguageIndex, trainingTipsEnabled: trainingTipsEnabled, initialPage: nil, + initialPageConfig: initialPageConfig, shouldPersistToolSettings: shouldPersistToolSettings ) } @@ -868,6 +894,22 @@ extension AppFlow { } } +// MARK: - Lesson + +extension AppFlow { + + private func getResumeLessonModal(startOverClosure: @escaping () -> Void, continueClosure: @escaping () -> Void) -> UIViewController { + let resumeLessonModal = ResumeLessonProgressModal(startOverClosure: startOverClosure, continueClosure: continueClosure) + + let hostingView = AppHostingController( + rootView: resumeLessonModal, + navigationBar: nil + ) + + return hostingView + } +} + // MARK: - Tutorial extension AppFlow { diff --git a/godtools/App/Flows/Flow/FlowStep.swift b/godtools/App/Flows/Flow/FlowStep.swift index 92fbe1294a..1fcccc6b59 100644 --- a/godtools/App/Flows/Flow/FlowStep.swift +++ b/godtools/App/Flows/Flow/FlowStep.swift @@ -37,6 +37,8 @@ enum FlowStep { case backTappedFromLessonLanguageFilter // lesson + case startOverTappedFromResumeLessonModal + case resumeTappedFromResumeLessonModal case closeTappedFromLesson(lessonId: String, highestPageNumberViewed: Int) case lessonFlowCompleted(state: LessonFlowCompletedState) diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index 3e43d9a68b..cf27836a75 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -24,7 +24,7 @@ class LessonFlow: ToolNavigationFlow, Flow { var tractFlow: TractFlow? var downloadToolTranslationFlow: DownloadToolTranslationsFlow? - init(flowDelegate: FlowDelegate, appDiContainer: AppDiContainer, sharedNavigationController: AppNavigationController, appLanguage: AppLanguageDomainModel, toolTranslations: ToolTranslationsDomainModel, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?) { + init(flowDelegate: FlowDelegate, appDiContainer: AppDiContainer, sharedNavigationController: AppNavigationController, appLanguage: AppLanguageDomainModel, toolTranslations: ToolTranslationsDomainModel, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, initialPageConfig: MobileContentPagesInitialPageConfig?) { self.flowDelegate = flowDelegate self.appDiContainer = appDiContainer @@ -61,7 +61,8 @@ class LessonFlow: ToolNavigationFlow, Flow { renderer: renderer, resource: renderer.resource, primaryLanguage: renderer.languages.primaryLanguage, - initialPage: initialPageOrPreviousProgress, + initialPage: initialPageOrPreviousProgress, + initialPageConfig: initialPageConfig, resourcesRepository: appDiContainer.dataLayer.getResourcesRepository(), translationsRepository: appDiContainer.dataLayer.getTranslationsRepository(), mobileContentEventAnalytics: appDiContainer.getMobileContentRendererEventAnalyticsTracking(), diff --git a/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift b/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift index f868bd767b..8168aaad72 100644 --- a/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift +++ b/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift @@ -35,13 +35,14 @@ extension ToolNavigationFlow { determineToolTranslationsToDownload: determineDeepLinkedToolTranslationsToDownload, liveShareStream: toolDeepLink.liveShareStream, selectedLanguageIndex: toolDeepLink.selectedLanguageIndex, - trainingTipsEnabled: false, - initialPage: toolDeepLink.mobileContentPage, + trainingTipsEnabled: false, + initialPageConfig: nil, + initialPage: toolDeepLink.mobileContentPage, shouldPersistToolSettings: false ) } - func navigateToTool(appLanguage: AppLanguageDomainModel, resourceId: String, languageIds: [String], liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, shouldPersistToolSettings: Bool) { + func navigateToTool(appLanguage: AppLanguageDomainModel, resourceId: String, languageIds: [String], liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, initialPageConfig: MobileContentPagesInitialPageConfig? = nil, shouldPersistToolSettings: Bool) { let determineToolTranslationsToDownload = DetermineToolTranslationsToDownload( resourceId: resourceId, @@ -55,13 +56,14 @@ extension ToolNavigationFlow { determineToolTranslationsToDownload: determineToolTranslationsToDownload, liveShareStream: liveShareStream, selectedLanguageIndex: selectedLanguageIndex, - trainingTipsEnabled: trainingTipsEnabled, - initialPage: initialPage, + trainingTipsEnabled: trainingTipsEnabled, + initialPageConfig: initialPageConfig, + initialPage: initialPage, shouldPersistToolSettings: shouldPersistToolSettings ) } - private func navigateToToolAndDetermineToolTranslationsToDownload(appLanguage: AppLanguageDomainModel, determineToolTranslationsToDownload: DetermineToolTranslationsToDownloadType, liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, shouldPersistToolSettings: Bool) { + private func navigateToToolAndDetermineToolTranslationsToDownload(appLanguage: AppLanguageDomainModel, determineToolTranslationsToDownload: DetermineToolTranslationsToDownloadType, liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPageConfig: MobileContentPagesInitialPageConfig?, initialPage: MobileContentPagesPage?, shouldPersistToolSettings: Bool) { let didDownloadToolTranslationsClosure = { [weak self] (result: Result) in @@ -76,6 +78,7 @@ extension ToolNavigationFlow { selectedLanguageIndex: selectedLanguageIndex, trainingTipsEnabled: trainingTipsEnabled, initialPage: initialPage, + initialPageConfig: initialPageConfig, shouldPersistToolSettings: shouldPersistToolSettings ) @@ -96,7 +99,7 @@ extension ToolNavigationFlow { self.downloadToolTranslationFlow = downloadToolTranslationFlow } - private func navigateToTool(appLanguage: AppLanguageDomainModel, toolTranslations: ToolTranslationsDomainModel, liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, shouldPersistToolSettings: Bool) { + private func navigateToTool(appLanguage: AppLanguageDomainModel, toolTranslations: ToolTranslationsDomainModel, liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, initialPageConfig: MobileContentPagesInitialPageConfig?, shouldPersistToolSettings: Bool) { let resourceType: ResourceType = toolTranslations.tool.resourceTypeEnum @@ -120,7 +123,8 @@ extension ToolNavigationFlow { appLanguage: appLanguage, toolTranslations: toolTranslations, trainingTipsEnabled: trainingTipsEnabled, - initialPage: initialPage + initialPage: initialPage, + initialPageConfig: initialPageConfig ) case .tract: diff --git a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift index d9b48b18cb..ae15667f57 100644 --- a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift +++ b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift @@ -374,6 +374,10 @@ class MobileContentPagesViewModel: NSObject, ObservableObject { private func getInitialPageModel(pageRenderer: MobileContentPageRenderer) -> Page? { + if initialPageConfig.shouldRestartAtBeginning { + return pageRenderer.getVisiblePageModels().first + } + let allPages: [Page] = pageRenderer.getAllPageModels() var page: Page? diff --git a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/Models/MobileContentPagesInitialPageConfig.swift b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/Models/MobileContentPagesInitialPageConfig.swift index b366b49b52..6e22915773 100644 --- a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/Models/MobileContentPagesInitialPageConfig.swift +++ b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/Models/MobileContentPagesInitialPageConfig.swift @@ -10,11 +10,13 @@ import Foundation struct MobileContentPagesInitialPageConfig { + let shouldRestartAtBeginning: Bool let shouldNavigateToStartPageIfLastPage: Bool let shouldNavigateToPreviousVisiblePageIfHiddenPage: Bool - init(shouldNavigateToStartPageIfLastPage: Bool = false, shouldNavigateToPreviousVisiblePageIfHiddenPage: Bool = false) { + init(shouldRestartAtBeginning: Bool = false, shouldNavigateToStartPageIfLastPage: Bool = false, shouldNavigateToPreviousVisiblePageIfHiddenPage: Bool = false) { + self.shouldRestartAtBeginning = shouldRestartAtBeginning self.shouldNavigateToStartPageIfLastPage = shouldNavigateToStartPageIfLastPage self.shouldNavigateToPreviousVisiblePageIfHiddenPage = shouldNavigateToPreviousVisiblePageIfHiddenPage } From 7b70dce95d0beb4e53ecb92374532d0419942caf Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Thu, 7 Nov 2024 15:27:31 -0500 Subject: [PATCH 02/28] present resume lesson modal from lessonViewModel instead --- .../LessonListItemProgressDomainModel.swift | 11 ------ .../Presentation/Lesson/LessonViewModel.swift | 9 ++++- godtools/App/Flows/App/AppFlow.swift | 35 ++----------------- godtools/App/Flows/Flow/FlowStep.swift | 1 + godtools/App/Flows/Lesson/LessonFlow.swift | 22 ++++++++++++ .../Pages/MobileContentPagesViewModel.swift | 25 +++++++++++++ 6 files changed, 58 insertions(+), 45 deletions(-) diff --git a/godtools/App/Features/Lessons/Domain/Entities/LessonListItemProgressDomainModel.swift b/godtools/App/Features/Lessons/Domain/Entities/LessonListItemProgressDomainModel.swift index 226e880fab..11dae084d7 100644 --- a/godtools/App/Features/Lessons/Domain/Entities/LessonListItemProgressDomainModel.swift +++ b/godtools/App/Features/Lessons/Domain/Entities/LessonListItemProgressDomainModel.swift @@ -13,14 +13,3 @@ enum LessonListItemProgressDomainModel { case inProgress(progress: Double, progressString: String) case complete(completeString: String) } - -extension LessonListItemProgressDomainModel { - var inProgress: Bool { - switch self { - case .inProgress: - return true - default: - return false - } - } -} diff --git a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift index 5c0dc8a004..3a2f15af2e 100644 --- a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift +++ b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift @@ -22,9 +22,16 @@ class LessonViewModel: MobileContentPagesViewModel { self.flowDelegate = flowDelegate self.storeLessonProgressUseCase = storeLessonProgressUseCase - let initialPageConfig = initialPageConfig ?? MobileContentPagesInitialPageConfig(shouldRestartAtBeginning: true, shouldNavigateToStartPageIfLastPage: true, shouldNavigateToPreviousVisiblePageIfHiddenPage: true) + let initialPageConfig = MobileContentPagesInitialPageConfig(shouldRestartAtBeginning: false, shouldNavigateToStartPageIfLastPage: true, shouldNavigateToPreviousVisiblePageIfHiddenPage: true) super.init(renderer: renderer, initialPage: initialPage, initialPageConfig: initialPageConfig, resourcesRepository: resourcesRepository, translationsRepository: translationsRepository, mobileContentEventAnalytics: mobileContentEventAnalytics, getCurrentAppLanguageUseCase: getCurrentAppLanguageUseCase, getTranslatedLanguageName: getTranslatedLanguageName, initialPageRenderingType: .visiblePages, trainingTipsEnabled: trainingTipsEnabled, incrementUserCounterUseCase: incrementUserCounterUseCase, selectedLanguageIndex: nil) + + if let initialPage = initialPage, isFirstOrLastVisiblePage(page: initialPage) == false { + + flowDelegate.navigate(step: .presentResumeLessonModal { + self.navigateToFirstPage(animated: true) + }) + } } deinit { diff --git a/godtools/App/Flows/App/AppFlow.swift b/godtools/App/Flows/App/AppFlow.swift index 75ba839c57..9492aa4562 100644 --- a/godtools/App/Flows/App/AppFlow.swift +++ b/godtools/App/Flows/App/AppFlow.swift @@ -203,23 +203,8 @@ class AppFlow: NSObject, ToolNavigationFlow, Flow { } case .lessonTappedFromLessonsList(let lessonListItem, let languageFilter): - - if lessonListItem.lessonProgress.inProgress { - let resumeLessonModal = getResumeLessonModal(startOverClosure: { - - self.navigateToLesson(restartAtBeginning: true, lessonListItem: lessonListItem, languageFilter: languageFilter) - - }, continueClosure: { - - self.navigateToLesson(restartAtBeginning: false, lessonListItem: lessonListItem, languageFilter: languageFilter) - }) - - navigationController.present(resumeLessonModal, animated: true) - - } else { - navigateToLesson(restartAtBeginning: false, lessonListItem: lessonListItem, languageFilter: languageFilter) - } - + navigateToLesson(restartAtBeginning: false, lessonListItem: lessonListItem, languageFilter: languageFilter) + case .lessonLanguageFilterTappedFromLessons: navigationController.pushViewController(getLessonLanguageFilterSelection(), animated: true) @@ -894,22 +879,6 @@ extension AppFlow { } } -// MARK: - Lesson - -extension AppFlow { - - private func getResumeLessonModal(startOverClosure: @escaping () -> Void, continueClosure: @escaping () -> Void) -> UIViewController { - let resumeLessonModal = ResumeLessonProgressModal(startOverClosure: startOverClosure, continueClosure: continueClosure) - - let hostingView = AppHostingController( - rootView: resumeLessonModal, - navigationBar: nil - ) - - return hostingView - } -} - // MARK: - Tutorial extension AppFlow { diff --git a/godtools/App/Flows/Flow/FlowStep.swift b/godtools/App/Flows/Flow/FlowStep.swift index 1fcccc6b59..c692ed6e79 100644 --- a/godtools/App/Flows/Flow/FlowStep.swift +++ b/godtools/App/Flows/Flow/FlowStep.swift @@ -37,6 +37,7 @@ enum FlowStep { case backTappedFromLessonLanguageFilter // lesson + case presentResumeLessonModal(startOverClosure: () -> Void) case startOverTappedFromResumeLessonModal case resumeTappedFromResumeLessonModal case closeTappedFromLesson(lessonId: String, highestPageNumberViewed: Int) diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index cf27836a75..b2200e49d2 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -95,6 +95,17 @@ class LessonFlow: ToolNavigationFlow, Flow { case .deepLink( _): break + case .presentResumeLessonModal(let startOverClosure): + let resumeLessonModal = getResumeLessonModal(startOverClosure: { + startOverClosure() + self.navigationController.dismissPresented(animated: true, completion: nil) + + }, continueClosure: { + self.navigationController.dismissPresented(animated: true, completion: nil) + }) + + navigationController.present(resumeLessonModal, animated: true) + case .closeTappedFromLesson(let lessonId, let highestPageNumberViewed): closeTool(lessonId: lessonId, highestPageNumberViewed: highestPageNumberViewed) @@ -136,6 +147,17 @@ class LessonFlow: ToolNavigationFlow, Flow { } } + private func getResumeLessonModal(startOverClosure: @escaping () -> Void, continueClosure: @escaping () -> Void) -> UIViewController { + let resumeLessonModal = ResumeLessonProgressModal(startOverClosure: startOverClosure, continueClosure: continueClosure) + + let hostingView = AppHostingController( + rootView: resumeLessonModal, + navigationBar: nil + ) + + return hostingView + } + private func closeTool(lessonId: String, highestPageNumberViewed: Int) { flowDelegate?.navigate(step: .lessonFlowCompleted(state: .userClosedLesson(lessonId: lessonId, highestPageNumberViewed: highestPageNumberViewed))) diff --git a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift index ae15667f57..c9e347b459 100644 --- a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift +++ b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift @@ -172,6 +172,22 @@ class MobileContentPagesViewModel: NSObject, ObservableObject { return pageModels[index] } + func isFirstOrLastVisiblePage(page: MobileContentPagesPage) -> Bool { + let visiblePages = currentPageRenderer.value.getVisiblePageModels() + + switch page { + case .pageId(let id): + let firstVisiblePage = visiblePages.first + let lastVisiblePage = visiblePages.last + + return firstVisiblePage?.id == id || lastVisiblePage?.id == id + + case .pageNumber(let pageNumber): + let visiblePageCount = visiblePages.count + return pageNumber == 0 || pageNumber == visiblePageCount + } + } + func createToolSettingsLanguages() -> ToolSettingsLanguages { return ToolSettingsLanguages( primaryLanguageId: languages[0].id, @@ -476,6 +492,15 @@ class MobileContentPagesViewModel: NSObject, ObservableObject { return true } + func navigateToFirstPage(animated: Bool) { + + guard let page = getPage(index: 0) else { + return + } + + navigateToPage(page: page, animated: animated) + } + func navigateToPreviousPage(animated: Bool) { guard let page = getPage(index: currentRenderedPageNumber - 1) else { From 757c417da4fa9f55c03f9ce39a5b400cc7925d5b Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Tue, 12 Nov 2024 20:07:47 -0500 Subject: [PATCH 03/28] add blurred background view --- godtools.xcodeproj/project.pbxproj | 12 ++++++ .../ResumeLessonProgressModal.swift | 40 ++++++++++++++----- godtools/App/Flows/Lesson/LessonFlow.swift | 3 ++ .../VisualEffectView/VisualEffectView.swift | 23 +++++++++++ 4 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 godtools/App/Share/SwiftUI Views/VisualEffectView/VisualEffectView.swift diff --git a/godtools.xcodeproj/project.pbxproj b/godtools.xcodeproj/project.pbxproj index a9718ce659..4481d4e8c3 100644 --- a/godtools.xcodeproj/project.pbxproj +++ b/godtools.xcodeproj/project.pbxproj @@ -1547,6 +1547,7 @@ D4960CC82CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CC72CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift */; }; D4960CCC2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCB2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift */; }; D4960CCE2CD177980090B114 /* ResumeLessonProgressModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */; }; + D4960CD02CE429D80090B114 /* VisualEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCF2CE429D80090B114 /* VisualEffectView.swift */; }; D496B9062A9E702200CBEA19 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = D496B9052A9E702200CBEA19 /* SearchBar.swift */; }; D4997E0E28D4CED800205B4C /* YouTubeiOSPlayerHelper in Frameworks */ = {isa = PBXBuildFile; productRef = D4997E0D28D4CED800205B4C /* YouTubeiOSPlayerHelper */; }; D4AFA4452BAC93B400318023 /* ToolFilterLanguagesInterfaceStringsDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4AFA4442BAC93B400318023 /* ToolFilterLanguagesInterfaceStringsDomainModel.swift */; }; @@ -3262,6 +3263,7 @@ D4960CC72CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserLessonProgressDomainModel.swift; sourceTree = ""; }; D4960CCB2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MobileContentPagesInitialPageConfig.swift; sourceTree = ""; }; D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeLessonProgressModal.swift; sourceTree = ""; }; + D4960CCF2CE429D80090B114 /* VisualEffectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualEffectView.swift; sourceTree = ""; }; D496B9052A9E702200CBEA19 /* SearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = ""; }; D4AFA4442BAC93B400318023 /* ToolFilterLanguagesInterfaceStringsDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolFilterLanguagesInterfaceStringsDomainModel.swift; sourceTree = ""; }; D4AFA4462BAC950800318023 /* GetToolFilterLanguagesInterfaceStringsRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetToolFilterLanguagesInterfaceStringsRepositoryInterface.swift; sourceTree = ""; }; @@ -11451,6 +11453,7 @@ 45325F20285CF8B40078D932 /* TextWithLinks */, 45E585242A8E77F3005B20A6 /* TwoRowHStack */, 45325F1D285CF8B40078D932 /* VideoView */, + D4960CD12CE42A280090B114 /* VisualEffectView */, ); path = "SwiftUI Views"; sourceTree = ""; @@ -11595,6 +11598,14 @@ path = GetTranslatedPercentage; sourceTree = ""; }; + D4960CD12CE42A280090B114 /* VisualEffectView */ = { + isa = PBXGroup; + children = ( + D4960CCF2CE429D80090B114 /* VisualEffectView.swift */, + ); + path = VisualEffectView; + sourceTree = ""; + }; D4B05FF3291061E8005852D0 /* MobileContentAuthTokenRepository */ = { isa = PBXGroup; children = ( @@ -12830,6 +12841,7 @@ 4534F91E2AE99EAA00A7A071 /* GetLessonEvaluationInterfaceStringsRepositoryInterface.swift in Sources */, 458B91AF2B7D5D6800785C6F /* YourFavoriteToolsHeaderView.swift in Sources */, D455F3FE29805BF0009D5F93 /* GetUserActivityBadgeUseCase.swift in Sources */, + D4960CD02CE429D80090B114 /* VisualEffectView.swift in Sources */, 4534F9282AE9A15E00A7A071 /* LessonEvaluationInterfaceStringsDomainModel.swift in Sources */, 45880D812BD2BA97008F021C /* ShareGodToolsView.swift in Sources */, 456BD2CC27020C75004D7B19 /* MobileContentViewHeightConstraintType.swift in Sources */, diff --git a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift index e2648566a3..9a6e94c63f 100644 --- a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift +++ b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift @@ -20,17 +20,39 @@ struct ResumeLessonProgressModal: View { } var body: some View { - Text("Resume Progress") - - Text("Pickup where you left off?") - - HStack { - GTWhiteButton(title: "Start Over", width: 133, height: buttonHeight) { - startOverClosure() + + ZStack { + if #available(iOS 15.0, *) { + Color.clear + .edgesIgnoringSafeArea(.all) + .background(.ultraThinMaterial) + } else { + VisualEffectView(effect: UIBlurEffect(style: .systemUltraThinMaterial)) + .edgesIgnoringSafeArea(.all) } - GTBlueButton(title: "Continue", width: 133, height: buttonHeight) { - continueClosure() + + VStack { + Text("Resume Progress") + + Text("Pickup where you left off?") + + HStack { + GTWhiteButton(title: "Start Over", width: 133, height: buttonHeight) { + startOverClosure() + } + GTBlueButton(title: "Continue", width: 133, height: buttonHeight) { + continueClosure() + } + } } + .background(Color.white) + .cornerRadius(6) + .shadow(color: Color.black.opacity(0.25), radius: 3, y: 3) + .overlay( + RoundedRectangle(cornerRadius: 6) + .strokeBorder(Color.clear, lineWidth: 2) + ) } + } } diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index b2200e49d2..2875545b8d 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -155,6 +155,9 @@ class LessonFlow: ToolNavigationFlow, Flow { navigationBar: nil ) + hostingView.view.backgroundColor = .clear + hostingView.modalPresentationStyle = .overFullScreen + return hostingView } diff --git a/godtools/App/Share/SwiftUI Views/VisualEffectView/VisualEffectView.swift b/godtools/App/Share/SwiftUI Views/VisualEffectView/VisualEffectView.swift new file mode 100644 index 0000000000..08768a6e32 --- /dev/null +++ b/godtools/App/Share/SwiftUI Views/VisualEffectView/VisualEffectView.swift @@ -0,0 +1,23 @@ +// +// VisualEffectView.swift +// godtools +// +// Created by Rachael Skeath on 11/12/24. +// Copyright © 2024 Cru. All rights reserved. +// + +import Foundation +import SwiftUI + +struct VisualEffectView: UIViewRepresentable { + + var effect: UIVisualEffect? + + func makeUIView(context: UIViewRepresentableContext) -> UIVisualEffectView { + return UIVisualEffectView() + } + + func updateUIView(_ uiView: UIVisualEffectView, context: UIViewRepresentableContext) { + uiView.effect = effect + } +} From 2a0091d1353557496c2245f9f11edc843764019d Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Wed, 13 Nov 2024 15:48:50 -0500 Subject: [PATCH 04/28] adjust modal spacing --- .../ResumeLessonProgressModal.swift | 71 ++++++++++++------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift index 9a6e94c63f..8449c2bc67 100644 --- a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift +++ b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift @@ -11,6 +11,9 @@ import SwiftUI struct ResumeLessonProgressModal: View { private let buttonHeight: CGFloat = 48 + private let modalInset: CGFloat = 28 + private let buttonInset: CGFloat = 20 + private let buttonSpace: CGFloat = 12 private let startOverClosure: () -> Void private let continueClosure: () -> Void @@ -20,38 +23,52 @@ struct ResumeLessonProgressModal: View { } var body: some View { - - ZStack { - if #available(iOS 15.0, *) { - Color.clear - .edgesIgnoringSafeArea(.all) - .background(.ultraThinMaterial) - } else { - VisualEffectView(effect: UIBlurEffect(style: .systemUltraThinMaterial)) - .edgesIgnoringSafeArea(.all) - } + GeometryReader { geometry in + let totalSpaceAroundButtons = (buttonInset * 2) + buttonSpace + let totalSpaceAroundModal = modalInset * 2 + let buttonWidth = (geometry.size.width - totalSpaceAroundModal - totalSpaceAroundButtons) / 2 - VStack { - Text("Resume Progress") - - Text("Pickup where you left off?") + ZStack { + if #available(iOS 15.0, *) { + Color.clear + .edgesIgnoringSafeArea(.all) + .background(.ultraThinMaterial) + } else { + VisualEffectView(effect: UIBlurEffect(style: .systemUltraThinMaterial)) + .edgesIgnoringSafeArea(.all) + } - HStack { - GTWhiteButton(title: "Start Over", width: 133, height: buttonHeight) { - startOverClosure() - } - GTBlueButton(title: "Continue", width: 133, height: buttonHeight) { - continueClosure() + VStack(spacing: 0) { + Text("Resume Progress") + .font(FontLibrary.sfProTextRegular.font(size: 28)) + .foregroundColor(ColorPalette.gtGrey.color) + .padding(.top, 30) + .padding(.bottom, 15) + + Text("Pickup where you left off?") + .font(FontLibrary.sfProTextRegular.font(size: 16)) + .foregroundColor(ColorPalette.gtGrey.color) + .padding(.bottom, 35) + + HStack(spacing: buttonSpace) { + GTWhiteButton(title: "Start Over", width: buttonWidth, height: buttonHeight) { + startOverClosure() + } + GTBlueButton(title: "Continue", width: buttonWidth, height: buttonHeight) { + continueClosure() + } } + .padding(.horizontal, buttonInset) + .padding(.bottom, 21) } + .background(Color.white) + .cornerRadius(6) + .shadow(color: Color.black.opacity(0.25), radius: 3, y: 3) + .overlay( + RoundedRectangle(cornerRadius: 6) + .strokeBorder(Color.clear, lineWidth: 2) + ) } - .background(Color.white) - .cornerRadius(6) - .shadow(color: Color.black.opacity(0.25), radius: 3, y: 3) - .overlay( - RoundedRectangle(cornerRadius: 6) - .strokeBorder(Color.clear, lineWidth: 2) - ) } } From 795a9d731f77a5b2c7b8308c2bce223f2753cb12 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 18:10:09 +0000 Subject: [PATCH 05/28] Update codecov/codecov-action action to v5 --- .github/workflows/run-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index a07f879df1..1c01e1c5af 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -30,7 +30,7 @@ jobs: run: bundle exec fastlane cru_shared_lane_run_tests output_directory:fastlane_scan_output_directory result_bundle:true reset_simulator:true should_clear_derived_data:true - name: Upload Xcode Code Coverage Report to CodeCov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: fail_ci_if_error: true token: ${{ secrets.CODECOV_TOKEN }} From 7ca593394253657546c1cef26620c52cf8632a38 Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Thu, 14 Nov 2024 15:46:17 -0500 Subject: [PATCH 06/28] add use case and view model to get interface strings --- godtools.xcodeproj/project.pbxproj | 30 +++++++++- ...gressModalInterfaceStringsRepository.swift | 35 +++++++++++ ...rLessonProgressDataLayerDependencies.swift | 6 ++ ...essonProgressDomainLayerDependencies.swift | 6 ++ ...ressModalInterfaceStringsDomainModel.swift | 20 +++++++ ...lInterfaceStringsRepositoryInterface.swift | 15 +++++ ...ProgressModalInterfaceStringsUseCase.swift | 27 +++++++++ .../ResumeLessonProgressModal.swift | 21 ++++--- .../ResumeLessonProgressModalViewModel.swift | 59 +++++++++++++++++++ godtools/App/Flows/Lesson/LessonFlow.swift | 10 +++- godtools/Base.lproj/Localizable.strings | 5 ++ 11 files changed, 221 insertions(+), 13 deletions(-) create mode 100644 godtools/App/Features/UserLessonProgress/Data-DomainInterface/GetResumeLessonProgressModalInterfaceStringsRepository.swift create mode 100644 godtools/App/Features/UserLessonProgress/Domain/Entities/ResumeLessonProgressModalInterfaceStringsDomainModel.swift create mode 100644 godtools/App/Features/UserLessonProgress/Domain/Interface/GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift create mode 100644 godtools/App/Features/UserLessonProgress/Domain/UseCases/GetResumeLessonProgressModalInterfaceStringsUseCase.swift rename godtools/App/Features/UserLessonProgress/Presentation/{ => ResumeLessonProgressModal}/ResumeLessonProgressModal.swift (75%) create mode 100644 godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModalViewModel.swift diff --git a/godtools.xcodeproj/project.pbxproj b/godtools.xcodeproj/project.pbxproj index 4481d4e8c3..fefb14b667 100644 --- a/godtools.xcodeproj/project.pbxproj +++ b/godtools.xcodeproj/project.pbxproj @@ -1548,6 +1548,11 @@ D4960CCC2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCB2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift */; }; D4960CCE2CD177980090B114 /* ResumeLessonProgressModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */; }; D4960CD02CE429D80090B114 /* VisualEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCF2CE429D80090B114 /* VisualEffectView.swift */; }; + D4960CD32CE688140090B114 /* GetResumeLessonProgressModalInterfaceStringsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CD22CE688140090B114 /* GetResumeLessonProgressModalInterfaceStringsRepository.swift */; }; + D4960CD52CE6886B0090B114 /* ResumeLessonProgressModalInterfaceStringsDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CD42CE6886B0090B114 /* ResumeLessonProgressModalInterfaceStringsDomainModel.swift */; }; + D4960CD82CE6934E0090B114 /* ResumeLessonProgressModalViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CD72CE6934E0090B114 /* ResumeLessonProgressModalViewModel.swift */; }; + D4960CDA2CE694280090B114 /* GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CD92CE694280090B114 /* GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift */; }; + D4960CDC2CE694F00090B114 /* GetResumeLessonProgressModalInterfaceStringsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CDB2CE694F00090B114 /* GetResumeLessonProgressModalInterfaceStringsUseCase.swift */; }; D496B9062A9E702200CBEA19 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = D496B9052A9E702200CBEA19 /* SearchBar.swift */; }; D4997E0E28D4CED800205B4C /* YouTubeiOSPlayerHelper in Frameworks */ = {isa = PBXBuildFile; productRef = D4997E0D28D4CED800205B4C /* YouTubeiOSPlayerHelper */; }; D4AFA4452BAC93B400318023 /* ToolFilterLanguagesInterfaceStringsDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4AFA4442BAC93B400318023 /* ToolFilterLanguagesInterfaceStringsDomainModel.swift */; }; @@ -3264,6 +3269,11 @@ D4960CCB2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MobileContentPagesInitialPageConfig.swift; sourceTree = ""; }; D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeLessonProgressModal.swift; sourceTree = ""; }; D4960CCF2CE429D80090B114 /* VisualEffectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualEffectView.swift; sourceTree = ""; }; + D4960CD22CE688140090B114 /* GetResumeLessonProgressModalInterfaceStringsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetResumeLessonProgressModalInterfaceStringsRepository.swift; sourceTree = ""; }; + D4960CD42CE6886B0090B114 /* ResumeLessonProgressModalInterfaceStringsDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeLessonProgressModalInterfaceStringsDomainModel.swift; sourceTree = ""; }; + D4960CD72CE6934E0090B114 /* ResumeLessonProgressModalViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeLessonProgressModalViewModel.swift; sourceTree = ""; }; + D4960CD92CE694280090B114 /* GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift; sourceTree = ""; }; + D4960CDB2CE694F00090B114 /* GetResumeLessonProgressModalInterfaceStringsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetResumeLessonProgressModalInterfaceStringsUseCase.swift; sourceTree = ""; }; D496B9052A9E702200CBEA19 /* SearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = ""; }; D4AFA4442BAC93B400318023 /* ToolFilterLanguagesInterfaceStringsDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolFilterLanguagesInterfaceStringsDomainModel.swift; sourceTree = ""; }; D4AFA4462BAC950800318023 /* GetToolFilterLanguagesInterfaceStringsRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetToolFilterLanguagesInterfaceStringsRepositoryInterface.swift; sourceTree = ""; }; @@ -11586,6 +11596,7 @@ isa = PBXGroup; children = ( D4960CC72CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift */, + D4960CD42CE6886B0090B114 /* ResumeLessonProgressModalInterfaceStringsDomainModel.swift */, ); path = Entities; sourceTree = ""; @@ -11606,6 +11617,15 @@ path = VisualEffectView; sourceTree = ""; }; + D4960CD62CE693320090B114 /* ResumeLessonProgressModal */ = { + isa = PBXGroup; + children = ( + D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */, + D4960CD72CE6934E0090B114 /* ResumeLessonProgressModalViewModel.swift */, + ); + path = ResumeLessonProgressModal; + sourceTree = ""; + }; D4B05FF3291061E8005852D0 /* MobileContentAuthTokenRepository */ = { isa = PBXGroup; children = ( @@ -11910,6 +11930,7 @@ isa = PBXGroup; children = ( D4960CC12CBDE40B0090B114 /* GetLessonListItemProgressRepository.swift */, + D4960CD22CE688140090B114 /* GetResumeLessonProgressModalInterfaceStringsRepository.swift */, D4E7EE252CA5E62B00F75DA6 /* StoreUserLessonProgressRepository.swift */, ); path = "Data-DomainInterface"; @@ -11929,7 +11950,7 @@ isa = PBXGroup; children = ( D4E7EE062C90E5D800F75DA6 /* LessonCompletionProgressBar.swift */, - D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */, + D4960CD62CE693320090B114 /* ResumeLessonProgressModal */, ); path = Presentation; sourceTree = ""; @@ -11955,6 +11976,7 @@ D4E7EE112CA3424A00F75DA6 /* Interface */ = { isa = PBXGroup; children = ( + D4960CD92CE694280090B114 /* GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift */, D4E7EE232CA5E61900F75DA6 /* StoreLessonProgressRepositoryInterface.swift */, ); path = Interface; @@ -11963,6 +11985,7 @@ D4E7EE122CA3425600F75DA6 /* UseCases */ = { isa = PBXGroup; children = ( + D4960CDB2CE694F00090B114 /* GetResumeLessonProgressModalInterfaceStringsUseCase.swift */, D4E7EE212CA5E5CA00F75DA6 /* StoreUserLessonProgressUseCase.swift */, ); path = UseCases; @@ -12526,6 +12549,7 @@ 45D63E89288F75B0009B4610 /* AttachmentModel.swift in Sources */, 4561B406295B32E700F5AF5B /* OnboardingTutorialViewModel.swift in Sources */, 45AD20BD25938F1A00A096A0 /* Signal.swift in Sources */, + D4960CD82CE6934E0090B114 /* ResumeLessonProgressModalViewModel.swift in Sources */, 4561AC9C279C4CD4003718C0 /* MobileContentCardCollectionPageViewModel.swift in Sources */, 450D7B0428E32965006C3FDF /* DownloadedTranslationDataModel.swift in Sources */, 45BE4A862AF287F0004021DA /* ViewConfirmAppLanguageUseCase.swift in Sources */, @@ -12545,6 +12569,7 @@ 45EC5CF228CA2A4A0000AA2E /* ResourceModel+LanguageSupportable.swift in Sources */, 4563D99F2A94FC4700E0701C /* InfoPlist.swift in Sources */, 455EE8462AEC59F500C3205C /* DownloadToolProgressFeatureDomainLayerDependencies.swift in Sources */, + D4960CD32CE688140090B114 /* GetResumeLessonProgressModalInterfaceStringsRepository.swift in Sources */, 454ADAE42ABDDC5200037C27 /* ChooseAppLanguageFlow.swift in Sources */, 4526EDD62AEB330100D1A3D4 /* OverlayNavigationController.swift in Sources */, 455583C4269F2DA500C3FF14 /* MobileContentPageViewFactoryType.swift in Sources */, @@ -12740,6 +12765,7 @@ 459BF7812AFEE0320053BA09 /* ToolScreenShareTutorialViewsRepository.swift in Sources */, 45F71626290A12D70019B715 /* WebContent.swift in Sources */, 4561C41227C6891600C4A367 /* MobileContentAccordionSectionViewModel.swift in Sources */, + D4960CD52CE6886B0090B114 /* ResumeLessonProgressModalInterfaceStringsDomainModel.swift in Sources */, 45CE95882B7C04B000A09340 /* StoreInitialAppLanguageInterface.swift in Sources */, 4572E4B228CBCF120014DB2E /* FavoritingToolMessageCache.swift in Sources */, 45EB9B7529F16CF200CA74A8 /* UIView+Animations.swift in Sources */, @@ -13408,6 +13434,7 @@ 45BDA64E2954FF08007E259B /* WebArchiveQueue.swift in Sources */, 453E00022B29F16D00029402 /* GetToolSettingsParallelLanguageRepository.swift in Sources */, 45E8FAA42882FD4B00D7D569 /* SHA256FileModelType.swift in Sources */, + D4960CDC2CE694F00090B114 /* GetResumeLessonProgressModalInterfaceStringsUseCase.swift in Sources */, 452486D32B07C98B007AD932 /* StoreUserToolFiltersRepositoryInterface.swift in Sources */, 45A464CD2A7BE18800E8BAF0 /* FirebaseAnalytics+MobileContentRendererAnalyticsSystem.swift in Sources */, 4573133928C1821100481640 /* ToolDetailsVersionsView.swift in Sources */, @@ -13865,6 +13892,7 @@ 453F84D62A029FC00005101E /* ArticleAemRepositoryType.swift in Sources */, 455582EA269F2C1000C3FF14 /* TrainingPageViewModel.swift in Sources */, D409F2B3292BEDEC00D9D2FE /* GetUserAccountDetailsUseCase.swift in Sources */, + D4960CDA2CE694280090B114 /* GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift in Sources */, 458CFEA629D4E172007B423C /* UserActivityStatDomainModel.swift in Sources */, 450D4FAB2B7FFA23001DD006 /* ToolsInterfaceStringsDomainModel.swift in Sources */, 45AD1BDE25938A4F00A096A0 /* GTSegment.swift in Sources */, diff --git a/godtools/App/Features/UserLessonProgress/Data-DomainInterface/GetResumeLessonProgressModalInterfaceStringsRepository.swift b/godtools/App/Features/UserLessonProgress/Data-DomainInterface/GetResumeLessonProgressModalInterfaceStringsRepository.swift new file mode 100644 index 0000000000..6ed139be64 --- /dev/null +++ b/godtools/App/Features/UserLessonProgress/Data-DomainInterface/GetResumeLessonProgressModalInterfaceStringsRepository.swift @@ -0,0 +1,35 @@ +// +// GetResumeLessonProgressModalInterfaceStringsRepository.swift +// godtools +// +// Created by Rachael Skeath on 11/14/24. +// Copyright © 2024 Cru. All rights reserved. +// + +import Foundation +import Combine +import LocalizationServices + +class GetResumeLessonProgressModalInterfaceStringsRepository: GetResumeLessonProgressModalInterfaceStringsRepositoryInterface { + + private let localizationServices: LocalizationServices + + init(localizationServices: LocalizationServices) { + self.localizationServices = localizationServices + } + + func getStringsPublisher(translateInLanguage: AppLanguageDomainModel) -> AnyPublisher { + + let localeId: String = translateInLanguage.localeId + + let interfaceStrings = ResumeLessonProgressModalInterfaceStringsDomainModel( + title: localizationServices.stringForLocaleElseEnglish(localeIdentifier: localeId, key: "lessons.resumeLessonModal.title"), + subtitle: localizationServices.stringForLocaleElseEnglish(localeIdentifier: localeId, key: "lessons.resumeLessonModal.subtitle"), + startOverButtonText: localizationServices.stringForLocaleElseEnglish(localeIdentifier: localeId, key: "lessons.resumeLessonModal.startOverButton"), + continueButtonText: localizationServices.stringForLocaleElseEnglish(localeIdentifier: localeId, key: "lessons.resumeLessonModal.continueButton") + ) + + return Just(interfaceStrings) + .eraseToAnyPublisher() + } +} diff --git a/godtools/App/Features/UserLessonProgress/DependencyContainer/UserLessonProgressDataLayerDependencies.swift b/godtools/App/Features/UserLessonProgress/DependencyContainer/UserLessonProgressDataLayerDependencies.swift index 45e0da7529..5db86d9f6c 100644 --- a/godtools/App/Features/UserLessonProgress/DependencyContainer/UserLessonProgressDataLayerDependencies.swift +++ b/godtools/App/Features/UserLessonProgress/DependencyContainer/UserLessonProgressDataLayerDependencies.swift @@ -20,6 +20,12 @@ class UserLessonProgressDataLayerDependencies { // MARK: - Domain Interface + func getResumeLessonProgressModalInterfaceStringsRepositoryInterface() -> GetResumeLessonProgressModalInterfaceStringsRepositoryInterface { + return GetResumeLessonProgressModalInterfaceStringsRepository( + localizationServices: coreDataLayer.getLocalizationServices() + ) + } + func getStoreUserLessonProgressRepositoryInterface() -> StoreUserLessonProgressRepositoryInterface { return StoreUserLessonProgressRepository( lessonProgressRepository: coreDataLayer.getUserLessonProgressRepository() diff --git a/godtools/App/Features/UserLessonProgress/DependencyContainer/UserLessonProgressDomainLayerDependencies.swift b/godtools/App/Features/UserLessonProgress/DependencyContainer/UserLessonProgressDomainLayerDependencies.swift index b7638f65cf..5a3d3136c6 100644 --- a/godtools/App/Features/UserLessonProgress/DependencyContainer/UserLessonProgressDomainLayerDependencies.swift +++ b/godtools/App/Features/UserLessonProgress/DependencyContainer/UserLessonProgressDomainLayerDependencies.swift @@ -18,6 +18,12 @@ class UserLessonProgressDomainLayerDependencies { self.coreDataLayer = coreDataLayer } + func getResumeLessonProgressModalInterfaceStringsUseCase() -> GetResumeLessonProgressModalInterfaceStringsUseCase { + return GetResumeLessonProgressModalInterfaceStringsUseCase( + getResumeLessonModalInterfaceStringsRepo: dataLayer.getResumeLessonProgressModalInterfaceStringsRepositoryInterface() + ) + } + func getStoreUserLessonProgressUseCase() -> StoreUserLessonProgressUseCase { return StoreUserLessonProgressUseCase( storeLessonProgressRepository: dataLayer.getStoreUserLessonProgressRepositoryInterface() diff --git a/godtools/App/Features/UserLessonProgress/Domain/Entities/ResumeLessonProgressModalInterfaceStringsDomainModel.swift b/godtools/App/Features/UserLessonProgress/Domain/Entities/ResumeLessonProgressModalInterfaceStringsDomainModel.swift new file mode 100644 index 0000000000..75d3f393e6 --- /dev/null +++ b/godtools/App/Features/UserLessonProgress/Domain/Entities/ResumeLessonProgressModalInterfaceStringsDomainModel.swift @@ -0,0 +1,20 @@ +// +// ResumeLessonProgressModalInterfaceStringsDomainModel.swift +// godtools +// +// Created by Rachael Skeath on 11/14/24. +// Copyright © 2024 Cru. All rights reserved. +// + +import Foundation + +struct ResumeLessonProgressModalInterfaceStringsDomainModel { + let title: String + let subtitle: String + let startOverButtonText: String + let continueButtonText: String + + static func emptyStrings() -> ResumeLessonProgressModalInterfaceStringsDomainModel { + return ResumeLessonProgressModalInterfaceStringsDomainModel(title: "", subtitle: "", startOverButtonText: "", continueButtonText: "") + } +} diff --git a/godtools/App/Features/UserLessonProgress/Domain/Interface/GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift b/godtools/App/Features/UserLessonProgress/Domain/Interface/GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift new file mode 100644 index 0000000000..58db2a3851 --- /dev/null +++ b/godtools/App/Features/UserLessonProgress/Domain/Interface/GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift @@ -0,0 +1,15 @@ +// +// GetResumeLessonProgressModalInterfaceStringsRepositoryInterface.swift +// godtools +// +// Created by Rachael Skeath on 11/14/24. +// Copyright © 2024 Cru. All rights reserved. +// + +import Foundation +import Combine + +protocol GetResumeLessonProgressModalInterfaceStringsRepositoryInterface { + + func getStringsPublisher(translateInLanguage: AppLanguageDomainModel) -> AnyPublisher +} diff --git a/godtools/App/Features/UserLessonProgress/Domain/UseCases/GetResumeLessonProgressModalInterfaceStringsUseCase.swift b/godtools/App/Features/UserLessonProgress/Domain/UseCases/GetResumeLessonProgressModalInterfaceStringsUseCase.swift new file mode 100644 index 0000000000..1eaffa4f16 --- /dev/null +++ b/godtools/App/Features/UserLessonProgress/Domain/UseCases/GetResumeLessonProgressModalInterfaceStringsUseCase.swift @@ -0,0 +1,27 @@ +// +// GetResumeLessonProgressModalInterfaceStringsUseCase.swift +// godtools +// +// Created by Rachael Skeath on 11/14/24. +// Copyright © 2024 Cru. All rights reserved. +// + +import Foundation +import Combine + +class GetResumeLessonProgressModalInterfaceStringsUseCase { + + private let getResumeLessonModalInterfaceStringsRepo: GetResumeLessonProgressModalInterfaceStringsRepositoryInterface + + init(getResumeLessonModalInterfaceStringsRepo: GetResumeLessonProgressModalInterfaceStringsRepositoryInterface) { + self.getResumeLessonModalInterfaceStringsRepo = getResumeLessonModalInterfaceStringsRepo + } + + func getStringsPublisher(appLanguage: AppLanguageDomainModel) -> AnyPublisher { + + return getResumeLessonModalInterfaceStringsRepo + .getStringsPublisher(translateInLanguage: appLanguage) + .eraseToAnyPublisher() + } + +} diff --git a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift similarity index 75% rename from godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift rename to godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift index 8449c2bc67..825c82f1f3 100644 --- a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal.swift +++ b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift @@ -14,12 +14,11 @@ struct ResumeLessonProgressModal: View { private let modalInset: CGFloat = 28 private let buttonInset: CGFloat = 20 private let buttonSpace: CGFloat = 12 - private let startOverClosure: () -> Void - private let continueClosure: () -> Void + + @ObservedObject private var viewModel: ResumeLessonProgressModalViewModel - init(startOverClosure: @escaping () -> Void, continueClosure: @escaping () -> Void) { - self.startOverClosure = startOverClosure - self.continueClosure = continueClosure + init(viewModel: ResumeLessonProgressModalViewModel) { + self.viewModel = viewModel } var body: some View { @@ -39,23 +38,23 @@ struct ResumeLessonProgressModal: View { } VStack(spacing: 0) { - Text("Resume Progress") + Text(viewModel.interfaceStringsDomainModel.title) .font(FontLibrary.sfProTextRegular.font(size: 28)) .foregroundColor(ColorPalette.gtGrey.color) .padding(.top, 30) .padding(.bottom, 15) - Text("Pickup where you left off?") + Text(viewModel.interfaceStringsDomainModel.subtitle) .font(FontLibrary.sfProTextRegular.font(size: 16)) .foregroundColor(ColorPalette.gtGrey.color) .padding(.bottom, 35) HStack(spacing: buttonSpace) { - GTWhiteButton(title: "Start Over", width: buttonWidth, height: buttonHeight) { - startOverClosure() + GTWhiteButton(title: viewModel.interfaceStringsDomainModel.startOverButtonText, width: buttonWidth, height: buttonHeight) { + viewModel.startOverButtonTapped() } - GTBlueButton(title: "Continue", width: buttonWidth, height: buttonHeight) { - continueClosure() + GTBlueButton(title: viewModel.interfaceStringsDomainModel.continueButtonText, width: buttonWidth, height: buttonHeight) { + viewModel.continueButtonTapped() } } .padding(.horizontal, buttonInset) diff --git a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModalViewModel.swift b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModalViewModel.swift new file mode 100644 index 0000000000..dba914e64c --- /dev/null +++ b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModalViewModel.swift @@ -0,0 +1,59 @@ +// +// ResumeLessonProgressModalViewModel.swift +// godtools +// +// Created by Rachael Skeath on 11/14/24. +// Copyright © 2024 Cru. All rights reserved. +// + +import Foundation +import Combine + +class ResumeLessonProgressModalViewModel: ObservableObject { + + private let getInterfaceStringsUseCase: GetResumeLessonProgressModalInterfaceStringsUseCase + private let getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase + private let startOverClosure: () -> Void + private let continueClosure: () -> Void + + private var cancellables: Set = Set() + + @Published private var appLanguage: AppLanguageDomainModel = LanguageCodeDomainModel.english.rawValue + + @Published var interfaceStringsDomainModel: ResumeLessonProgressModalInterfaceStringsDomainModel = ResumeLessonProgressModalInterfaceStringsDomainModel.emptyStrings() + + init(getInterfaceStringsUseCase: GetResumeLessonProgressModalInterfaceStringsUseCase, getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase, startOverClosure: @escaping () -> Void, continueClosure: @escaping () -> Void) { + self.getInterfaceStringsUseCase = getInterfaceStringsUseCase + self.getCurrentAppLanguageUseCase = getCurrentAppLanguageUseCase + self.startOverClosure = startOverClosure + self.continueClosure = continueClosure + + getCurrentAppLanguageUseCase + .getLanguagePublisher() + .receive(on: DispatchQueue.main) + .assign(to: &$appLanguage) + + $appLanguage + .dropFirst() + .map { appLanguage in + getInterfaceStringsUseCase.getStringsPublisher(appLanguage: appLanguage) + } + .switchToLatest() + .receive(on: DispatchQueue.main) + .sink { [weak self] interfaceStrings in + + self?.interfaceStringsDomainModel = interfaceStrings + } + .store(in: &cancellables) + } + + // MARK: - Inputs + + func startOverButtonTapped() { + startOverClosure() + } + + func continueButtonTapped() { + continueClosure() + } +} diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index 2875545b8d..68853b3aa7 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -148,7 +148,14 @@ class LessonFlow: ToolNavigationFlow, Flow { } private func getResumeLessonModal(startOverClosure: @escaping () -> Void, continueClosure: @escaping () -> Void) -> UIViewController { - let resumeLessonModal = ResumeLessonProgressModal(startOverClosure: startOverClosure, continueClosure: continueClosure) + let viewModel = ResumeLessonProgressModalViewModel( + getInterfaceStringsUseCase: appDiContainer.feature.lessonProgress.domainLayer.getResumeLessonProgressModalInterfaceStringsUseCase(), + getCurrentAppLanguageUseCase: appDiContainer.feature.appLanguage.domainLayer.getCurrentAppLanguageUseCase(), + startOverClosure: startOverClosure, + continueClosure: continueClosure + ) + + let resumeLessonModal = ResumeLessonProgressModal(viewModel: viewModel) let hostingView = AppHostingController( rootView: resumeLessonModal, @@ -157,6 +164,7 @@ class LessonFlow: ToolNavigationFlow, Flow { hostingView.view.backgroundColor = .clear hostingView.modalPresentationStyle = .overFullScreen + hostingView.modalTransitionStyle = .crossDissolve return hostingView } diff --git a/godtools/Base.lproj/Localizable.strings b/godtools/Base.lproj/Localizable.strings index fde066803f..d529408eca 100644 --- a/godtools/Base.lproj/Localizable.strings +++ b/godtools/Base.lproj/Localizable.strings @@ -1,3 +1,8 @@ +"lessons.resumeLessonModal.title" = "Resume Progress"; +"lessons.resumeLessonModal.subtitle" = "Would you like to pick up where you left off?"; +"lessons.resumeLessonModal.startOverButton" = "Start over"; +"lessons.resumeLessonModal.continueButton" = "Continue"; + "lessons.lessonCompleted" = "Completed"; "lessons.completionProgress" = "%@ Complete"; "network_connection_lost" = "The network connection was lost."; From c631a1070acf6fb27ec44c98b3bcb7bb04bf39a9 Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Fri, 15 Nov 2024 15:07:45 -0500 Subject: [PATCH 07/28] center subtitle --- .../ResumeLessonProgressModal.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift index 825c82f1f3..4198678506 100644 --- a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift +++ b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift @@ -23,9 +23,10 @@ struct ResumeLessonProgressModal: View { var body: some View { GeometryReader { geometry in - let totalSpaceAroundButtons = (buttonInset * 2) + buttonSpace let totalSpaceAroundModal = modalInset * 2 - let buttonWidth = (geometry.size.width - totalSpaceAroundModal - totalSpaceAroundButtons) / 2 + let modalWidth = geometry.size.width - totalSpaceAroundModal + let totalSpaceAroundButtons = (buttonInset * 2) + buttonSpace + let buttonWidth = (modalWidth - totalSpaceAroundButtons) / 2 ZStack { if #available(iOS 15.0, *) { @@ -47,6 +48,8 @@ struct ResumeLessonProgressModal: View { Text(viewModel.interfaceStringsDomainModel.subtitle) .font(FontLibrary.sfProTextRegular.font(size: 16)) .foregroundColor(ColorPalette.gtGrey.color) + .multilineTextAlignment(.center) + .padding(.horizontal, buttonInset + 20) .padding(.bottom, 35) HStack(spacing: buttonSpace) { @@ -63,6 +66,7 @@ struct ResumeLessonProgressModal: View { .background(Color.white) .cornerRadius(6) .shadow(color: Color.black.opacity(0.25), radius: 3, y: 3) + .frame(width: modalWidth) .overlay( RoundedRectangle(cornerRadius: 6) .strokeBorder(Color.clear, lineWidth: 2) From 8649ed96ed05ebf68054af29737fce3616563fcc Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Fri, 15 Nov 2024 15:33:18 -0500 Subject: [PATCH 08/28] remove unused initialPageConfig param --- Podfile.lock | 4 +- godtools.xcodeproj/project.pbxproj | 125 +++++------------- .../Presentation/Lesson/LessonViewModel.swift | 2 +- godtools/App/Flows/App/AppFlow.swift | 17 +-- godtools/App/Flows/Lesson/LessonFlow.swift | 3 +- .../ToolNavigation/ToolNavigationFlow.swift | 12 +- 6 files changed, 47 insertions(+), 116 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 7342329a66..4bc42642ac 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -9,8 +9,8 @@ SPEC REPOS: - GodToolsShared SPEC CHECKSUMS: - GodToolsShared: 404a619e53dc1890091397ac4e1da69afb5eabcd + GodToolsShared: 0b717d26f71b2eb7748b6999ad3d2d6fe7a8c401 -PODFILE CHECKSUM: 1816453b60fe876696e3cc9b1da49602bb07e16b +PODFILE CHECKSUM: 4afa67206a45df71c21cb5eb808888f3037d2463 COCOAPODS: 1.15.2 diff --git a/godtools.xcodeproj/project.pbxproj b/godtools.xcodeproj/project.pbxproj index a0f8087add..7b92b7d6c5 100644 --- a/godtools.xcodeproj/project.pbxproj +++ b/godtools.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 17141EFD230DDE150088BD7E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4FAF207A1F02933900C43AFC /* Localizable.strings */; }; 17339885230736DB00A715B4 /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17339884230736DB00A715B4 /* SnapshotHelper.swift */; }; 1737DFDF22FDB48000223CB0 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1737DFDE22FDB48000223CB0 /* GoogleService-Info.plist */; }; - 1E06EB6DA916BEF9C627866F /* Pods_godtools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D61FF360D11F854476B6E206 /* Pods_godtools.framework */; }; + 1B1A4359D05325DC53708408 /* libPods-godtoolsUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EA240D9AC13BED8199EE242C /* libPods-godtoolsUITests.a */; }; 450069892B193867008A7499 /* ViewLanguageSettingsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450069882B193867008A7499 /* ViewLanguageSettingsUseCase.swift */; }; 4500698B2B193880008A7499 /* ViewLanguageSettingsDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4500698A2B193880008A7499 /* ViewLanguageSettingsDomainModel.swift */; }; 450069902B194371008A7499 /* ToolLanguagesAvailableOfflineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4500698F2B194371008A7499 /* ToolLanguagesAvailableOfflineView.swift */; }; @@ -813,8 +813,8 @@ 459BF7812AFEE0320053BA09 /* ToolScreenShareTutorialViewsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459BF77D2AFEE0320053BA09 /* ToolScreenShareTutorialViewsRepository.swift */; }; 459C526F289418EB00DA9E95 /* TranslationManifestFileDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459C526E289418EB00DA9E95 /* TranslationManifestFileDataModel.swift */; }; 459C527128941A5B00DA9E95 /* TranslationFilesDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459C527028941A5B00DA9E95 /* TranslationFilesDataModel.swift */; }; - 459C56D225FF954F00F15967 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 459C56D325FF954F00F15967 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 459C56D225FF954F00F15967 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 459C56D325FF954F00F15967 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; 459E27FA2AD8280D008275B3 /* DeleteUserCountersUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459E27F92AD8280D008275B3 /* DeleteUserCountersUseCase.swift */; }; 459E3A062A30BC2600070934 /* MenuItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459E3A032A30BC2600070934 /* MenuItemView.swift */; }; 459E3A072A30BC2600070934 /* MenuSectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459E3A042A30BC2600070934 /* MenuSectionView.swift */; }; @@ -1040,15 +1040,15 @@ 45B54C572A2641FE0042CD0E /* RealmDatabase+Read.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B54C542A2641FE0042CD0E /* RealmDatabase+Read.swift */; }; 45B54C582A2641FE0042CD0E /* RealmDatabase+Write.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B54C552A2641FE0042CD0E /* RealmDatabase+Write.swift */; }; 45B54C592A2641FE0042CD0E /* RealmDatabase+Delete.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B54C562A2641FE0042CD0E /* RealmDatabase+Delete.swift */; }; - 45B6480925E581660098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6480A25E581660098BAF1 /* (null) in Resources */ = {isa = PBXBuildFile; }; - 45B6480B25E581660098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6480C25E581660098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6481625E58ECC0098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6482025E58EE70098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6482825E593110098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6482925E593110098BAF1 /* (null) in Resources */ = {isa = PBXBuildFile; }; - 45B6482A25E593110098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 45B6480925E581660098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6480A25E581660098BAF1 /* BuildFile in Resources */ = {isa = PBXBuildFile; }; + 45B6480B25E581660098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6480C25E581660098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6481625E58ECC0098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6482025E58EE70098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6482825E593110098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6482925E593110098BAF1 /* BuildFile in Resources */ = {isa = PBXBuildFile; }; + 45B6482A25E593110098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; 45B6FF2A2BAA39660037B240 /* ViewToolFilterLanguagesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B6FF282BAA39660037B240 /* ViewToolFilterLanguagesUseCase.swift */; }; 45B6FF2B2BAA39660037B240 /* ViewToolFilterCategoriesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B6FF292BAA39660037B240 /* ViewToolFilterCategoriesUseCase.swift */; }; 45B6FF302BAA39720037B240 /* SearchToolFilterLanguagesRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B6FF2C2BAA39710037B240 /* SearchToolFilterLanguagesRepositoryInterface.swift */; }; @@ -1477,8 +1477,8 @@ 4F2500621F0C1E8D00364FBC /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F2500611F0C1E8D00364FBC /* AdSupport.framework */; }; 4F5732971EA69CF00082035C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F5732961EA69CF00082035C /* Assets.xcassets */; }; 4FAF20781F02933900C43AFC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4FAF207A1F02933900C43AFC /* Localizable.strings */; }; - 8C8C44BD9B31E90E469C99FF /* Pods_godtoolsTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D487087EDFEFD1AF7B39128C /* Pods_godtoolsTests.framework */; }; - B53E1698B88EF1DB21A2DD30 /* Pods_godtoolsUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E639208D24BEB8ADAAB1104 /* Pods_godtoolsUITests.framework */; }; + 76683DEFD080378646A03B33 /* libPods-godtoolsTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 407763C996134F95C162DFB6 /* libPods-godtoolsTests.a */; }; + BF79B5EB9B3B461ECFD42719 /* libPods-godtools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A1CC351AF1B5B73C3CF6B771 /* libPods-godtools.a */; }; D105922E252FA2E700F120CA /* share_tool_tutorial_mirrored.json in Resources */ = {isa = PBXBuildFile; fileRef = D115A65D25265813007F11AD /* share_tool_tutorial_mirrored.json */; }; D163EA96254A00BE00BA4EA9 /* share_tool_tutorial_link.json in Resources */ = {isa = PBXBuildFile; fileRef = D163EA95254A00BE00BA4EA9 /* share_tool_tutorial_link.json */; }; D1838479257E86B3004F5674 /* container in Resources */ = {isa = PBXBuildFile; fileRef = D1838478257E86B3004F5674 /* container */; }; @@ -1699,6 +1699,7 @@ 1767C18E62BAF2E86AA37734 /* Pods-godtoolsTests.production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtoolsTests.production.xcconfig"; path = "Pods/Target Support Files/Pods-godtoolsTests/Pods-godtoolsTests.production.xcconfig"; sourceTree = ""; }; 2A66965976CC851521519566 /* Pods-godtoolsUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtoolsUITests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-godtoolsUITests/Pods-godtoolsUITests.debug.xcconfig"; sourceTree = ""; }; 3795EC9D424F0613AD8AF610 /* Pods-godtools.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtools.release.xcconfig"; path = "Pods/Target Support Files/Pods-godtools/Pods-godtools.release.xcconfig"; sourceTree = ""; }; + 407763C996134F95C162DFB6 /* libPods-godtoolsTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-godtoolsTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 450069882B193867008A7499 /* ViewLanguageSettingsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewLanguageSettingsUseCase.swift; sourceTree = ""; }; 4500698A2B193880008A7499 /* ViewLanguageSettingsDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewLanguageSettingsDomainModel.swift; sourceTree = ""; }; 4500698F2B194371008A7499 /* ToolLanguagesAvailableOfflineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToolLanguagesAvailableOfflineView.swift; sourceTree = ""; }; @@ -3125,7 +3126,6 @@ 45FE82502ACE5D8C00930C39 /* AppLayoutDirectionNavBarItemController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppLayoutDirectionNavBarItemController.swift; sourceTree = ""; }; 45FE82522ACE5D8C00930C39 /* NavBarItemContentType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavBarItemContentType.swift; sourceTree = ""; }; 45FE82532ACE5D8C00930C39 /* NavBarItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavBarItem.swift; sourceTree = ""; }; - 4E639208D24BEB8ADAAB1104 /* Pods_godtoolsUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_godtoolsUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4F0CCC1E1EE73E9D00AE4E45 /* Podfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Podfile; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 4F12296C20852BE3008842CC /* godtoolsUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = godtoolsUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 4F12297020852BE3008842CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -3183,6 +3183,7 @@ 684328EB1EB7C7F4005E9131 /* fastlane */ = {isa = PBXFileReference; lastKnownFileType = folder; path = fastlane; sourceTree = ""; }; 684328F11EB7CF66005E9131 /* godtoolsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = godtoolsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 6A3486217BA7BF7A1AA9B8F5 /* Pods-godtools.analyticslogging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtools.analyticslogging.xcconfig"; path = "Pods/Target Support Files/Pods-godtools/Pods-godtools.analyticslogging.xcconfig"; sourceTree = ""; }; + A1CC351AF1B5B73C3CF6B771 /* libPods-godtools.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-godtools.a"; sourceTree = BUILT_PRODUCTS_DIR; }; A9BDC99CD6AA5FF3CCAC0E93 /* Pods-godtools.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtools.staging.xcconfig"; path = "Pods/Target Support Files/Pods-godtools/Pods-godtools.staging.xcconfig"; sourceTree = ""; }; B03BA6AC6918BE450406F1E6 /* Pods-godtools.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtools.debug.xcconfig"; path = "Pods/Target Support Files/Pods-godtools/Pods-godtools.debug.xcconfig"; sourceTree = ""; }; CD35532F620E5D79E5C5E9B9 /* Pods-godtoolsUITests.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtoolsUITests.staging.xcconfig"; path = "Pods/Target Support Files/Pods-godtoolsUITests/Pods-godtoolsUITests.staging.xcconfig"; sourceTree = ""; }; @@ -3238,7 +3239,6 @@ D47DF0452B2A3D5D0079219B /* DownloadedLanguageDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadedLanguageDataModel.swift; sourceTree = ""; }; D48018BF28EF650700389565 /* DashboardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardView.swift; sourceTree = ""; }; D48018C128EF6A7100389565 /* DashboardViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardViewModel.swift; sourceTree = ""; }; - D487087EDFEFD1AF7B39128C /* Pods_godtoolsTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_godtoolsTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D4960CC12CBDE40B0090B114 /* GetLessonListItemProgressRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetLessonListItemProgressRepository.swift; sourceTree = ""; }; D4960CC52CC6D77B0090B114 /* GetTranslatedPercentage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetTranslatedPercentage.swift; sourceTree = ""; }; D4960CC72CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserLessonProgressDomainModel.swift; sourceTree = ""; }; @@ -3399,9 +3399,9 @@ D4F045822BBB4CDA00B115C9 /* UserToolLanguageFilterDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserToolLanguageFilterDataModel.swift; sourceTree = ""; }; D4F1DE8C2967538A00A2F674 /* IncrementUserCounterUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncrementUserCounterUseCase.swift; sourceTree = ""; }; D4F1DE8F29676B8A00A2F674 /* UserCounterDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserCounterDomainModel.swift; sourceTree = ""; }; - D61FF360D11F854476B6E206 /* Pods_godtools.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_godtools.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E0F338026DD564DE8D5B7CE2 /* Pods-godtoolsTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtoolsTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-godtoolsTests/Pods-godtoolsTests.debug.xcconfig"; sourceTree = ""; }; E60CDF010C22554D98B9B158 /* Pods-godtoolsUITests.analyticslogging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtoolsUITests.analyticslogging.xcconfig"; path = "Pods/Target Support Files/Pods-godtoolsUITests/Pods-godtoolsUITests.analyticslogging.xcconfig"; sourceTree = ""; }; + EA240D9AC13BED8199EE242C /* libPods-godtoolsUITests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-godtoolsUITests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; EBE523140714C16DAAB6B473 /* Pods-godtools.production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtools.production.xcconfig"; path = "Pods/Target Support Files/Pods-godtools/Pods-godtools.production.xcconfig"; sourceTree = ""; }; ECD344F31F13E79400906471 /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Localizable.strings; sourceTree = ""; }; ECD344F41F13F16100906471 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; @@ -3437,13 +3437,13 @@ 45A4160C2A9943D50030E2C7 /* YouTubeiOSPlayerHelper in Frameworks */, 45A416082A9943D50030E2C7 /* RequestOperation in Frameworks */, 45A4161A2A9943D50030E2C7 /* Starscream in Frameworks */, - B53E1698B88EF1DB21A2DD30 /* Pods_godtoolsUITests.framework in Frameworks */, 45A4161C2A9943D50030E2C7 /* Fuzi in Frameworks */, 45A416062A9943D50030E2C7 /* Lottie in Frameworks */, 45A416122A9943D50030E2C7 /* FirebaseCrashlytics in Frameworks */, 45A4160E2A9943D50030E2C7 /* ZipArchive in Frameworks */, 45A416102A9943D50030E2C7 /* FirebaseAnalytics in Frameworks */, 45A416162A9943D50030E2C7 /* FirebaseInAppMessaging-Beta in Frameworks */, + 1B1A4359D05325DC53708408 /* libPods-godtoolsUITests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3459,13 +3459,13 @@ 45CF09702784B910007F13D3 /* RequestOperation in Frameworks */, 457771B629A00C5C00EA8115 /* FirebaseDynamicLinks in Frameworks */, 45E7D4C42977430A008C7503 /* ZipArchive in Frameworks */, - 1E06EB6DA916BEF9C627866F /* Pods_godtools.framework in Frameworks */, D4997E0E28D4CED800205B4C /* YouTubeiOSPlayerHelper in Frameworks */, 457771B429A00C5C00EA8115 /* FirebaseCrashlytics in Frameworks */, 45E39EDC27457E0C006A59E4 /* Lottie in Frameworks */, 457771B829A00C5C00EA8115 /* FirebaseInAppMessaging-Beta in Frameworks */, 45D48C8629F81324004E92B1 /* SocialAuthentication in Frameworks */, 45D40C682A5315B400E8E4AE /* Starscream in Frameworks */, + BF79B5EB9B3B461ECFD42719 /* libPods-godtools.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3477,7 +3477,7 @@ 4581EAA52BFBE257008115FF /* RealmSwift in Frameworks */, 45F486F22B76D513004E0E27 /* Nimble in Frameworks */, 45F486EF2B76D501004E0E27 /* Quick in Frameworks */, - 8C8C44BD9B31E90E469C99FF /* Pods_godtoolsTests.framework in Frameworks */, + 76683DEFD080378646A03B33 /* libPods-godtoolsTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3522,10 +3522,10 @@ 451F7A822ABD2F1400006EF2 /* Nimble.framework */, 451F7A802ABD2F1100006EF2 /* Quick.framework */, 4F2500611F0C1E8D00364FBC /* AdSupport.framework */, - D61FF360D11F854476B6E206 /* Pods_godtools.framework */, - D487087EDFEFD1AF7B39128C /* Pods_godtoolsTests.framework */, 0B35785ED952890E2E07F786 /* Pods_godtools_Tests_godtoolsTests.framework */, - 4E639208D24BEB8ADAAB1104 /* Pods_godtoolsUITests.framework */, + A1CC351AF1B5B73C3CF6B771 /* libPods-godtools.a */, + 407763C996134F95C162DFB6 /* libPods-godtoolsTests.a */, + EA240D9AC13BED8199EE242C /* libPods-godtoolsUITests.a */, ); name = Frameworks; sourceTree = ""; @@ -11980,7 +11980,6 @@ 4F12296920852BE3008842CC /* Frameworks */, 4F12296A20852BE3008842CC /* Resources */, 452556462C383C3F00AA0046 /* Embed Frameworks */, - C2F2EDDB8AE54094C4C3BC2B /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -12017,7 +12016,6 @@ 45B10ADF2BF3F270004342AB /* Embed Frameworks */, 45AD220F2593C66B00A096A0 /* Run Crashlytics */, 451C8B7628AEC6AD00E98AFA /* Download Initial Resources */, - 5B516475C639DA5866963382 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -12052,7 +12050,6 @@ 684328EE1EB7CF66005E9131 /* Frameworks */, 684328EF1EB7CF66005E9131 /* Resources */, 45C382C02BF3FC5600378656 /* Embed Frameworks */, - 5302A53643A557048AE69B6E /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -12256,7 +12253,7 @@ 451A17522756C10400D35D78 /* tutorial_screenshare.json in Resources */, D4B522D929D761B700D85213 /* Localizable.stringsdict in Resources */, 1737DFDF22FDB48000223CB0 /* GoogleService-Info.plist in Resources */, - 45B6482925E593110098BAF1 /* (null) in Resources */, + 45B6482925E593110098BAF1 /* BuildFile in Resources */, 458CFE9329D4E0B9007B423C /* ArticlesErrorMessageView.xib in Resources */, 455583FC269F2DA500C3FF14 /* MobileContentInputView.xib in Resources */, 451A17542756C10400D35D78 /* tutorial_tooltip.json in Resources */, @@ -12289,7 +12286,7 @@ D19EB5E0259BB75900685156 /* training_tip_tips.json in Resources */, 458CFE9129D4E0B9007B423C /* ArticleWebView.xib in Resources */, 4555840F269F2DA500C3FF14 /* MobileContentTextView.xib in Resources */, - 45B6480A25E581660098BAF1 /* (null) in Resources */, + 45B6480A25E581660098BAF1 /* BuildFile in Resources */, 45F7162E290A12D70019B715 /* WebContentView.xib in Resources */, 45DEF22E2576A6A20007AC64 /* learn_to_share_tool_with_anyone.json in Resources */, 45BE4A7D2AF28788004021DA /* SF-Pro-Display-Regular.otf in Resources */, @@ -12425,60 +12422,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 5302A53643A557048AE69B6E /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-godtoolsTests/Pods-godtoolsTests-frameworks.sh", - "${PODS_ROOT}/GodToolsShared/build/cocoapods/framework/GodToolsToolParser.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GodToolsToolParser.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-godtoolsTests/Pods-godtoolsTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 5B516475C639DA5866963382 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-godtools/Pods-godtools-frameworks.sh", - "${PODS_ROOT}/GodToolsShared/build/cocoapods/framework/GodToolsToolParser.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GodToolsToolParser.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-godtools/Pods-godtools-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - C2F2EDDB8AE54094C4C3BC2B /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-godtoolsUITests/Pods-godtoolsUITests-frameworks.sh", - "${PODS_ROOT}/GodToolsShared/build/cocoapods/framework/GodToolsToolParser.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GodToolsToolParser.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-godtoolsUITests/Pods-godtoolsUITests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -12562,7 +12505,7 @@ 45D63E56288F67F8009B4610 /* IgnoreCacheSession.swift in Sources */, 458B91C32B7D676900785C6F /* ViewFavoritesDomainModel.swift in Sources */, 459E86DD28EDA86C00E197A5 /* DeepLinkUrlParserType.swift in Sources */, - 459C56D225FF954F00F15967 /* (null) in Sources */, + 459C56D225FF954F00F15967 /* BuildFile in Sources */, 45D63E86288F75B0009B4610 /* RealmAttachment.swift in Sources */, 45C649C22B31E212000249E0 /* GetShareToolInterfaceStringsRepositoryInterface.swift in Sources */, 45A8BDE32ACC9F47007A1EBB /* LessonsViewModel.swift in Sources */, @@ -12597,7 +12540,7 @@ 45AC9DED2B28A9CD00DEEBFE /* LanguageDownloadIcon.swift in Sources */, 459E86EE28EDA86C00E197A5 /* DeepLinkingParserManifestUrl.swift in Sources */, 45D00A1A2B1FD0E3007D2B65 /* String+ParseUrls.swift in Sources */, - 45B6481625E58ECC0098BAF1 /* (null) in Sources */, + 45B6481625E58ECC0098BAF1 /* BuildFile in Sources */, 45F3AF062B5EC0A600CE8D41 /* PageNavigationCollectionViewFlowLayout.swift in Sources */, 45CBDA042BA38F200007DEC8 /* LaunchCountCache.swift in Sources */, 45F71629290A12D70019B715 /* WebContentType.swift in Sources */, @@ -12661,7 +12604,7 @@ 45B3382F2AF42A6400D18C63 /* TutorialInterfaceStringsDomainModel.swift in Sources */, D4E7EE262CA5E62B00F75DA6 /* StoreUserLessonProgressRepository.swift in Sources */, D4E7EE1A2CA345DD00F75DA6 /* UserLessonProgressRepository.swift in Sources */, - 45B6480B25E581660098BAF1 /* (null) in Sources */, + 45B6480B25E581660098BAF1 /* BuildFile in Sources */, 458B91B12B7D5D6800785C6F /* ConfirmRemoveToolFromFavoritesAlertViewModel.swift in Sources */, 4512D4D32B29127C00DFAFB3 /* GetToolSettingsToolLanguagesListInterfaceStringsRepository.swift in Sources */, 4534F93B2AE9B11600A7A071 /* RealmLessonEvaluation.swift in Sources */, @@ -12769,7 +12712,7 @@ 459BF77E2AFEE0320053BA09 /* ToolScreenShareTutorialViewDataModel.swift in Sources */, 45EB9B7229F16CF200CA74A8 /* UILabel+AttributedString.swift in Sources */, 45B54C572A2641FE0042CD0E /* RealmDatabase+Read.swift in Sources */, - 45B6482025E58EE70098BAF1 /* (null) in Sources */, + 45B6482025E58EE70098BAF1 /* BuildFile in Sources */, 45645C162AFE774900BD233D /* GetShareToolScreenShareSessionInterfaceStringsRepository.swift in Sources */, 45AD1BD925938A4F00A096A0 /* AlertMessageView.swift in Sources */, 4512D4DD2B29129100DFAFB3 /* ToolSettingsToolLanguagesListItemView.swift in Sources */, @@ -12938,7 +12881,7 @@ 45C8835D2A93EDDF00F33E6D /* DashboardTabBarItemView.swift in Sources */, 4504BA282AF3EE67001151E5 /* GetTutorialUseCase.swift in Sources */, 459F86862AC51A9A00B4E5CA /* ChooseAppLanguageNavigationFlow.swift in Sources */, - 45B6480925E581660098BAF1 /* (null) in Sources */, + 45B6480925E581660098BAF1 /* BuildFile in Sources */, 45EB9B8329F16CF200CA74A8 /* Color+RGB.swift in Sources */, 45558407269F2DA500C3FF14 /* MobileContentPagesViewModel.swift in Sources */, 45ACCA582CD2BFBB00567AE6 /* AppMessagingInterface.swift in Sources */, @@ -13155,7 +13098,7 @@ 45BE4A812AF287D2004021DA /* ConfirmAppLanguageViewModel.swift in Sources */, 45AE975527C97A9500C2CB33 /* Input+MobileContentRenderableModel.swift in Sources */, 452D355A2A8FB9EB00BC4F97 /* FavoritedResourceDataModel.swift in Sources */, - 459C56D325FF954F00F15967 /* (null) in Sources */, + 459C56D325FF954F00F15967 /* BuildFile in Sources */, 451CCF1427A9AA4700E8D2D3 /* MobileContentViewPositionState.swift in Sources */, 45F71623290A12D70019B715 /* WebContentViewModel.swift in Sources */, 458B91AB2B7D5D6800785C6F /* FavoritesView.swift in Sources */, @@ -13231,7 +13174,7 @@ 45AAC2AB2BB30F0A000AE690 /* MobileContentGlobalAnalyticsDecodable.swift in Sources */, 45EB9B7329F16CF200CA74A8 /* UIButton+ImageColor.swift in Sources */, 45F378FC2B23642600EEF039 /* GetLearnToShareToolTutorialItemsRepository.swift in Sources */, - 45B6482A25E593110098BAF1 /* (null) in Sources */, + 45B6482A25E593110098BAF1 /* BuildFile in Sources */, D42FEBD62875D8D50002FAD9 /* GetOptInOnboardingTutorialAvailableUseCase.swift in Sources */, 4534F92C2AE9A99200A7A071 /* TrackLessonFeedbackDomainModel.swift in Sources */, D40D77BF2AB36766008D3642 /* SearchBarViewModel.swift in Sources */, @@ -13313,7 +13256,7 @@ 458B91B02B7D5D6800785C6F /* YourFavoriteToolsView.swift in Sources */, 452DFB372B7FAAE5003A4A59 /* GetToolListItemInterfaceStringsRepository.swift in Sources */, 45369AD72AFA7FA500BD10F0 /* ToolScreenShareTutorialView.swift in Sources */, - 45B6480C25E581660098BAF1 /* (null) in Sources */, + 45B6480C25E581660098BAF1 /* BuildFile in Sources */, 45723DF72ABA24CE00C697E6 /* MobileContentApiErrorCodableCode.swift in Sources */, 45369AD42AFA7FA500BD10F0 /* ToolScreenShareTutorialPageDomainModel.swift in Sources */, 455582E5269F2C1000C3FF14 /* TrainingTipView.swift in Sources */, @@ -13450,7 +13393,7 @@ 4585BF662AC391F100A6D720 /* SetUserPreferredAppLanguageRepositoryInterface.swift in Sources */, 45F378FF2B23642600EEF039 /* LearnToShareToolDataLayerDependencies.swift in Sources */, 45B3F44A2AC3A86100D61BFD /* UserAppLanguageRepository.swift in Sources */, - 45B6482825E593110098BAF1 /* (null) in Sources */, + 45B6482825E593110098BAF1 /* BuildFile in Sources */, 45A835102AD1A40D004F5593 /* GetToolDetailsMediaUseCase.swift in Sources */, 4534F9462AE9B8E700A7A071 /* GetLessonEvaluatedUseCase.swift in Sources */, 45F378FD2B23642600EEF039 /* LearnToShareToolDomainLayerDependencies.swift in Sources */, diff --git a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift index 3a2f15af2e..bd20b403c3 100644 --- a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift +++ b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift @@ -17,7 +17,7 @@ class LessonViewModel: MobileContentPagesViewModel { let progress: ObservableValue> = ObservableValue(value: AnimatableValue(value: 0, animated: false)) - init(flowDelegate: FlowDelegate, renderer: MobileContentRenderer, resource: ResourceModel, primaryLanguage: LanguageModel, initialPage: MobileContentPagesPage?, initialPageConfig: MobileContentPagesInitialPageConfig?, resourcesRepository: ResourcesRepository, translationsRepository: TranslationsRepository, mobileContentEventAnalytics: MobileContentRendererEventAnalyticsTracking, getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase, getTranslatedLanguageName: GetTranslatedLanguageName, storeLessonProgressUseCase: StoreUserLessonProgressUseCase, trainingTipsEnabled: Bool, incrementUserCounterUseCase: IncrementUserCounterUseCase) { + init(flowDelegate: FlowDelegate, renderer: MobileContentRenderer, resource: ResourceModel, primaryLanguage: LanguageModel, initialPage: MobileContentPagesPage?, resourcesRepository: ResourcesRepository, translationsRepository: TranslationsRepository, mobileContentEventAnalytics: MobileContentRendererEventAnalyticsTracking, getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase, getTranslatedLanguageName: GetTranslatedLanguageName, storeLessonProgressUseCase: StoreUserLessonProgressUseCase, trainingTipsEnabled: Bool, incrementUserCounterUseCase: IncrementUserCounterUseCase) { self.flowDelegate = flowDelegate self.storeLessonProgressUseCase = storeLessonProgressUseCase diff --git a/godtools/App/Flows/App/AppFlow.swift b/godtools/App/Flows/App/AppFlow.swift index 96cdb62ed4..86e806b0c5 100644 --- a/godtools/App/Flows/App/AppFlow.swift +++ b/godtools/App/Flows/App/AppFlow.swift @@ -740,7 +740,7 @@ extension AppFlow { extension AppFlow { - private func navigateToToolInAppLanguage(toolDataModelId: String, trainingTipsEnabled: Bool, shouldPersistToolSettings: Bool = false, initialPageConfig: MobileContentPagesInitialPageConfig? = nil) { + private func navigateToToolInAppLanguage(toolDataModelId: String, trainingTipsEnabled: Bool, shouldPersistToolSettings: Bool = false) { let languagesRepository: LanguagesRepository = appDiContainer.dataLayer.getLanguagesRepository() @@ -753,7 +753,7 @@ extension AppFlow { languageIds = Array() } - navigateToTool(toolDataModelId: toolDataModelId, languageIds: languageIds, selectedLanguageIndex: nil, trainingTipsEnabled: trainingTipsEnabled, shouldPersistToolSettings: shouldPersistToolSettings, initialPageConfig: initialPageConfig) + navigateToTool(toolDataModelId: toolDataModelId, languageIds: languageIds, selectedLanguageIndex: nil, trainingTipsEnabled: trainingTipsEnabled, shouldPersistToolSettings: shouldPersistToolSettings) } private func navigateToToolWithUserToolLanguageSettingsApplied(toolDataModelId: String, trainingTipsEnabled: Bool) { @@ -807,20 +807,14 @@ extension AppFlow { private func navigateToLesson(restartAtBeginning: Bool, lessonListItem: LessonListItemDomainModel, languageFilter: LessonFilterLanguageDomainModel?) { - let initialPageConfig = MobileContentPagesInitialPageConfig( - shouldRestartAtBeginning: restartAtBeginning, - shouldNavigateToStartPageIfLastPage: true, - shouldNavigateToPreviousVisiblePageIfHiddenPage: true - ) - if let languageFilter = languageFilter { - navigateToTool(toolDataModelId: lessonListItem.dataModelId, languageIds: [languageFilter.languageId], selectedLanguageIndex: 0, trainingTipsEnabled: false, initialPageConfig: initialPageConfig) + navigateToTool(toolDataModelId: lessonListItem.dataModelId, languageIds: [languageFilter.languageId], selectedLanguageIndex: 0, trainingTipsEnabled: false) } else { - navigateToToolInAppLanguage(toolDataModelId: lessonListItem.dataModelId, trainingTipsEnabled: false, initialPageConfig: initialPageConfig) + navigateToToolInAppLanguage(toolDataModelId: lessonListItem.dataModelId, trainingTipsEnabled: false) } } - private func navigateToTool(toolDataModelId: String, languageIds: [String], selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, shouldPersistToolSettings: Bool = false, initialPageConfig: MobileContentPagesInitialPageConfig? = nil) { + private func navigateToTool(toolDataModelId: String, languageIds: [String], selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, shouldPersistToolSettings: Bool = false) { let languagesRepository: LanguagesRepository = appDiContainer.dataLayer.getLanguagesRepository() @@ -843,7 +837,6 @@ extension AppFlow { selectedLanguageIndex: selectedLanguageIndex, trainingTipsEnabled: trainingTipsEnabled, initialPage: nil, - initialPageConfig: initialPageConfig, shouldPersistToolSettings: shouldPersistToolSettings ) } diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index 68853b3aa7..08824d4511 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -24,7 +24,7 @@ class LessonFlow: ToolNavigationFlow, Flow { var tractFlow: TractFlow? var downloadToolTranslationFlow: DownloadToolTranslationsFlow? - init(flowDelegate: FlowDelegate, appDiContainer: AppDiContainer, sharedNavigationController: AppNavigationController, appLanguage: AppLanguageDomainModel, toolTranslations: ToolTranslationsDomainModel, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, initialPageConfig: MobileContentPagesInitialPageConfig?) { + init(flowDelegate: FlowDelegate, appDiContainer: AppDiContainer, sharedNavigationController: AppNavigationController, appLanguage: AppLanguageDomainModel, toolTranslations: ToolTranslationsDomainModel, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?) { self.flowDelegate = flowDelegate self.appDiContainer = appDiContainer @@ -62,7 +62,6 @@ class LessonFlow: ToolNavigationFlow, Flow { resource: renderer.resource, primaryLanguage: renderer.languages.primaryLanguage, initialPage: initialPageOrPreviousProgress, - initialPageConfig: initialPageConfig, resourcesRepository: appDiContainer.dataLayer.getResourcesRepository(), translationsRepository: appDiContainer.dataLayer.getTranslationsRepository(), mobileContentEventAnalytics: appDiContainer.getMobileContentRendererEventAnalyticsTracking(), diff --git a/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift b/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift index 186751c459..cca52153f0 100644 --- a/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift +++ b/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift @@ -36,13 +36,12 @@ extension ToolNavigationFlow { liveShareStream: toolDeepLink.liveShareStream, selectedLanguageIndex: toolDeepLink.selectedLanguageIndex, trainingTipsEnabled: false, - initialPageConfig: nil, initialPage: toolDeepLink.mobileContentPage, shouldPersistToolSettings: false ) } - func navigateToTool(appLanguage: AppLanguageDomainModel, resourceId: String, languageIds: [String], liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, initialPageConfig: MobileContentPagesInitialPageConfig? = nil, shouldPersistToolSettings: Bool) { + func navigateToTool(appLanguage: AppLanguageDomainModel, resourceId: String, languageIds: [String], liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, shouldPersistToolSettings: Bool) { let determineToolTranslationsToDownload = DetermineToolTranslationsToDownload( resourceId: resourceId, @@ -57,13 +56,12 @@ extension ToolNavigationFlow { liveShareStream: liveShareStream, selectedLanguageIndex: selectedLanguageIndex, trainingTipsEnabled: trainingTipsEnabled, - initialPageConfig: initialPageConfig, initialPage: initialPage, shouldPersistToolSettings: shouldPersistToolSettings ) } - private func navigateToToolAndDetermineToolTranslationsToDownload(appLanguage: AppLanguageDomainModel, determineToolTranslationsToDownload: DetermineToolTranslationsToDownloadType, liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPageConfig: MobileContentPagesInitialPageConfig?, initialPage: MobileContentPagesPage?, shouldPersistToolSettings: Bool) { + private func navigateToToolAndDetermineToolTranslationsToDownload(appLanguage: AppLanguageDomainModel, determineToolTranslationsToDownload: DetermineToolTranslationsToDownloadType, liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, shouldPersistToolSettings: Bool) { let didDownloadToolTranslationsClosure = { [weak self] (result: Result) in @@ -78,7 +76,6 @@ extension ToolNavigationFlow { selectedLanguageIndex: selectedLanguageIndex, trainingTipsEnabled: trainingTipsEnabled, initialPage: initialPage, - initialPageConfig: initialPageConfig, shouldPersistToolSettings: shouldPersistToolSettings ) @@ -99,7 +96,7 @@ extension ToolNavigationFlow { self.downloadToolTranslationFlow = downloadToolTranslationFlow } - private func navigateToTool(appLanguage: AppLanguageDomainModel, toolTranslations: ToolTranslationsDomainModel, liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, initialPageConfig: MobileContentPagesInitialPageConfig?, shouldPersistToolSettings: Bool) { + private func navigateToTool(appLanguage: AppLanguageDomainModel, toolTranslations: ToolTranslationsDomainModel, liveShareStream: String?, selectedLanguageIndex: Int?, trainingTipsEnabled: Bool, initialPage: MobileContentPagesPage?, shouldPersistToolSettings: Bool) { let resourceType: ResourceType = toolTranslations.tool.resourceTypeEnum @@ -123,8 +120,7 @@ extension ToolNavigationFlow { appLanguage: appLanguage, toolTranslations: toolTranslations, trainingTipsEnabled: trainingTipsEnabled, - initialPage: initialPage, - initialPageConfig: initialPageConfig + initialPage: initialPage ) case .tract: From d16ac6d278183c0bc937a0ec194adb4d5ad2e4bf Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Fri, 15 Nov 2024 15:37:07 -0500 Subject: [PATCH 09/28] remove unused bool --- .../Lessons/Presentation/Lesson/LessonViewModel.swift | 2 +- .../Views/Pages/MobileContentPagesViewModel.swift | 4 ---- .../Pages/Models/MobileContentPagesInitialPageConfig.swift | 4 +--- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift index bd20b403c3..83c8fd39be 100644 --- a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift +++ b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift @@ -22,7 +22,7 @@ class LessonViewModel: MobileContentPagesViewModel { self.flowDelegate = flowDelegate self.storeLessonProgressUseCase = storeLessonProgressUseCase - let initialPageConfig = MobileContentPagesInitialPageConfig(shouldRestartAtBeginning: false, shouldNavigateToStartPageIfLastPage: true, shouldNavigateToPreviousVisiblePageIfHiddenPage: true) + let initialPageConfig = MobileContentPagesInitialPageConfig( shouldNavigateToStartPageIfLastPage: true, shouldNavigateToPreviousVisiblePageIfHiddenPage: true) super.init(renderer: renderer, initialPage: initialPage, initialPageConfig: initialPageConfig, resourcesRepository: resourcesRepository, translationsRepository: translationsRepository, mobileContentEventAnalytics: mobileContentEventAnalytics, getCurrentAppLanguageUseCase: getCurrentAppLanguageUseCase, getTranslatedLanguageName: getTranslatedLanguageName, initialPageRenderingType: .visiblePages, trainingTipsEnabled: trainingTipsEnabled, incrementUserCounterUseCase: incrementUserCounterUseCase, selectedLanguageIndex: nil) diff --git a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift index 72d99dd66f..8a7690dd7c 100644 --- a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift +++ b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift @@ -389,10 +389,6 @@ class MobileContentPagesViewModel: NSObject, ObservableObject { } private func getInitialPageModel(pageRenderer: MobileContentPageRenderer) -> Page? { - - if initialPageConfig.shouldRestartAtBeginning { - return pageRenderer.getVisiblePageModels().first - } let allPages: [Page] = pageRenderer.getAllPageModels() diff --git a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/Models/MobileContentPagesInitialPageConfig.swift b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/Models/MobileContentPagesInitialPageConfig.swift index 6e22915773..b366b49b52 100644 --- a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/Models/MobileContentPagesInitialPageConfig.swift +++ b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/Models/MobileContentPagesInitialPageConfig.swift @@ -10,13 +10,11 @@ import Foundation struct MobileContentPagesInitialPageConfig { - let shouldRestartAtBeginning: Bool let shouldNavigateToStartPageIfLastPage: Bool let shouldNavigateToPreviousVisiblePageIfHiddenPage: Bool - init(shouldRestartAtBeginning: Bool = false, shouldNavigateToStartPageIfLastPage: Bool = false, shouldNavigateToPreviousVisiblePageIfHiddenPage: Bool = false) { + init(shouldNavigateToStartPageIfLastPage: Bool = false, shouldNavigateToPreviousVisiblePageIfHiddenPage: Bool = false) { - self.shouldRestartAtBeginning = shouldRestartAtBeginning self.shouldNavigateToStartPageIfLastPage = shouldNavigateToStartPageIfLastPage self.shouldNavigateToPreviousVisiblePageIfHiddenPage = shouldNavigateToPreviousVisiblePageIfHiddenPage } From 726834643cbe4abcce88e51ae5ecf5daf22c9531 Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Fri, 15 Nov 2024 15:52:01 -0500 Subject: [PATCH 10/28] clean up --- .../Lessons/Presentation/Lesson/LessonViewModel.swift | 2 +- godtools/App/Flows/App/AppFlow.swift | 4 ++-- godtools/App/Flows/Flow/FlowStep.swift | 2 -- godtools/App/Flows/Lesson/LessonFlow.swift | 2 +- godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift | 4 ++-- .../Views/Pages/MobileContentPagesViewModel.swift | 4 ++-- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift index 83c8fd39be..3fc9484cca 100644 --- a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift +++ b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift @@ -22,7 +22,7 @@ class LessonViewModel: MobileContentPagesViewModel { self.flowDelegate = flowDelegate self.storeLessonProgressUseCase = storeLessonProgressUseCase - let initialPageConfig = MobileContentPagesInitialPageConfig( shouldNavigateToStartPageIfLastPage: true, shouldNavigateToPreviousVisiblePageIfHiddenPage: true) + let initialPageConfig = MobileContentPagesInitialPageConfig(shouldNavigateToStartPageIfLastPage: true, shouldNavigateToPreviousVisiblePageIfHiddenPage: true) super.init(renderer: renderer, initialPage: initialPage, initialPageConfig: initialPageConfig, resourcesRepository: resourcesRepository, translationsRepository: translationsRepository, mobileContentEventAnalytics: mobileContentEventAnalytics, getCurrentAppLanguageUseCase: getCurrentAppLanguageUseCase, getTranslatedLanguageName: getTranslatedLanguageName, initialPageRenderingType: .visiblePages, trainingTipsEnabled: trainingTipsEnabled, incrementUserCounterUseCase: incrementUserCounterUseCase, selectedLanguageIndex: nil) diff --git a/godtools/App/Flows/App/AppFlow.swift b/godtools/App/Flows/App/AppFlow.swift index 86e806b0c5..e6d31aac07 100644 --- a/godtools/App/Flows/App/AppFlow.swift +++ b/godtools/App/Flows/App/AppFlow.swift @@ -203,7 +203,7 @@ class AppFlow: NSObject, ToolNavigationFlow, Flow { } case .lessonTappedFromLessonsList(let lessonListItem, let languageFilter): - navigateToLesson(restartAtBeginning: false, lessonListItem: lessonListItem, languageFilter: languageFilter) + navigateToLesson(lessonListItem: lessonListItem, languageFilter: languageFilter) case .lessonLanguageFilterTappedFromLessons: navigationController.pushViewController(getLessonLanguageFilterSelection(), animated: true) @@ -805,7 +805,7 @@ extension AppFlow { navigateToTool(toolDataModelId: toolDataModelId, languageIds: languageIds, selectedLanguageIndex: selectedLanguageIndex, trainingTipsEnabled: trainingTipsEnabled, shouldPersistToolSettings: shouldPersistToolSettings) } - private func navigateToLesson(restartAtBeginning: Bool, lessonListItem: LessonListItemDomainModel, languageFilter: LessonFilterLanguageDomainModel?) { + private func navigateToLesson(lessonListItem: LessonListItemDomainModel, languageFilter: LessonFilterLanguageDomainModel?) { if let languageFilter = languageFilter { navigateToTool(toolDataModelId: lessonListItem.dataModelId, languageIds: [languageFilter.languageId], selectedLanguageIndex: 0, trainingTipsEnabled: false) diff --git a/godtools/App/Flows/Flow/FlowStep.swift b/godtools/App/Flows/Flow/FlowStep.swift index 31c522323a..69eb7c44d9 100644 --- a/godtools/App/Flows/Flow/FlowStep.swift +++ b/godtools/App/Flows/Flow/FlowStep.swift @@ -38,8 +38,6 @@ enum FlowStep { // lesson case presentResumeLessonModal(startOverClosure: () -> Void) - case startOverTappedFromResumeLessonModal - case resumeTappedFromResumeLessonModal case closeTappedFromLesson(lessonId: String, highestPageNumberViewed: Int) case lessonFlowCompleted(state: LessonFlowCompletedState) diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index 08824d4511..46b38561a0 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -61,7 +61,7 @@ class LessonFlow: ToolNavigationFlow, Flow { renderer: renderer, resource: renderer.resource, primaryLanguage: renderer.languages.primaryLanguage, - initialPage: initialPageOrPreviousProgress, + initialPage: initialPageOrPreviousProgress, resourcesRepository: appDiContainer.dataLayer.getResourcesRepository(), translationsRepository: appDiContainer.dataLayer.getTranslationsRepository(), mobileContentEventAnalytics: appDiContainer.getMobileContentRendererEventAnalyticsTracking(), diff --git a/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift b/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift index cca52153f0..88cb5b866d 100644 --- a/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift +++ b/godtools/App/Flows/ToolNavigation/ToolNavigationFlow.swift @@ -35,7 +35,7 @@ extension ToolNavigationFlow { determineToolTranslationsToDownload: determineDeepLinkedToolTranslationsToDownload, liveShareStream: toolDeepLink.liveShareStream, selectedLanguageIndex: toolDeepLink.selectedLanguageIndex, - trainingTipsEnabled: false, + trainingTipsEnabled: false, initialPage: toolDeepLink.mobileContentPage, shouldPersistToolSettings: false ) @@ -55,7 +55,7 @@ extension ToolNavigationFlow { determineToolTranslationsToDownload: determineToolTranslationsToDownload, liveShareStream: liveShareStream, selectedLanguageIndex: selectedLanguageIndex, - trainingTipsEnabled: trainingTipsEnabled, + trainingTipsEnabled: trainingTipsEnabled, initialPage: initialPage, shouldPersistToolSettings: shouldPersistToolSettings ) diff --git a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift index 8a7690dd7c..f736031770 100644 --- a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift +++ b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift @@ -183,8 +183,8 @@ class MobileContentPagesViewModel: NSObject, ObservableObject { return firstVisiblePage?.id == id || lastVisiblePage?.id == id case .pageNumber(let pageNumber): - let visiblePageCount = visiblePages.count - return pageNumber == 0 || pageNumber == visiblePageCount + let lastVisiblePageNumber = visiblePages.count - 1 + return pageNumber == 0 || pageNumber == lastVisiblePageNumber } } From 8457b071fd4beedc6ab0db7a83b53e4df267bd10 Mon Sep 17 00:00:00 2001 From: Anka Date: Fri, 15 Nov 2024 23:08:00 +0000 Subject: [PATCH 11/28] [skip ci] Adding latest localization files from OneSky --- godtools/Base.lproj/Localizable.strings | 4 ++++ godtools/lv-LV.lproj/Localizable.strings | 4 ++++ godtools/lv.lproj/Localizable.strings | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/godtools/Base.lproj/Localizable.strings b/godtools/Base.lproj/Localizable.strings index fde066803f..926a95223c 100644 --- a/godtools/Base.lproj/Localizable.strings +++ b/godtools/Base.lproj/Localizable.strings @@ -1,3 +1,7 @@ +"lessons.resumeLessonModal.title" = "Resume Progress"; +"lessons.resumeLessonModal.subtitle" = "Would you like to pick up where you left off?"; +"lessons.resumeLessonModal.startOverButton" = "Start over"; +"lessons.resumeLessonModal.continueButton" = "Continue"; "lessons.lessonCompleted" = "Completed"; "lessons.completionProgress" = "%@ Complete"; "network_connection_lost" = "The network connection was lost."; diff --git a/godtools/lv-LV.lproj/Localizable.strings b/godtools/lv-LV.lproj/Localizable.strings index 3d4256192c..0c4a3a64bc 100755 --- a/godtools/lv-LV.lproj/Localizable.strings +++ b/godtools/lv-LV.lproj/Localizable.strings @@ -1,3 +1,7 @@ +"lessons.resumeLessonModal.title" = "Atsākt progresu"; +"lessons.resumeLessonModal.subtitle" = "Vai vēlies turpināt iesākto?"; +"lessons.resumeLessonModal.startOverButton" = "Sākt no sākuma"; +"lessons.resumeLessonModal.continueButton" = "Turpināt"; "lessons.lessonCompleted" = "Pabeigts"; "lessons.completionProgress" = "%@ pabeigts"; "network_connection_lost" = "Tīkla savienojums tika pārtraukts."; diff --git a/godtools/lv.lproj/Localizable.strings b/godtools/lv.lproj/Localizable.strings index 3d4256192c..0c4a3a64bc 100644 --- a/godtools/lv.lproj/Localizable.strings +++ b/godtools/lv.lproj/Localizable.strings @@ -1,3 +1,7 @@ +"lessons.resumeLessonModal.title" = "Atsākt progresu"; +"lessons.resumeLessonModal.subtitle" = "Vai vēlies turpināt iesākto?"; +"lessons.resumeLessonModal.startOverButton" = "Sākt no sākuma"; +"lessons.resumeLessonModal.continueButton" = "Turpināt"; "lessons.lessonCompleted" = "Pabeigts"; "lessons.completionProgress" = "%@ pabeigts"; "network_connection_lost" = "Tīkla savienojums tika pārtraukts."; From 9c09146c6cd767c57783edda5a4d8586d3201e2d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 02:05:03 +0000 Subject: [PATCH 12/28] Lock file maintenance --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5885b12fd0..4814583323 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -25,8 +25,8 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.1003.0) - aws-sdk-core (3.212.0) + aws-partitions (1.1009.0) + aws-sdk-core (3.213.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -34,7 +34,7 @@ GEM aws-sdk-kms (1.95.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.170.0) + aws-sdk-s3 (1.171.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -224,7 +224,7 @@ GEM i18n (1.14.6) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.8.1) + json (2.8.2) jwt (2.9.3) base64 logger (1.6.1) @@ -265,7 +265,7 @@ GEM ruby-macho (2.5.1) ruby2_keywords (0.0.5) rubyzip (2.3.2) - securerandom (0.3.1) + securerandom (0.3.2) security (0.1.5) signet (0.19.0) addressable (~> 2.8) From 2de0a4f8b10f0d611c29ca64f9baa7836b726bc3 Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Tue, 19 Nov 2024 20:27:25 -0500 Subject: [PATCH 13/28] present modal from flow and remove closures --- .../Presentation/Lesson/LessonViewModel.swift | 7 ---- .../ResumeLessonProgressModalViewModel.swift | 12 +++---- godtools/App/Flows/Flow/FlowStep.swift | 3 +- godtools/App/Flows/Lesson/LessonFlow.swift | 32 +++++++++++-------- 4 files changed, 25 insertions(+), 29 deletions(-) diff --git a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift index 3fc9484cca..dccab38b20 100644 --- a/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift +++ b/godtools/App/Features/Lessons/Presentation/Lesson/LessonViewModel.swift @@ -25,13 +25,6 @@ class LessonViewModel: MobileContentPagesViewModel { let initialPageConfig = MobileContentPagesInitialPageConfig(shouldNavigateToStartPageIfLastPage: true, shouldNavigateToPreviousVisiblePageIfHiddenPage: true) super.init(renderer: renderer, initialPage: initialPage, initialPageConfig: initialPageConfig, resourcesRepository: resourcesRepository, translationsRepository: translationsRepository, mobileContentEventAnalytics: mobileContentEventAnalytics, getCurrentAppLanguageUseCase: getCurrentAppLanguageUseCase, getTranslatedLanguageName: getTranslatedLanguageName, initialPageRenderingType: .visiblePages, trainingTipsEnabled: trainingTipsEnabled, incrementUserCounterUseCase: incrementUserCounterUseCase, selectedLanguageIndex: nil) - - if let initialPage = initialPage, isFirstOrLastVisiblePage(page: initialPage) == false { - - flowDelegate.navigate(step: .presentResumeLessonModal { - self.navigateToFirstPage(animated: true) - }) - } } deinit { diff --git a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModalViewModel.swift b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModalViewModel.swift index dba914e64c..c5e50fa56c 100644 --- a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModalViewModel.swift +++ b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModalViewModel.swift @@ -11,10 +11,9 @@ import Combine class ResumeLessonProgressModalViewModel: ObservableObject { + private weak var flowDelegate: FlowDelegate? private let getInterfaceStringsUseCase: GetResumeLessonProgressModalInterfaceStringsUseCase private let getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase - private let startOverClosure: () -> Void - private let continueClosure: () -> Void private var cancellables: Set = Set() @@ -22,11 +21,10 @@ class ResumeLessonProgressModalViewModel: ObservableObject { @Published var interfaceStringsDomainModel: ResumeLessonProgressModalInterfaceStringsDomainModel = ResumeLessonProgressModalInterfaceStringsDomainModel.emptyStrings() - init(getInterfaceStringsUseCase: GetResumeLessonProgressModalInterfaceStringsUseCase, getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase, startOverClosure: @escaping () -> Void, continueClosure: @escaping () -> Void) { + init(flowDelegate: FlowDelegate, getInterfaceStringsUseCase: GetResumeLessonProgressModalInterfaceStringsUseCase, getCurrentAppLanguageUseCase: GetCurrentAppLanguageUseCase) { + self.flowDelegate = flowDelegate self.getInterfaceStringsUseCase = getInterfaceStringsUseCase self.getCurrentAppLanguageUseCase = getCurrentAppLanguageUseCase - self.startOverClosure = startOverClosure - self.continueClosure = continueClosure getCurrentAppLanguageUseCase .getLanguagePublisher() @@ -50,10 +48,10 @@ class ResumeLessonProgressModalViewModel: ObservableObject { // MARK: - Inputs func startOverButtonTapped() { - startOverClosure() + flowDelegate?.navigate(step: .startOverTappedFromResumeLessonModal) } func continueButtonTapped() { - continueClosure() + flowDelegate?.navigate(step: .continueTappedFromResumeLessonModal) } } diff --git a/godtools/App/Flows/Flow/FlowStep.swift b/godtools/App/Flows/Flow/FlowStep.swift index 69eb7c44d9..7e471756f1 100644 --- a/godtools/App/Flows/Flow/FlowStep.swift +++ b/godtools/App/Flows/Flow/FlowStep.swift @@ -37,7 +37,8 @@ enum FlowStep { case backTappedFromLessonLanguageFilter // lesson - case presentResumeLessonModal(startOverClosure: () -> Void) + case startOverTappedFromResumeLessonModal + case continueTappedFromResumeLessonModal case closeTappedFromLesson(lessonId: String, highestPageNumberViewed: Int) case lessonFlowCompleted(state: LessonFlowCompletedState) diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index 46b38561a0..1449763a90 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -12,6 +12,7 @@ import GodToolsToolParser class LessonFlow: ToolNavigationFlow, Flow { private let appLanguage: AppLanguageDomainModel + private var lessonViewModel: LessonViewModel? = nil private weak var flowDelegate: FlowDelegate? @@ -71,12 +72,20 @@ class LessonFlow: ToolNavigationFlow, Flow { trainingTipsEnabled: trainingTipsEnabled, incrementUserCounterUseCase: appDiContainer.domainLayer.getIncrementUserCounterUseCase() ) + lessonViewModel = viewModel let view = LessonView(viewModel: viewModel, navigationBar: nil) navigationController.pushViewController(view, animated: true) configureNavigationBar(shouldAnimateNavigationBarHiddenState: true) + + if let initialPage = initialPageOrPreviousProgress, viewModel.isFirstOrLastVisiblePage(page: initialPage) == false { + + let resumeLessonModal = getResumeLessonModal() + + navigationController.present(resumeLessonModal, animated: true) + } } deinit { @@ -93,17 +102,13 @@ class LessonFlow: ToolNavigationFlow, Flow { case .deepLink( _): break - - case .presentResumeLessonModal(let startOverClosure): - let resumeLessonModal = getResumeLessonModal(startOverClosure: { - startOverClosure() - self.navigationController.dismissPresented(animated: true, completion: nil) - - }, continueClosure: { - self.navigationController.dismissPresented(animated: true, completion: nil) - }) - navigationController.present(resumeLessonModal, animated: true) + case .startOverTappedFromResumeLessonModal: + navigationController.dismissPresented(animated: true, completion: nil) + lessonViewModel?.navigateToFirstPage(animated: true) + + case .continueTappedFromResumeLessonModal: + navigationController.dismissPresented(animated: true, completion: nil) case .closeTappedFromLesson(let lessonId, let highestPageNumberViewed): closeTool(lessonId: lessonId, highestPageNumberViewed: highestPageNumberViewed) @@ -146,12 +151,11 @@ class LessonFlow: ToolNavigationFlow, Flow { } } - private func getResumeLessonModal(startOverClosure: @escaping () -> Void, continueClosure: @escaping () -> Void) -> UIViewController { + private func getResumeLessonModal() -> UIViewController { let viewModel = ResumeLessonProgressModalViewModel( + flowDelegate: self, getInterfaceStringsUseCase: appDiContainer.feature.lessonProgress.domainLayer.getResumeLessonProgressModalInterfaceStringsUseCase(), - getCurrentAppLanguageUseCase: appDiContainer.feature.appLanguage.domainLayer.getCurrentAppLanguageUseCase(), - startOverClosure: startOverClosure, - continueClosure: continueClosure + getCurrentAppLanguageUseCase: appDiContainer.feature.appLanguage.domainLayer.getCurrentAppLanguageUseCase() ) let resumeLessonModal = ResumeLessonProgressModal(viewModel: viewModel) From 04ed3d313e7d44b93722ca2f121494391768e3de Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Tue, 19 Nov 2024 20:30:32 -0500 Subject: [PATCH 14/28] change font size --- .../ResumeLessonProgressModal/ResumeLessonProgressModal.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift index 4198678506..2a7de125be 100644 --- a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift +++ b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift @@ -53,10 +53,10 @@ struct ResumeLessonProgressModal: View { .padding(.bottom, 35) HStack(spacing: buttonSpace) { - GTWhiteButton(title: viewModel.interfaceStringsDomainModel.startOverButtonText, width: buttonWidth, height: buttonHeight) { + GTWhiteButton(title: viewModel.interfaceStringsDomainModel.startOverButtonText, fontSize: 15, width: buttonWidth, height: buttonHeight) { viewModel.startOverButtonTapped() } - GTBlueButton(title: viewModel.interfaceStringsDomainModel.continueButtonText, width: buttonWidth, height: buttonHeight) { + GTBlueButton(title: viewModel.interfaceStringsDomainModel.continueButtonText, fontSize: 15, width: buttonWidth, height: buttonHeight) { viewModel.continueButtonTapped() } } From 7884951b3647cbdde941f16a0ddf2033a2d8eed9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 01:08:21 +0000 Subject: [PATCH 15/28] Lock file maintenance --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4814583323..c72cbf24f7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -25,16 +25,16 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.1009.0) + aws-partitions (1.1013.0) aws-sdk-core (3.213.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.95.0) + aws-sdk-kms (1.96.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.171.0) + aws-sdk-s3 (1.173.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -234,7 +234,7 @@ GEM mime-types-data (3.2024.1105) mini_magick (4.13.2) mini_mime (1.1.5) - minitest (5.25.1) + minitest (5.25.2) molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.4.1) From 46ac16a30e2bc6177bc1451e10797573ba8d5d50 Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Mon, 25 Nov 2024 15:11:12 -0500 Subject: [PATCH 16/28] present lesson view after appears --- .../Pages/MobileContentPagesViewModel.swift | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift index f736031770..584ff94d7b 100644 --- a/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift +++ b/godtools/App/Services/Renderer/Views/MobileContent/Views/Pages/MobileContentPagesViewModel.swift @@ -172,22 +172,6 @@ class MobileContentPagesViewModel: NSObject, ObservableObject { return pageModels[index] } - func isFirstOrLastVisiblePage(page: MobileContentPagesPage) -> Bool { - let visiblePages = currentPageRenderer.value.getVisiblePageModels() - - switch page { - case .pageId(let id): - let firstVisiblePage = visiblePages.first - let lastVisiblePage = visiblePages.last - - return firstVisiblePage?.id == id || lastVisiblePage?.id == id - - case .pageNumber(let pageNumber): - let lastVisiblePageNumber = visiblePages.count - 1 - return pageNumber == 0 || pageNumber == lastVisiblePageNumber - } - } - func createToolSettingsLanguages() -> ToolSettingsLanguages { return ToolSettingsLanguages( primaryLanguageId: languages[0].id, From 0b1dda9a56e4034cac91c4de6c87585fcbb476f7 Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Mon, 25 Nov 2024 15:11:23 -0500 Subject: [PATCH 17/28] actually commit changes --- godtools/App/Flows/Lesson/LessonFlow.swift | 64 ++++++++++++++-------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index 1449763a90..3645cbc02a 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -12,9 +12,11 @@ import GodToolsToolParser class LessonFlow: ToolNavigationFlow, Flow { private let appLanguage: AppLanguageDomainModel - private var lessonViewModel: LessonViewModel? = nil + private let trainingTipsEnabled: Bool private weak var flowDelegate: FlowDelegate? + private var renderer: MobileContentRenderer? = nil + private var initialPageOrPreviousProgress: MobileContentPagesPage? = nil let appDiContainer: AppDiContainer let navigationController: AppNavigationController @@ -31,6 +33,7 @@ class LessonFlow: ToolNavigationFlow, Flow { self.appDiContainer = appDiContainer self.navigationController = sharedNavigationController self.appLanguage = appLanguage + self.trainingTipsEnabled = trainingTipsEnabled let navigation: MobileContentRendererNavigation = appDiContainer.getMobileContentRendererNavigation( parentFlow: self, @@ -38,31 +41,61 @@ class LessonFlow: ToolNavigationFlow, Flow { appLanguage: appLanguage ) - let renderer: MobileContentRenderer = appDiContainer.getMobileContentRenderer( + let renderer = appDiContainer.getMobileContentRenderer( type: .lesson, navigation: navigation, appLanguage: appLanguage, toolTranslations: toolTranslations ) + self.renderer = renderer - let initialPageOrPreviousProgress: MobileContentPagesPage? + var lastViewedPageId: String? = nil if let page = initialPage { initialPageOrPreviousProgress = page } else if let lessonProgress = appDiContainer.dataLayer.getUserLessonProgressRepository().getLessonProgress(lessonId: renderer.resource.id) { + lastViewedPageId = lessonProgress.lastViewedPageId initialPageOrPreviousProgress = .pageId(value: lessonProgress.lastViewedPageId) + } + + if let lastViewedPageId = lastViewedPageId, let visiblePages = renderer.pageRenderers.first?.getVisiblePageModels() { + let firstVisiblePage = visiblePages.first + let lastVisiblePage = visiblePages.last + + if firstVisiblePage?.id == lastViewedPageId || lastVisiblePage?.id == lastViewedPageId { + + navigateToLesson() + + } else { + + let resumeLessonModal = getResumeLessonModal() + + navigationController.present(resumeLessonModal, animated: true) + } } else { - initialPageOrPreviousProgress = nil + navigateToLesson() } + } + + deinit { + print("x deinit: \(type(of: self))") + } + + private func configureNavigationBar(shouldAnimateNavigationBarHiddenState: Bool) { + navigationController.setNavigationBarHidden(true, animated: shouldAnimateNavigationBarHiddenState) + } + + func navigateToLesson(shouldStartOver: Bool = false) { + guard let renderer = renderer else { return } let viewModel = LessonViewModel( flowDelegate: self, renderer: renderer, resource: renderer.resource, primaryLanguage: renderer.languages.primaryLanguage, - initialPage: initialPageOrPreviousProgress, + initialPage: shouldStartOver ? nil : initialPageOrPreviousProgress, resourcesRepository: appDiContainer.dataLayer.getResourcesRepository(), translationsRepository: appDiContainer.dataLayer.getTranslationsRepository(), mobileContentEventAnalytics: appDiContainer.getMobileContentRendererEventAnalyticsTracking(), @@ -72,28 +105,12 @@ class LessonFlow: ToolNavigationFlow, Flow { trainingTipsEnabled: trainingTipsEnabled, incrementUserCounterUseCase: appDiContainer.domainLayer.getIncrementUserCounterUseCase() ) - lessonViewModel = viewModel let view = LessonView(viewModel: viewModel, navigationBar: nil) - navigationController.pushViewController(view, animated: true) + navigationController.pushViewController(view, animated: false) configureNavigationBar(shouldAnimateNavigationBarHiddenState: true) - - if let initialPage = initialPageOrPreviousProgress, viewModel.isFirstOrLastVisiblePage(page: initialPage) == false { - - let resumeLessonModal = getResumeLessonModal() - - navigationController.present(resumeLessonModal, animated: true) - } - } - - deinit { - print("x deinit: \(type(of: self))") - } - - private func configureNavigationBar(shouldAnimateNavigationBarHiddenState: Bool) { - navigationController.setNavigationBarHidden(true, animated: shouldAnimateNavigationBarHiddenState) } func navigate(step: FlowStep) { @@ -104,10 +121,11 @@ class LessonFlow: ToolNavigationFlow, Flow { break case .startOverTappedFromResumeLessonModal: + navigateToLesson(shouldStartOver: true) navigationController.dismissPresented(animated: true, completion: nil) - lessonViewModel?.navigateToFirstPage(animated: true) case .continueTappedFromResumeLessonModal: + navigateToLesson() navigationController.dismissPresented(animated: true, completion: nil) case .closeTappedFromLesson(let lessonId, let highestPageNumberViewed): From 7f367bad955bef77365021d87bbd4ce32b7f9e45 Mon Sep 17 00:00:00 2001 From: Rachael Skeath Date: Mon, 25 Nov 2024 15:14:15 -0500 Subject: [PATCH 18/28] bump min version to iOS15 --- godtools.xcodeproj/project.pbxproj | 66 ++++++++----------- .../ResumeLessonProgressModal.swift | 11 +--- .../VisualEffectView/VisualEffectView.swift | 23 ------- 3 files changed, 30 insertions(+), 70 deletions(-) delete mode 100644 godtools/App/Share/SwiftUI Views/VisualEffectView/VisualEffectView.swift diff --git a/godtools.xcodeproj/project.pbxproj b/godtools.xcodeproj/project.pbxproj index 7b92b7d6c5..30b5b0b9e9 100644 --- a/godtools.xcodeproj/project.pbxproj +++ b/godtools.xcodeproj/project.pbxproj @@ -813,8 +813,8 @@ 459BF7812AFEE0320053BA09 /* ToolScreenShareTutorialViewsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459BF77D2AFEE0320053BA09 /* ToolScreenShareTutorialViewsRepository.swift */; }; 459C526F289418EB00DA9E95 /* TranslationManifestFileDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459C526E289418EB00DA9E95 /* TranslationManifestFileDataModel.swift */; }; 459C527128941A5B00DA9E95 /* TranslationFilesDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459C527028941A5B00DA9E95 /* TranslationFilesDataModel.swift */; }; - 459C56D225FF954F00F15967 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 459C56D325FF954F00F15967 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 459C56D225FF954F00F15967 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 459C56D325FF954F00F15967 /* (null) in Sources */ = {isa = PBXBuildFile; }; 459E27FA2AD8280D008275B3 /* DeleteUserCountersUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459E27F92AD8280D008275B3 /* DeleteUserCountersUseCase.swift */; }; 459E3A062A30BC2600070934 /* MenuItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459E3A032A30BC2600070934 /* MenuItemView.swift */; }; 459E3A072A30BC2600070934 /* MenuSectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459E3A042A30BC2600070934 /* MenuSectionView.swift */; }; @@ -1040,15 +1040,15 @@ 45B54C572A2641FE0042CD0E /* RealmDatabase+Read.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B54C542A2641FE0042CD0E /* RealmDatabase+Read.swift */; }; 45B54C582A2641FE0042CD0E /* RealmDatabase+Write.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B54C552A2641FE0042CD0E /* RealmDatabase+Write.swift */; }; 45B54C592A2641FE0042CD0E /* RealmDatabase+Delete.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B54C562A2641FE0042CD0E /* RealmDatabase+Delete.swift */; }; - 45B6480925E581660098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 45B6480A25E581660098BAF1 /* BuildFile in Resources */ = {isa = PBXBuildFile; }; - 45B6480B25E581660098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 45B6480C25E581660098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 45B6481625E58ECC0098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 45B6482025E58EE70098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 45B6482825E593110098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 45B6482925E593110098BAF1 /* BuildFile in Resources */ = {isa = PBXBuildFile; }; - 45B6482A25E593110098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6480925E581660098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 45B6480A25E581660098BAF1 /* (null) in Resources */ = {isa = PBXBuildFile; }; + 45B6480B25E581660098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 45B6480C25E581660098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 45B6481625E58ECC0098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 45B6482025E58EE70098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 45B6482825E593110098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 45B6482925E593110098BAF1 /* (null) in Resources */ = {isa = PBXBuildFile; }; + 45B6482A25E593110098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; 45B6FF2A2BAA39660037B240 /* ViewToolFilterLanguagesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B6FF282BAA39660037B240 /* ViewToolFilterLanguagesUseCase.swift */; }; 45B6FF2B2BAA39660037B240 /* ViewToolFilterCategoriesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B6FF292BAA39660037B240 /* ViewToolFilterCategoriesUseCase.swift */; }; 45B6FF302BAA39720037B240 /* SearchToolFilterLanguagesRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B6FF2C2BAA39710037B240 /* SearchToolFilterLanguagesRepositoryInterface.swift */; }; @@ -1535,7 +1535,6 @@ D4960CC82CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CC72CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift */; }; D4960CCC2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCB2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift */; }; D4960CCE2CD177980090B114 /* ResumeLessonProgressModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */; }; - D4960CD02CE429D80090B114 /* VisualEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CCF2CE429D80090B114 /* VisualEffectView.swift */; }; D4960CD32CE688140090B114 /* GetResumeLessonProgressModalInterfaceStringsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CD22CE688140090B114 /* GetResumeLessonProgressModalInterfaceStringsRepository.swift */; }; D4960CD52CE6886B0090B114 /* ResumeLessonProgressModalInterfaceStringsDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CD42CE6886B0090B114 /* ResumeLessonProgressModalInterfaceStringsDomainModel.swift */; }; D4960CD82CE6934E0090B114 /* ResumeLessonProgressModalViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4960CD72CE6934E0090B114 /* ResumeLessonProgressModalViewModel.swift */; }; @@ -3244,7 +3243,6 @@ D4960CC72CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserLessonProgressDomainModel.swift; sourceTree = ""; }; D4960CCB2CCC2C290090B114 /* MobileContentPagesInitialPageConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MobileContentPagesInitialPageConfig.swift; sourceTree = ""; }; D4960CCD2CD177980090B114 /* ResumeLessonProgressModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeLessonProgressModal.swift; sourceTree = ""; }; - D4960CCF2CE429D80090B114 /* VisualEffectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualEffectView.swift; sourceTree = ""; }; D4960CD22CE688140090B114 /* GetResumeLessonProgressModalInterfaceStringsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetResumeLessonProgressModalInterfaceStringsRepository.swift; sourceTree = ""; }; D4960CD42CE6886B0090B114 /* ResumeLessonProgressModalInterfaceStringsDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeLessonProgressModalInterfaceStringsDomainModel.swift; sourceTree = ""; }; D4960CD72CE6934E0090B114 /* ResumeLessonProgressModalViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeLessonProgressModalViewModel.swift; sourceTree = ""; }; @@ -11386,7 +11384,6 @@ 45E3478F2A49C04B0014CCD1 /* SeparatorView */, 45325F20285CF8B40078D932 /* TextWithLinks */, 45325F1D285CF8B40078D932 /* VideoView */, - D4960CD12CE42A280090B114 /* VisualEffectView */, ); path = "SwiftUI Views"; sourceTree = ""; @@ -11532,14 +11529,6 @@ path = GetTranslatedPercentage; sourceTree = ""; }; - D4960CD12CE42A280090B114 /* VisualEffectView */ = { - isa = PBXGroup; - children = ( - D4960CCF2CE429D80090B114 /* VisualEffectView.swift */, - ); - path = VisualEffectView; - sourceTree = ""; - }; D4960CD62CE693320090B114 /* ResumeLessonProgressModal */ = { isa = PBXGroup; children = ( @@ -12253,7 +12242,7 @@ 451A17522756C10400D35D78 /* tutorial_screenshare.json in Resources */, D4B522D929D761B700D85213 /* Localizable.stringsdict in Resources */, 1737DFDF22FDB48000223CB0 /* GoogleService-Info.plist in Resources */, - 45B6482925E593110098BAF1 /* BuildFile in Resources */, + 45B6482925E593110098BAF1 /* (null) in Resources */, 458CFE9329D4E0B9007B423C /* ArticlesErrorMessageView.xib in Resources */, 455583FC269F2DA500C3FF14 /* MobileContentInputView.xib in Resources */, 451A17542756C10400D35D78 /* tutorial_tooltip.json in Resources */, @@ -12286,7 +12275,7 @@ D19EB5E0259BB75900685156 /* training_tip_tips.json in Resources */, 458CFE9129D4E0B9007B423C /* ArticleWebView.xib in Resources */, 4555840F269F2DA500C3FF14 /* MobileContentTextView.xib in Resources */, - 45B6480A25E581660098BAF1 /* BuildFile in Resources */, + 45B6480A25E581660098BAF1 /* (null) in Resources */, 45F7162E290A12D70019B715 /* WebContentView.xib in Resources */, 45DEF22E2576A6A20007AC64 /* learn_to_share_tool_with_anyone.json in Resources */, 45BE4A7D2AF28788004021DA /* SF-Pro-Display-Regular.otf in Resources */, @@ -12505,7 +12494,7 @@ 45D63E56288F67F8009B4610 /* IgnoreCacheSession.swift in Sources */, 458B91C32B7D676900785C6F /* ViewFavoritesDomainModel.swift in Sources */, 459E86DD28EDA86C00E197A5 /* DeepLinkUrlParserType.swift in Sources */, - 459C56D225FF954F00F15967 /* BuildFile in Sources */, + 459C56D225FF954F00F15967 /* (null) in Sources */, 45D63E86288F75B0009B4610 /* RealmAttachment.swift in Sources */, 45C649C22B31E212000249E0 /* GetShareToolInterfaceStringsRepositoryInterface.swift in Sources */, 45A8BDE32ACC9F47007A1EBB /* LessonsViewModel.swift in Sources */, @@ -12540,7 +12529,7 @@ 45AC9DED2B28A9CD00DEEBFE /* LanguageDownloadIcon.swift in Sources */, 459E86EE28EDA86C00E197A5 /* DeepLinkingParserManifestUrl.swift in Sources */, 45D00A1A2B1FD0E3007D2B65 /* String+ParseUrls.swift in Sources */, - 45B6481625E58ECC0098BAF1 /* BuildFile in Sources */, + 45B6481625E58ECC0098BAF1 /* (null) in Sources */, 45F3AF062B5EC0A600CE8D41 /* PageNavigationCollectionViewFlowLayout.swift in Sources */, 45CBDA042BA38F200007DEC8 /* LaunchCountCache.swift in Sources */, 45F71629290A12D70019B715 /* WebContentType.swift in Sources */, @@ -12604,7 +12593,7 @@ 45B3382F2AF42A6400D18C63 /* TutorialInterfaceStringsDomainModel.swift in Sources */, D4E7EE262CA5E62B00F75DA6 /* StoreUserLessonProgressRepository.swift in Sources */, D4E7EE1A2CA345DD00F75DA6 /* UserLessonProgressRepository.swift in Sources */, - 45B6480B25E581660098BAF1 /* BuildFile in Sources */, + 45B6480B25E581660098BAF1 /* (null) in Sources */, 458B91B12B7D5D6800785C6F /* ConfirmRemoveToolFromFavoritesAlertViewModel.swift in Sources */, 4512D4D32B29127C00DFAFB3 /* GetToolSettingsToolLanguagesListInterfaceStringsRepository.swift in Sources */, 4534F93B2AE9B11600A7A071 /* RealmLessonEvaluation.swift in Sources */, @@ -12712,7 +12701,7 @@ 459BF77E2AFEE0320053BA09 /* ToolScreenShareTutorialViewDataModel.swift in Sources */, 45EB9B7229F16CF200CA74A8 /* UILabel+AttributedString.swift in Sources */, 45B54C572A2641FE0042CD0E /* RealmDatabase+Read.swift in Sources */, - 45B6482025E58EE70098BAF1 /* BuildFile in Sources */, + 45B6482025E58EE70098BAF1 /* (null) in Sources */, 45645C162AFE774900BD233D /* GetShareToolScreenShareSessionInterfaceStringsRepository.swift in Sources */, 45AD1BD925938A4F00A096A0 /* AlertMessageView.swift in Sources */, 4512D4DD2B29129100DFAFB3 /* ToolSettingsToolLanguagesListItemView.swift in Sources */, @@ -12785,7 +12774,6 @@ 4534F91E2AE99EAA00A7A071 /* GetLessonEvaluationInterfaceStringsRepositoryInterface.swift in Sources */, 458B91AF2B7D5D6800785C6F /* YourFavoriteToolsHeaderView.swift in Sources */, D455F3FE29805BF0009D5F93 /* GetUserActivityBadgeUseCase.swift in Sources */, - D4960CD02CE429D80090B114 /* VisualEffectView.swift in Sources */, 4534F9282AE9A15E00A7A071 /* LessonEvaluationInterfaceStringsDomainModel.swift in Sources */, 45880D812BD2BA97008F021C /* ShareGodToolsView.swift in Sources */, 456BD2CC27020C75004D7B19 /* MobileContentViewHeightConstraintType.swift in Sources */, @@ -12881,7 +12869,7 @@ 45C8835D2A93EDDF00F33E6D /* DashboardTabBarItemView.swift in Sources */, 4504BA282AF3EE67001151E5 /* GetTutorialUseCase.swift in Sources */, 459F86862AC51A9A00B4E5CA /* ChooseAppLanguageNavigationFlow.swift in Sources */, - 45B6480925E581660098BAF1 /* BuildFile in Sources */, + 45B6480925E581660098BAF1 /* (null) in Sources */, 45EB9B8329F16CF200CA74A8 /* Color+RGB.swift in Sources */, 45558407269F2DA500C3FF14 /* MobileContentPagesViewModel.swift in Sources */, 45ACCA582CD2BFBB00567AE6 /* AppMessagingInterface.swift in Sources */, @@ -13098,7 +13086,7 @@ 45BE4A812AF287D2004021DA /* ConfirmAppLanguageViewModel.swift in Sources */, 45AE975527C97A9500C2CB33 /* Input+MobileContentRenderableModel.swift in Sources */, 452D355A2A8FB9EB00BC4F97 /* FavoritedResourceDataModel.swift in Sources */, - 459C56D325FF954F00F15967 /* BuildFile in Sources */, + 459C56D325FF954F00F15967 /* (null) in Sources */, 451CCF1427A9AA4700E8D2D3 /* MobileContentViewPositionState.swift in Sources */, 45F71623290A12D70019B715 /* WebContentViewModel.swift in Sources */, 458B91AB2B7D5D6800785C6F /* FavoritesView.swift in Sources */, @@ -13174,7 +13162,7 @@ 45AAC2AB2BB30F0A000AE690 /* MobileContentGlobalAnalyticsDecodable.swift in Sources */, 45EB9B7329F16CF200CA74A8 /* UIButton+ImageColor.swift in Sources */, 45F378FC2B23642600EEF039 /* GetLearnToShareToolTutorialItemsRepository.swift in Sources */, - 45B6482A25E593110098BAF1 /* BuildFile in Sources */, + 45B6482A25E593110098BAF1 /* (null) in Sources */, D42FEBD62875D8D50002FAD9 /* GetOptInOnboardingTutorialAvailableUseCase.swift in Sources */, 4534F92C2AE9A99200A7A071 /* TrackLessonFeedbackDomainModel.swift in Sources */, D40D77BF2AB36766008D3642 /* SearchBarViewModel.swift in Sources */, @@ -13256,7 +13244,7 @@ 458B91B02B7D5D6800785C6F /* YourFavoriteToolsView.swift in Sources */, 452DFB372B7FAAE5003A4A59 /* GetToolListItemInterfaceStringsRepository.swift in Sources */, 45369AD72AFA7FA500BD10F0 /* ToolScreenShareTutorialView.swift in Sources */, - 45B6480C25E581660098BAF1 /* BuildFile in Sources */, + 45B6480C25E581660098BAF1 /* (null) in Sources */, 45723DF72ABA24CE00C697E6 /* MobileContentApiErrorCodableCode.swift in Sources */, 45369AD42AFA7FA500BD10F0 /* ToolScreenShareTutorialPageDomainModel.swift in Sources */, 455582E5269F2C1000C3FF14 /* TrainingTipView.swift in Sources */, @@ -13393,7 +13381,7 @@ 4585BF662AC391F100A6D720 /* SetUserPreferredAppLanguageRepositoryInterface.swift in Sources */, 45F378FF2B23642600EEF039 /* LearnToShareToolDataLayerDependencies.swift in Sources */, 45B3F44A2AC3A86100D61BFD /* UserAppLanguageRepository.swift in Sources */, - 45B6482825E593110098BAF1 /* BuildFile in Sources */, + 45B6482825E593110098BAF1 /* (null) in Sources */, 45A835102AD1A40D004F5593 /* GetToolDetailsMediaUseCase.swift in Sources */, 4534F9462AE9B8E700A7A071 /* GetLessonEvaluatedUseCase.swift in Sources */, 45F378FD2B23642600EEF039 /* LearnToShareToolDomainLayerDependencies.swift in Sources */, @@ -14257,7 +14245,7 @@ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = DQ48D9BF2V; DISPLAY_NAME = "GT-Analytics"; INFOPLIST_FILE = godtools/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14459,7 +14447,7 @@ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = DQ48D9BF2V; DISPLAY_NAME = "GT-Stage"; INFOPLIST_FILE = godtools/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14660,7 +14648,7 @@ DEVELOPMENT_TEAM = DQ48D9BF2V; DISPLAY_NAME = "GT-Debug"; INFOPLIST_FILE = godtools/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14861,7 +14849,7 @@ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = DQ48D9BF2V; DISPLAY_NAME = "GT-Production"; INFOPLIST_FILE = godtools/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -15098,7 +15086,7 @@ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = DQ48D9BF2V; DISPLAY_NAME = GodTools; INFOPLIST_FILE = godtools/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift index 2a7de125be..40d1178333 100644 --- a/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift +++ b/godtools/App/Features/UserLessonProgress/Presentation/ResumeLessonProgressModal/ResumeLessonProgressModal.swift @@ -29,14 +29,9 @@ struct ResumeLessonProgressModal: View { let buttonWidth = (modalWidth - totalSpaceAroundButtons) / 2 ZStack { - if #available(iOS 15.0, *) { - Color.clear - .edgesIgnoringSafeArea(.all) - .background(.ultraThinMaterial) - } else { - VisualEffectView(effect: UIBlurEffect(style: .systemUltraThinMaterial)) - .edgesIgnoringSafeArea(.all) - } + Color.clear + .edgesIgnoringSafeArea(.all) + .background(.ultraThinMaterial) VStack(spacing: 0) { Text(viewModel.interfaceStringsDomainModel.title) diff --git a/godtools/App/Share/SwiftUI Views/VisualEffectView/VisualEffectView.swift b/godtools/App/Share/SwiftUI Views/VisualEffectView/VisualEffectView.swift deleted file mode 100644 index 08768a6e32..0000000000 --- a/godtools/App/Share/SwiftUI Views/VisualEffectView/VisualEffectView.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// VisualEffectView.swift -// godtools -// -// Created by Rachael Skeath on 11/12/24. -// Copyright © 2024 Cru. All rights reserved. -// - -import Foundation -import SwiftUI - -struct VisualEffectView: UIViewRepresentable { - - var effect: UIVisualEffect? - - func makeUIView(context: UIViewRepresentableContext) -> UIVisualEffectView { - return UIVisualEffectView() - } - - func updateUIView(_ uiView: UIVisualEffectView, context: UIViewRepresentableContext) { - uiView.effect = effect - } -} From b7cec399ac860ceb68660bc3b2839d1f5159058f Mon Sep 17 00:00:00 2001 From: Levi Eggert Date: Mon, 25 Nov 2024 18:27:33 -0500 Subject: [PATCH 19/28] Update pod to minimum iOS 15 --- Podfile | 2 +- Podfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Podfile b/Podfile index 911d629212..875a909017 100644 --- a/Podfile +++ b/Podfile @@ -3,7 +3,7 @@ source 'https://cdn.cocoapods.org/' source 'https://github.com/CruGlobal/cocoapods-specs.git' # Uncomment this line to define a global platform for your project -platform :ios, '14.0' +platform :ios, '15.0' # Specs finder: # https://github.com/CocoaPods/Specs/find/master diff --git a/Podfile.lock b/Podfile.lock index 4bc42642ac..ca86df5303 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -9,8 +9,8 @@ SPEC REPOS: - GodToolsShared SPEC CHECKSUMS: - GodToolsShared: 0b717d26f71b2eb7748b6999ad3d2d6fe7a8c401 + GodToolsShared: 6001489c49a3af8a0ae8b169bf2604ccf3009666 -PODFILE CHECKSUM: 4afa67206a45df71c21cb5eb808888f3037d2463 +PODFILE CHECKSUM: 62029dbaa542f28b266404816e2713f7474b6cb7 COCOAPODS: 1.15.2 From 7d1c74b6cd1136d81726839eaf4dc29ea3441cce Mon Sep 17 00:00:00 2001 From: Levi Eggert Date: Mon, 25 Nov 2024 18:27:57 -0500 Subject: [PATCH 20/28] Remove iOS 14 obsoleted files --- godtools.xcodeproj/project.pbxproj | 73 +++++++++++---- ...oolDetailsSectionDescriptionTextView.swift | 13 ++- .../Swift/String/String+ToUrlMarkdown.swift | 1 - .../SwiftUI Views/SearchBar/SearchBar.swift | 1 - .../SearchBar/SearchBarLegacy.swift | 75 --------------- .../SearchBar/SearchBarView.swift | 12 +-- .../BackwardsCompatibleTextWithLinks.swift | 67 -------------- .../TextViewLinksCoordinator.swift | 27 ------ .../TextWithLinks/TextWithLinks.swift | 92 ------------------- .../TextWithLinks/TextWithLinksView.swift | 1 - 10 files changed, 65 insertions(+), 297 deletions(-) delete mode 100644 godtools/App/Share/SwiftUI Views/SearchBar/SearchBarLegacy.swift delete mode 100644 godtools/App/Share/SwiftUI Views/TextWithLinks/BackwardsCompatibleTextWithLinks.swift delete mode 100644 godtools/App/Share/SwiftUI Views/TextWithLinks/TextViewLinksCoordinator.swift delete mode 100644 godtools/App/Share/SwiftUI Views/TextWithLinks/TextWithLinks.swift diff --git a/godtools.xcodeproj/project.pbxproj b/godtools.xcodeproj/project.pbxproj index 30b5b0b9e9..25edebfcef 100644 --- a/godtools.xcodeproj/project.pbxproj +++ b/godtools.xcodeproj/project.pbxproj @@ -244,8 +244,6 @@ 45325F25285CF8B40078D932 /* AnimatedSwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45325F1C285CF8B40078D932 /* AnimatedSwiftUIView.swift */; }; 45325F26285CF8B40078D932 /* VideoViewRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45325F1E285CF8B40078D932 /* VideoViewRepresentable.swift */; }; 45325F27285CF8B40078D932 /* VideoViewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45325F1F285CF8B40078D932 /* VideoViewCoordinator.swift */; }; - 45325F28285CF8B40078D932 /* TextWithLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45325F21285CF8B40078D932 /* TextWithLinks.swift */; }; - 45325F29285CF8B40078D932 /* TextViewLinksCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45325F22285CF8B40078D932 /* TextViewLinksCoordinator.swift */; }; 45325F2D285CF8DA0078D932 /* ViewGeometry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45325F2B285CF8D90078D932 /* ViewGeometry.swift */; }; 45325F2E285CF8DA0078D932 /* ViewSizePreferenceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45325F2C285CF8D90078D932 /* ViewSizePreferenceKey.swift */; }; 4533C4CE28AC2C4C00F9628B /* LaunchCountRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4533C4CD28AC2C4C00F9628B /* LaunchCountRepository.swift */; }; @@ -372,7 +370,6 @@ 453F84DC2A02A0390005101E /* ArticleCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453F84D92A02A0390005101E /* ArticleCategory.swift */; }; 45430CF12B1FB43E002B94A3 /* TextWithLinksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45430CF02B1FB43E002B94A3 /* TextWithLinksView.swift */; }; 45430CF62B1FB638002B94A3 /* String+ToUrlMarkdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45430CF52B1FB638002B94A3 /* String+ToUrlMarkdown.swift */; }; - 45430CF82B1FBA2A002B94A3 /* BackwardsCompatibleTextWithLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45430CF72B1FBA2A002B94A3 /* BackwardsCompatibleTextWithLinks.swift */; }; 454ADAD52ABDD9D400037C27 /* LanguageSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454ADACE2ABDD9D400037C27 /* LanguageSettingsViewModel.swift */; }; 454ADAD62ABDD9D400037C27 /* AppInterfaceLanguageButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454ADAD22ABDD9D400037C27 /* AppInterfaceLanguageButtonView.swift */; }; 454ADAD72ABDD9D400037C27 /* LanguageSettingsAppInterfaceLanguageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454ADAD32ABDD9D400037C27 /* LanguageSettingsAppInterfaceLanguageView.swift */; }; @@ -1601,7 +1598,6 @@ D4C2A5962C3CAC240035AB4D /* StoreUserLessonFiltersUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4C2A5952C3CAC240035AB4D /* StoreUserLessonFiltersUseCase.swift */; }; D4C2A5982C3CAC420035AB4D /* StoreUserLessonFiltersRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4C2A5972C3CAC420035AB4D /* StoreUserLessonFiltersRepositoryInterface.swift */; }; D4C2A59A2C3CAD0E0035AB4D /* StoreUserLessonFiltersRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4C2A5992C3CAD0E0035AB4D /* StoreUserLessonFiltersRepository.swift */; }; - D4C759212BB643EF00D6AEB2 /* SearchBarLegacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4C759202BB643EF00D6AEB2 /* SearchBarLegacy.swift */; }; D4D6614A2CB077D0006B20BF /* LessonListItemProgressDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D661492CB077D0006B20BF /* LessonListItemProgressDomainModel.swift */; }; D4E243CC29EDC6A100EA4BB7 /* SendFeedbackWebContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4E243CB29EDC6A100EA4BB7 /* SendFeedbackWebContent.swift */; }; D4E243CE29EDCA5700EA4BB7 /* ReportABugWebContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4E243CD29EDCA5700EA4BB7 /* ReportABugWebContent.swift */; }; @@ -1917,8 +1913,6 @@ 45325F1C285CF8B40078D932 /* AnimatedSwiftUIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimatedSwiftUIView.swift; sourceTree = ""; }; 45325F1E285CF8B40078D932 /* VideoViewRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoViewRepresentable.swift; sourceTree = ""; }; 45325F1F285CF8B40078D932 /* VideoViewCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoViewCoordinator.swift; sourceTree = ""; }; - 45325F21285CF8B40078D932 /* TextWithLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextWithLinks.swift; sourceTree = ""; }; - 45325F22285CF8B40078D932 /* TextViewLinksCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextViewLinksCoordinator.swift; sourceTree = ""; }; 45325F2B285CF8D90078D932 /* ViewGeometry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewGeometry.swift; sourceTree = ""; }; 45325F2C285CF8D90078D932 /* ViewSizePreferenceKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewSizePreferenceKey.swift; sourceTree = ""; }; 4533C4CD28AC2C4C00F9628B /* LaunchCountRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchCountRepository.swift; sourceTree = ""; }; @@ -2050,7 +2044,6 @@ 453FE09E2BBEDC770090DED1 /* SearchToolFilterCategoriesRepositoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchToolFilterCategoriesRepositoryTests.swift; sourceTree = ""; }; 45430CF02B1FB43E002B94A3 /* TextWithLinksView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextWithLinksView.swift; sourceTree = ""; }; 45430CF52B1FB638002B94A3 /* String+ToUrlMarkdown.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+ToUrlMarkdown.swift"; sourceTree = ""; }; - 45430CF72B1FBA2A002B94A3 /* BackwardsCompatibleTextWithLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackwardsCompatibleTextWithLinks.swift; sourceTree = ""; }; 454ADACE2ABDD9D400037C27 /* LanguageSettingsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageSettingsViewModel.swift; sourceTree = ""; }; 454ADAD22ABDD9D400037C27 /* AppInterfaceLanguageButtonView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppInterfaceLanguageButtonView.swift; sourceTree = ""; }; 454ADAD32ABDD9D400037C27 /* LanguageSettingsAppInterfaceLanguageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageSettingsAppInterfaceLanguageView.swift; sourceTree = ""; }; @@ -3373,7 +3366,6 @@ D4C2A5952C3CAC240035AB4D /* StoreUserLessonFiltersUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreUserLessonFiltersUseCase.swift; sourceTree = ""; }; D4C2A5972C3CAC420035AB4D /* StoreUserLessonFiltersRepositoryInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreUserLessonFiltersRepositoryInterface.swift; sourceTree = ""; }; D4C2A5992C3CAD0E0035AB4D /* StoreUserLessonFiltersRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreUserLessonFiltersRepository.swift; sourceTree = ""; }; - D4C759202BB643EF00D6AEB2 /* SearchBarLegacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBarLegacy.swift; sourceTree = ""; }; D4D661492CB077D0006B20BF /* LessonListItemProgressDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LessonListItemProgressDomainModel.swift; sourceTree = ""; }; D4E243CB29EDC6A100EA4BB7 /* SendFeedbackWebContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendFeedbackWebContent.swift; sourceTree = ""; }; D4E243CD29EDCA5700EA4BB7 /* ReportABugWebContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportABugWebContent.swift; sourceTree = ""; }; @@ -4637,9 +4629,6 @@ 45325F20285CF8B40078D932 /* TextWithLinks */ = { isa = PBXGroup; children = ( - 45430CF72B1FBA2A002B94A3 /* BackwardsCompatibleTextWithLinks.swift */, - 45325F21285CF8B40078D932 /* TextWithLinks.swift */, - 45325F22285CF8B40078D932 /* TextViewLinksCoordinator.swift */, 45430CF02B1FB43E002B94A3 /* TextWithLinksView.swift */, ); path = TextWithLinks; @@ -11245,7 +11234,6 @@ isa = PBXGroup; children = ( D496B9052A9E702200CBEA19 /* SearchBar.swift */, - D4C759202BB643EF00D6AEB2 /* SearchBarLegacy.swift */, 45ACEE1B2AD0493F004B62E4 /* SearchBarView.swift */, D40D77BE2AB36766008D3642 /* SearchBarViewModel.swift */, ); @@ -11969,6 +11957,7 @@ 4F12296920852BE3008842CC /* Frameworks */, 4F12296A20852BE3008842CC /* Resources */, 452556462C383C3F00AA0046 /* Embed Frameworks */, + 2D5EA523440839626249CDB4 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -12005,6 +11994,7 @@ 45B10ADF2BF3F270004342AB /* Embed Frameworks */, 45AD220F2593C66B00A096A0 /* Run Crashlytics */, 451C8B7628AEC6AD00E98AFA /* Download Initial Resources */, + 7A035592B08A8E100C0CD795 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -12039,6 +12029,7 @@ 684328EE1EB7CF66005E9131 /* Frameworks */, 684328EF1EB7CF66005E9131 /* Resources */, 45C382C02BF3FC5600378656 /* Embed Frameworks */, + CD25C11DF6C494453DB97F93 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -12333,6 +12324,24 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 2D5EA523440839626249CDB4 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-godtoolsUITests/Pods-godtoolsUITests-frameworks.sh", + "${PODS_ROOT}/GodToolsShared/build/cocoapods/framework/GodToolsToolParser.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GodToolsToolParser.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-godtoolsUITests/Pods-godtoolsUITests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 451C8B7628AEC6AD00E98AFA /* Download Initial Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 8; @@ -12411,6 +12420,42 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 7A035592B08A8E100C0CD795 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-godtools/Pods-godtools-frameworks.sh", + "${PODS_ROOT}/GodToolsShared/build/cocoapods/framework/GodToolsToolParser.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GodToolsToolParser.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-godtools/Pods-godtools-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + CD25C11DF6C494453DB97F93 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-godtoolsTests/Pods-godtoolsTests-frameworks.sh", + "${PODS_ROOT}/GodToolsShared/build/cocoapods/framework/GodToolsToolParser.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GodToolsToolParser.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-godtoolsTests/Pods-godtoolsTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -12668,7 +12713,6 @@ 45828BD3279CCBD200F6B5F3 /* MobileContentFlowViewModel.swift in Sources */, 4598BD2A2BF7DF6800196463 /* SocialSignInButtonView.swift in Sources */, 4598BD132BF7DF6800196463 /* AuthenticationProviderType.swift in Sources */, - 45325F29285CF8B40078D932 /* TextViewLinksCoordinator.swift in Sources */, 453F84C42A029FC00005101E /* RealmArticleAemData.swift in Sources */, 459BF7812AFEE0320053BA09 /* ToolScreenShareTutorialViewsRepository.swift in Sources */, 45F71626290A12D70019B715 /* WebContent.swift in Sources */, @@ -12856,7 +12900,6 @@ 45E60D022AEAE1E600E14BEA /* CircledTextView.swift in Sources */, 450D7B0328E32965006C3FDF /* TrackDownloadedTranslationsRepository.swift in Sources */, 45FB161327DBDDB60009DF8E /* ChooseYourOwnAdventureFlowCompletedState.swift in Sources */, - 45430CF82B1FBA2A002B94A3 /* BackwardsCompatibleTextWithLinks.swift in Sources */, 45AD20BC25938F1A00A096A0 /* SignalValue.swift in Sources */, 455E98B029A42ABB00D1EF35 /* OnboardingTutorialMediaViewModel.swift in Sources */, 45F7B0B82AF18E9000A0E7B4 /* GetMenuInterfaceStringsRepositoryInterface.swift in Sources */, @@ -13075,7 +13118,6 @@ 45C152482A43D21D00F2A1E8 /* ToolSettingsTopBarView.swift in Sources */, D4C2A5622C30909D0035AB4D /* GetLessonFilterLanguagesInterfaceStringsRepositoryInterface.swift in Sources */, 4573134028C1821200481640 /* ToolDetailsPrimaryButtonsView.swift in Sources */, - 45325F28285CF8B40078D932 /* TextWithLinks.swift in Sources */, D4E7EE1E2CA48F0000F75DA6 /* UserLessonProgressDataModel.swift in Sources */, 4567CE4327CD15D300C3B543 /* MobileContentRendererLanguageTranslationManifest.swift in Sources */, 453F0B6226EA369000436EE4 /* MobileContentMultiSelectOptionViewModel.swift in Sources */, @@ -13664,7 +13706,6 @@ 455EE83C2AEC586200C3205C /* GetDownloadToolProgressInterfaceStringsUseCase.swift in Sources */, D4B05FF529106212005852D0 /* MobileContentAuthTokenRepository.swift in Sources */, 45F7B0B32AF18E3D00A0E7B4 /* GetMenuInterfaceStringsUseCase.swift in Sources */, - D4C759212BB643EF00D6AEB2 /* SearchBarLegacy.swift in Sources */, 45880D872BD2BBAF008F021C /* ViewShareGodToolsUseCase.swift in Sources */, 45FE825A2ACE5D8C00930C39 /* NavBarItemController.swift in Sources */, 4570C3032ADDC86600F0B83B /* AppNavigationBarAppearance.swift in Sources */, diff --git a/godtools/App/Features/ToolDetails/Presentation/ToolDetails/Subviews/ToolDetailsSectionDescriptionTextView.swift b/godtools/App/Features/ToolDetails/Presentation/ToolDetails/Subviews/ToolDetailsSectionDescriptionTextView.swift index ccc5a7cc91..b38cfb5eb3 100644 --- a/godtools/App/Features/ToolDetails/Presentation/ToolDetails/Subviews/ToolDetailsSectionDescriptionTextView.swift +++ b/godtools/App/Features/ToolDetails/Presentation/ToolDetails/Subviews/ToolDetailsSectionDescriptionTextView.swift @@ -30,14 +30,13 @@ struct ToolDetailsSectionDescriptionTextView: View { VStack(alignment: .center, spacing: 0) { - BackwardsCompatibleTextWithLinks( - geometry: geometry, - text: text, - textColor: textColor, - textFont: textFont, - fontSize: fontSize, + TextWithLinksView( + stringContainingUrls: text, + textColor: textColor.color, + font: textFont.font(size: fontSize), lineSpacing: lineSpacing, - urlTappedClosure: { (url: URL) in + textAlignment: .leading, + handleUrlClosure: { (url: URL) in viewModel.urlTapped(url: url) } diff --git a/godtools/App/Share/Common/SharedAppleExtensions/Swift/String/String+ToUrlMarkdown.swift b/godtools/App/Share/Common/SharedAppleExtensions/Swift/String/String+ToUrlMarkdown.swift index 5391fb00a2..545bcfbfe4 100644 --- a/godtools/App/Share/Common/SharedAppleExtensions/Swift/String/String+ToUrlMarkdown.swift +++ b/godtools/App/Share/Common/SharedAppleExtensions/Swift/String/String+ToUrlMarkdown.swift @@ -8,7 +8,6 @@ import Foundation -@available(iOS 15.0, *) extension String { func toUrlMarkdown(attributedStringOptions: AttributedString.MarkdownParsingOptions? = nil) -> Result { diff --git a/godtools/App/Share/SwiftUI Views/SearchBar/SearchBar.swift b/godtools/App/Share/SwiftUI Views/SearchBar/SearchBar.swift index 4434b229d1..eda1290382 100644 --- a/godtools/App/Share/SwiftUI Views/SearchBar/SearchBar.swift +++ b/godtools/App/Share/SwiftUI Views/SearchBar/SearchBar.swift @@ -10,7 +10,6 @@ import SwiftUI // adapted from https://www.appcoda.com/swiftui-search-bar/ -@available(iOS 15.0, *) struct SearchBar: View { @ObservedObject private var viewModel: SearchBarViewModel diff --git a/godtools/App/Share/SwiftUI Views/SearchBar/SearchBarLegacy.swift b/godtools/App/Share/SwiftUI Views/SearchBar/SearchBarLegacy.swift deleted file mode 100644 index 9b44efb2e2..0000000000 --- a/godtools/App/Share/SwiftUI Views/SearchBar/SearchBarLegacy.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// SearchBarLegacy.swift -// godtools -// -// Created by Rachael Skeath on 3/28/24. -// Copyright © 2024 Cru. All rights reserved. -// - -import SwiftUI - -@available(iOS, deprecated: 14.0, obsoleted: 15.0, message: "For iOS 14 use SearchBarLegacy.swift and iOS 15 and up use SearchBar.swift") -struct SearchBarLegacy: View { - - @ObservedObject private var viewModel: SearchBarViewModel - - @State private var isEditing = false - @Binding private var searchText: String - - init(viewModel: SearchBarViewModel, searchText: Binding) { - - self.viewModel = viewModel - self._searchText = searchText - } - - var body: some View { - HStack { - - TextField("", text: $searchText, onEditingChanged: { _ in - self.isEditing = true - }, onCommit: { - DispatchQueue.main.async { - - self.isEditing = false - } - }) - .padding(7) - .padding(.horizontal, 27) - .background(Color.white) - .cornerRadius(6) - .overlay( - HStack { - - Image(systemName: "magnifyingglass") - .foregroundColor(.gray) - .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) - .padding(.leading, 10) - - if isEditing { - Button(action: { - self.searchText = "" - - }) { - Image(systemName: "multiply.circle.fill") - .foregroundColor(.gray) - .padding(.trailing, 10) - } - } - } - ) - - if isEditing { - Button(action: { - DispatchQueue.main.async { - self.isEditing = false - self.searchText = "" - } - - UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) - }) { - Text(viewModel.cancelText) - } - } - } - } -} diff --git a/godtools/App/Share/SwiftUI Views/SearchBar/SearchBarView.swift b/godtools/App/Share/SwiftUI Views/SearchBar/SearchBarView.swift index 4764aec56d..0833077f5e 100644 --- a/godtools/App/Share/SwiftUI Views/SearchBar/SearchBarView.swift +++ b/godtools/App/Share/SwiftUI Views/SearchBar/SearchBarView.swift @@ -28,16 +28,8 @@ struct SearchBarView: View { Rectangle() .fill(SearchBarView.ultraLightGrey) - if #available(iOS 15.0, *) { - - SearchBar(viewModel: viewModel, searchText: $searchText) - .padding(10) - - } else { - - SearchBarLegacy(viewModel: viewModel, searchText: $searchText) - .padding(10) - } + SearchBar(viewModel: viewModel, searchText: $searchText) + .padding(10) } .fixedSize(horizontal: false, vertical: true) } diff --git a/godtools/App/Share/SwiftUI Views/TextWithLinks/BackwardsCompatibleTextWithLinks.swift b/godtools/App/Share/SwiftUI Views/TextWithLinks/BackwardsCompatibleTextWithLinks.swift deleted file mode 100644 index 4772264be2..0000000000 --- a/godtools/App/Share/SwiftUI Views/TextWithLinks/BackwardsCompatibleTextWithLinks.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// BackwardsCompatibleTextWithLinks.swift -// godtools -// -// Created by Levi Eggert on 12/5/23. -// Copyright © 2023 Cru. All rights reserved. -// - -import SwiftUI - -@available(iOS, obsoleted: 15.0, message: "When supporting iOS 15 and up use TextWithLinksView.swift") -struct BackwardsCompatibleTextWithLinks: View { - - private let geometry: GeometryProxy - private let text: String - private let textColor: ColorPalette - private let textFont: FontLibrary - private let fontSize: CGFloat - private let lineSpacing: CGFloat - private let urlTappedClosure: ((_ url: URL) -> Void) - - init(geometry: GeometryProxy, text: String, textColor: ColorPalette, textFont: FontLibrary, fontSize: CGFloat, lineSpacing: CGFloat, urlTappedClosure: @escaping ((_ url: URL) -> Void)) { - - self.geometry = geometry - self.text = text - self.textColor = textColor - self.textFont = textFont - self.fontSize = fontSize - self.lineSpacing = lineSpacing - self.urlTappedClosure = urlTappedClosure - } - - var body: some View { - - if #available(iOS 15.0, *) { - - TextWithLinksView( - stringContainingUrls: text, - textColor: textColor.color, - font: textFont.font(size: fontSize), - lineSpacing: lineSpacing, - textAlignment: .leading, - handleUrlClosure: { (url: URL) in - - urlTappedClosure(url) - } - ) - } - else { - - TextWithLinks( - text: text, - textColor: textColor.uiColor, - font: textFont.uiFont(size: fontSize), - lineSpacing: lineSpacing, - width: geometry.size.width - ToolDetailsView.sectionDescriptionTextInsets.leading - ToolDetailsView.sectionDescriptionTextInsets.trailing, - adjustsFontForContentSizeCategory: true, - didInteractWithUrlClosure: { (url: URL) in - - urlTappedClosure(url) - - return true - } - ) - } - } -} diff --git a/godtools/App/Share/SwiftUI Views/TextWithLinks/TextViewLinksCoordinator.swift b/godtools/App/Share/SwiftUI Views/TextWithLinks/TextViewLinksCoordinator.swift deleted file mode 100644 index 32c72280ca..0000000000 --- a/godtools/App/Share/SwiftUI Views/TextWithLinks/TextViewLinksCoordinator.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// TextViewLinksCoordinator.swift -// godtools -// -// Created by Levi Eggert on 6/10/22. -// Copyright © 2022 Cru. All rights reserved. -// - -import UIKit - -@available(iOS, obsoleted: 15.0, message: "When supporting iOS 15 and up use TextWithLinksView.swift") -class TextViewLinksCoordinator: NSObject, UITextViewDelegate { - - private let didInteractWithUrlClosure: ((_ url: URL) -> Bool) - - init(didInteractWithUrlClosure: @escaping ((_ url: URL) -> Bool)) { - - self.didInteractWithUrlClosure = didInteractWithUrlClosure - - super.init() - } - - func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { - - return didInteractWithUrlClosure(URL) - } -} diff --git a/godtools/App/Share/SwiftUI Views/TextWithLinks/TextWithLinks.swift b/godtools/App/Share/SwiftUI Views/TextWithLinks/TextWithLinks.swift deleted file mode 100644 index 60be8ac025..0000000000 --- a/godtools/App/Share/SwiftUI Views/TextWithLinks/TextWithLinks.swift +++ /dev/null @@ -1,92 +0,0 @@ -// -// TextWithLinks.swift -// godtools -// -// Created by Levi Eggert on 6/10/22. -// Copyright © 2022 Cru. All rights reserved. -// - -import UIKit -import SwiftUI - -@available(iOS, deprecated: 14.0, obsoleted: 15.0, message: "For iOS 14 use BackwardsCompatibleTextWithLinks.swift and iOS 15 use TextWithLinksView.swift") -struct TextWithLinks: UIViewRepresentable { - - private let text: String - private let textColor: UIColor - private let font: UIFont? - private let lineSpacing: CGFloat? - private let width: CGFloat - private let linkTextColor: UIColor - private let adjustsFontForContentSizeCategory: Bool - private let didInteractWithUrlClosure: ((_ url: URL) -> Bool) - - init(text: String, textColor: UIColor, font: UIFont?, lineSpacing: CGFloat?, width: CGFloat, linkTextColor: UIColor = .systemBlue, adjustsFontForContentSizeCategory: Bool = false, didInteractWithUrlClosure: @escaping ((_ url: URL) -> Bool)) { - - self.text = text - self.textColor = textColor - self.font = font - self.lineSpacing = lineSpacing - self.width = width - self.linkTextColor = linkTextColor - self.adjustsFontForContentSizeCategory = adjustsFontForContentSizeCategory - self.didInteractWithUrlClosure = didInteractWithUrlClosure - } - - func makeCoordinator() -> TextViewLinksCoordinator { - return TextViewLinksCoordinator(didInteractWithUrlClosure: didInteractWithUrlClosure) - } - - func makeUIView(context: Context) -> UITextView { - - let textView: UITextView = UITextView() - - textView.text = text - - if let lineSpacing = lineSpacing, !text.isEmpty { - - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineSpacing = lineSpacing - - let attributedString: NSMutableAttributedString = textView.attributedText.mutableCopy() as? NSMutableAttributedString ?? NSMutableAttributedString() - - attributedString.addAttribute( - NSAttributedString.Key.paragraphStyle, - value: paragraphStyle, - range: (textView.text as NSString).range(of: text) - ) - - textView.attributedText = attributedString - } - - textView.backgroundColor = .clear - textView.textColor = textColor - textView.font = font - textView.isScrollEnabled = false - textView.isEditable = false - textView.isSelectable = true - textView.isUserInteractionEnabled = true - textView.dataDetectorTypes = .link - textView.linkTextAttributes = [.foregroundColor: linkTextColor] - - if adjustsFontForContentSizeCategory, let font = self.font { - textView.font = UIFontMetrics(forTextStyle: .body).scaledFont(for: font) - textView.adjustsFontForContentSizeCategory = true - } - - textView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) - textView.setContentCompressionResistancePriority(.defaultLow, for: .vertical) - - textView.translatesAutoresizingMaskIntoConstraints = false - _ = textView.addWidthConstraint(constant: width) - - textView.delegate = context.coordinator - - return textView - } - - func updateUIView(_ textView: UITextView, context: Context) { - - textView.layoutIfNeeded() - } -} diff --git a/godtools/App/Share/SwiftUI Views/TextWithLinks/TextWithLinksView.swift b/godtools/App/Share/SwiftUI Views/TextWithLinks/TextWithLinksView.swift index 5c7b6aeac8..cc3d335e84 100644 --- a/godtools/App/Share/SwiftUI Views/TextWithLinks/TextWithLinksView.swift +++ b/godtools/App/Share/SwiftUI Views/TextWithLinks/TextWithLinksView.swift @@ -8,7 +8,6 @@ import SwiftUI -@available(iOS 15.0, *) struct TextWithLinksView: View { private let markdownText: AttributedString From 8ef7cdb1c9e554e4990544b8c1d45dd8baad46e0 Mon Sep 17 00:00:00 2001 From: Levi Eggert Date: Mon, 25 Nov 2024 18:28:12 -0500 Subject: [PATCH 21/28] Add method getLessonView --- godtools/App/Flows/Lesson/LessonFlow.swift | 158 ++++++++++++--------- 1 file changed, 89 insertions(+), 69 deletions(-) diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index 3645cbc02a..20021d8ab1 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -11,12 +11,15 @@ import GodToolsToolParser class LessonFlow: ToolNavigationFlow, Flow { + private let toolTranslations: ToolTranslationsDomainModel private let appLanguage: AppLanguageDomainModel private let trainingTipsEnabled: Bool + private var tool: ResourceModel { + return toolTranslations.tool + } + private weak var flowDelegate: FlowDelegate? - private var renderer: MobileContentRenderer? = nil - private var initialPageOrPreviousProgress: MobileContentPagesPage? = nil let appDiContainer: AppDiContainer let navigationController: AppNavigationController @@ -32,50 +35,31 @@ class LessonFlow: ToolNavigationFlow, Flow { self.flowDelegate = flowDelegate self.appDiContainer = appDiContainer self.navigationController = sharedNavigationController + self.toolTranslations = toolTranslations self.appLanguage = appLanguage self.trainingTipsEnabled = trainingTipsEnabled - - let navigation: MobileContentRendererNavigation = appDiContainer.getMobileContentRendererNavigation( - parentFlow: self, - navigationDelegate: self, - appLanguage: appLanguage - ) + + let lessonProgressLastViewedPageId: String? = getUserLessonProgress()?.lastViewedPageId - let renderer = appDiContainer.getMobileContentRenderer( - type: .lesson, - navigation: navigation, - appLanguage: appLanguage, - toolTranslations: toolTranslations - ) - self.renderer = renderer + let primaryLanguageManifest: Manifest? = toolTranslations.languageTranslationManifests.first?.manifest + let visiblePages: [Page] = (primaryLanguageManifest?.pages ?? Array()).filter({!$0.isHidden}) + let hasLessonProgress: Bool = lessonProgressLastViewedPageId != nil + let lessonProgressIsFirstPage: Bool = lessonProgressLastViewedPageId == visiblePages.first?.id + let lessonProgressIsLastPage: Bool = lessonProgressLastViewedPageId == visiblePages.last?.id - var lastViewedPageId: String? = nil - if let page = initialPage { - initialPageOrPreviousProgress = page + if let initialPage = initialPage { - } else if let lessonProgress = appDiContainer.dataLayer.getUserLessonProgressRepository().getLessonProgress(lessonId: renderer.resource.id) { - - lastViewedPageId = lessonProgress.lastViewedPageId - initialPageOrPreviousProgress = .pageId(value: lessonProgress.lastViewedPageId) + navigateToLesson(initialPage: initialPage, animated: true) } - - if let lastViewedPageId = lastViewedPageId, let visiblePages = renderer.pageRenderers.first?.getVisiblePageModels() { + else if hasLessonProgress && !lessonProgressIsFirstPage && !lessonProgressIsLastPage { - let firstVisiblePage = visiblePages.first - let lastVisiblePage = visiblePages.last + let resumeLessonModal = getResumeLessonModal() - if firstVisiblePage?.id == lastViewedPageId || lastVisiblePage?.id == lastViewedPageId { - - navigateToLesson() - - } else { - - let resumeLessonModal = getResumeLessonModal() - - navigationController.present(resumeLessonModal, animated: true) - } - } else { - navigateToLesson() + navigationController.present(resumeLessonModal, animated: true) + } + else { + + navigateToLesson(initialPage: initialPage, animated: true) } } @@ -83,34 +67,21 @@ class LessonFlow: ToolNavigationFlow, Flow { print("x deinit: \(type(of: self))") } - private func configureNavigationBar(shouldAnimateNavigationBarHiddenState: Bool) { - navigationController.setNavigationBarHidden(true, animated: shouldAnimateNavigationBarHiddenState) + private func getUserLessonProgress() -> UserLessonProgressDataModel? { + return appDiContainer.dataLayer.getUserLessonProgressRepository().getLessonProgress(lessonId: tool.id) } - func navigateToLesson(shouldStartOver: Bool = false) { - guard let renderer = renderer else { return } - - let viewModel = LessonViewModel( - flowDelegate: self, - renderer: renderer, - resource: renderer.resource, - primaryLanguage: renderer.languages.primaryLanguage, - initialPage: shouldStartOver ? nil : initialPageOrPreviousProgress, - resourcesRepository: appDiContainer.dataLayer.getResourcesRepository(), - translationsRepository: appDiContainer.dataLayer.getTranslationsRepository(), - mobileContentEventAnalytics: appDiContainer.getMobileContentRendererEventAnalyticsTracking(), - getCurrentAppLanguageUseCase: appDiContainer.feature.appLanguage.domainLayer.getCurrentAppLanguageUseCase(), - getTranslatedLanguageName: appDiContainer.dataLayer.getTranslatedLanguageName(), - storeLessonProgressUseCase: appDiContainer.feature.lessonProgress.domainLayer.getStoreUserLessonProgressUseCase(), - trainingTipsEnabled: trainingTipsEnabled, - incrementUserCounterUseCase: appDiContainer.domainLayer.getIncrementUserCounterUseCase() - ) + private func getUserLessonProgressPage() -> MobileContentPagesPage? { - let view = LessonView(viewModel: viewModel, navigationBar: nil) - - navigationController.pushViewController(view, animated: false) + guard let pageId = getUserLessonProgress()?.lastViewedPageId else { + return nil + } - configureNavigationBar(shouldAnimateNavigationBarHiddenState: true) + return .pageId(value: pageId) + } + + private func configureNavigationBar(shouldAnimateNavigationBarHiddenState: Bool) { + navigationController.setNavigationBarHidden(true, animated: shouldAnimateNavigationBarHiddenState) } func navigate(step: FlowStep) { @@ -121,11 +92,11 @@ class LessonFlow: ToolNavigationFlow, Flow { break case .startOverTappedFromResumeLessonModal: - navigateToLesson(shouldStartOver: true) + navigateToLesson(initialPage: nil, animated: false) navigationController.dismissPresented(animated: true, completion: nil) case .continueTappedFromResumeLessonModal: - navigateToLesson() + navigateToLesson(initialPage: getUserLessonProgressPage(), animated: false) navigationController.dismissPresented(animated: true, completion: nil) case .closeTappedFromLesson(let lessonId, let highestPageNumberViewed): @@ -169,7 +140,61 @@ class LessonFlow: ToolNavigationFlow, Flow { } } + private func navigateToLesson(initialPage: MobileContentPagesPage?, animated: Bool) { + + let lessonView = getLessonView(initialPage: initialPage) + + navigationController.pushViewController(lessonView, animated: animated) + + configureNavigationBar(shouldAnimateNavigationBarHiddenState: true) + } + + private func closeTool(lessonId: String, highestPageNumberViewed: Int) { + + flowDelegate?.navigate(step: .lessonFlowCompleted(state: .userClosedLesson(lessonId: lessonId, highestPageNumberViewed: highestPageNumberViewed))) + } +} + +extension LessonFlow { + + private func getLessonView(initialPage: MobileContentPagesPage?) -> UIViewController { + + let navigation: MobileContentRendererNavigation = appDiContainer.getMobileContentRendererNavigation( + parentFlow: self, + navigationDelegate: self, + appLanguage: appLanguage + ) + + let renderer = appDiContainer.getMobileContentRenderer( + type: .lesson, + navigation: navigation, + appLanguage: appLanguage, + toolTranslations: toolTranslations + ) + + let viewModel = LessonViewModel( + flowDelegate: self, + renderer: renderer, + resource: renderer.resource, + primaryLanguage: renderer.languages.primaryLanguage, + initialPage: initialPage, + resourcesRepository: appDiContainer.dataLayer.getResourcesRepository(), + translationsRepository: appDiContainer.dataLayer.getTranslationsRepository(), + mobileContentEventAnalytics: appDiContainer.getMobileContentRendererEventAnalyticsTracking(), + getCurrentAppLanguageUseCase: appDiContainer.feature.appLanguage.domainLayer.getCurrentAppLanguageUseCase(), + getTranslatedLanguageName: appDiContainer.dataLayer.getTranslatedLanguageName(), + storeLessonProgressUseCase: appDiContainer.feature.lessonProgress.domainLayer.getStoreUserLessonProgressUseCase(), + trainingTipsEnabled: trainingTipsEnabled, + incrementUserCounterUseCase: appDiContainer.domainLayer.getIncrementUserCounterUseCase() + ) + + let view = LessonView(viewModel: viewModel, navigationBar: nil) + + return view + } + private func getResumeLessonModal() -> UIViewController { + let viewModel = ResumeLessonProgressModalViewModel( flowDelegate: self, getInterfaceStringsUseCase: appDiContainer.feature.lessonProgress.domainLayer.getResumeLessonProgressModalInterfaceStringsUseCase(), @@ -189,11 +214,6 @@ class LessonFlow: ToolNavigationFlow, Flow { return hostingView } - - private func closeTool(lessonId: String, highestPageNumberViewed: Int) { - - flowDelegate?.navigate(step: .lessonFlowCompleted(state: .userClosedLesson(lessonId: lessonId, highestPageNumberViewed: highestPageNumberViewed))) - } } extension LessonFlow: MobileContentRendererNavigationDelegate { From 00f9ae7154044de2a85f7f047a88455a15d18a4a Mon Sep 17 00:00:00 2001 From: Levi Eggert Date: Tue, 26 Nov 2024 07:27:23 -0500 Subject: [PATCH 22/28] Add computed properties --- godtools/App/Flows/Lesson/LessonFlow.swift | 41 +++++++++++++--------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/godtools/App/Flows/Lesson/LessonFlow.swift b/godtools/App/Flows/Lesson/LessonFlow.swift index 20021d8ab1..088825a15e 100644 --- a/godtools/App/Flows/Lesson/LessonFlow.swift +++ b/godtools/App/Flows/Lesson/LessonFlow.swift @@ -10,12 +10,12 @@ import UIKit import GodToolsToolParser class LessonFlow: ToolNavigationFlow, Flow { - + private let toolTranslations: ToolTranslationsDomainModel private let appLanguage: AppLanguageDomainModel private let trainingTipsEnabled: Bool - private var tool: ResourceModel { + private var lesson: ResourceModel { return toolTranslations.tool } @@ -38,20 +38,12 @@ class LessonFlow: ToolNavigationFlow, Flow { self.toolTranslations = toolTranslations self.appLanguage = appLanguage self.trainingTipsEnabled = trainingTipsEnabled - - let lessonProgressLastViewedPageId: String? = getUserLessonProgress()?.lastViewedPageId - - let primaryLanguageManifest: Manifest? = toolTranslations.languageTranslationManifests.first?.manifest - let visiblePages: [Page] = (primaryLanguageManifest?.pages ?? Array()).filter({!$0.isHidden}) - let hasLessonProgress: Bool = lessonProgressLastViewedPageId != nil - let lessonProgressIsFirstPage: Bool = lessonProgressLastViewedPageId == visiblePages.first?.id - let lessonProgressIsLastPage: Bool = lessonProgressLastViewedPageId == visiblePages.last?.id if let initialPage = initialPage { navigateToLesson(initialPage: initialPage, animated: true) } - else if hasLessonProgress && !lessonProgressIsFirstPage && !lessonProgressIsLastPage { + else if shouldNavigateToResumeLesson { let resumeLessonModal = getResumeLessonModal() @@ -67,13 +59,26 @@ class LessonFlow: ToolNavigationFlow, Flow { print("x deinit: \(type(of: self))") } - private func getUserLessonProgress() -> UserLessonProgressDataModel? { - return appDiContainer.dataLayer.getUserLessonProgressRepository().getLessonProgress(lessonId: tool.id) + private var shouldNavigateToResumeLesson: Bool { + + let lessonProgressLastViewedPageId: String? = userLessonProgress?.lastViewedPageId + + let primaryLanguageManifest: Manifest? = toolTranslations.languageTranslationManifests.first?.manifest + let visiblePages: [Page] = (primaryLanguageManifest?.pages ?? Array()).filter({!$0.isHidden}) + let hasLessonProgress: Bool = lessonProgressLastViewedPageId != nil + let lessonProgressIsFirstPage: Bool = lessonProgressLastViewedPageId == visiblePages.first?.id + let lessonProgressIsLastPage: Bool = lessonProgressLastViewedPageId == visiblePages.last?.id + + return hasLessonProgress && !lessonProgressIsFirstPage && !lessonProgressIsLastPage + } + + private var userLessonProgress: UserLessonProgressDataModel? { + return appDiContainer.dataLayer.getUserLessonProgressRepository().getLessonProgress(lessonId: lesson.id) } - private func getUserLessonProgressPage() -> MobileContentPagesPage? { + private var userLessonProgressPage: MobileContentPagesPage? { - guard let pageId = getUserLessonProgress()?.lastViewedPageId else { + guard let pageId = userLessonProgress?.lastViewedPageId else { return nil } @@ -96,7 +101,7 @@ class LessonFlow: ToolNavigationFlow, Flow { navigationController.dismissPresented(animated: true, completion: nil) case .continueTappedFromResumeLessonModal: - navigateToLesson(initialPage: getUserLessonProgressPage(), animated: false) + navigateToLesson(initialPage: userLessonProgressPage, animated: false) navigationController.dismissPresented(animated: true, completion: nil) case .closeTappedFromLesson(let lessonId, let highestPageNumberViewed): @@ -155,6 +160,8 @@ class LessonFlow: ToolNavigationFlow, Flow { } } +// MARK: - Views + extension LessonFlow { private func getLessonView(initialPage: MobileContentPagesPage?) -> UIViewController { @@ -216,6 +223,8 @@ extension LessonFlow { } } +// MARK: - MobileContentRendererNavigationDelegate + extension LessonFlow: MobileContentRendererNavigationDelegate { func mobileContentRendererNavigationDismissRenderer(navigation: MobileContentRendererNavigation, event: DismissToolEvent) { From d2c83fda9d673eae3c7644e22d6f3517af3db3b9 Mon Sep 17 00:00:00 2001 From: Anka Date: Tue, 26 Nov 2024 23:08:28 +0000 Subject: [PATCH 23/28] [skip ci] Adding latest localization files from OneSky --- godtools/Base.lproj/Localizable.strings | 2 + godtools/ar.lproj/Localizable.strings | 8 + godtools/de.lproj/Localizable.strings | 8 + godtools/es.lproj/Localizable.strings | 8 + godtools/fr.lproj/Localizable.strings | 8 + godtools/hi.lproj/Localizable.strings | 8 + godtools/id.lproj/Localizable.strings | 8 + godtools/ja.lproj/Localizable.strings | 8 + godtools/ko.lproj/Localizable.strings | 8 + godtools/lv-LV.lproj/Localizable.strings | 2 + godtools/lv.lproj/Localizable.strings | 2 + godtools/pt.lproj/Localizable.strings | 8 + godtools/ro.lproj/Localizable.strings | 210 ++++++++++++++++++--- godtools/ro.lproj/Localizable.stringsdict | 84 ++++----- godtools/ru.lproj/Localizable.strings | 8 + godtools/sw.lproj/Localizable.strings | 8 + godtools/ur.lproj/Localizable.strings | 8 + godtools/vi.lproj/Localizable.strings | 8 + godtools/zh-Hans.lproj/Localizable.strings | 8 + godtools/zh-Hant.lproj/Localizable.strings | 8 + 20 files changed, 352 insertions(+), 68 deletions(-) diff --git a/godtools/Base.lproj/Localizable.strings b/godtools/Base.lproj/Localizable.strings index 926a95223c..cd3d4f7920 100644 --- a/godtools/Base.lproj/Localizable.strings +++ b/godtools/Base.lproj/Localizable.strings @@ -1,4 +1,6 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ "lessons.resumeLessonModal.title" = "Resume Progress"; + "lessons.resumeLessonModal.subtitle" = "Would you like to pick up where you left off?"; "lessons.resumeLessonModal.startOverButton" = "Start over"; "lessons.resumeLessonModal.continueButton" = "Continue"; diff --git a/godtools/ar.lproj/Localizable.strings b/godtools/ar.lproj/Localizable.strings index 3faca49657..6d550a9c36 100755 --- a/godtools/ar.lproj/Localizable.strings +++ b/godtools/ar.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "استئناف التقدم"; + +"lessons.resumeLessonModal.subtitle" = "هل تريد المتابعة من حيث توقفت؟"; +"lessons.resumeLessonModal.startOverButton" = "ابدأ من جديد"; +"lessons.resumeLessonModal.continueButton" = "استمر"; +"lessons.lessonCompleted" = "تم"; +"lessons.completionProgress" = "%@ اكتمل"; "network_connection_lost" = "تم فقدان الاتصال بالشبكة."; "language_name_fil" = "الفلبينية (تاجالوج)"; "lessons.filter.navBar.language" = "لُغة الدرس"; diff --git a/godtools/de.lproj/Localizable.strings b/godtools/de.lproj/Localizable.strings index d5f37b18e1..c995e04786 100755 --- a/godtools/de.lproj/Localizable.strings +++ b/godtools/de.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "Fortschritt fortsetzen"; + +"lessons.resumeLessonModal.subtitle" = "Möchten Sie dort weitermachen, wo Sie aufgehört haben?"; +"lessons.resumeLessonModal.startOverButton" = "Neu starten"; +"lessons.resumeLessonModal.continueButton" = "Weiter"; +"lessons.lessonCompleted" = "Abgeschlossen"; +"lessons.completionProgress" = "%@ Abschließen"; "network_connection_lost" = "Die Netzwerkverbindung wurde unterbrochen."; "language_name_fil" = "Philippinisch (Tagalog)"; "lessons.filter.navBar.language" = "Lektionssprache"; diff --git a/godtools/es.lproj/Localizable.strings b/godtools/es.lproj/Localizable.strings index 2abae4344b..057a87d38b 100755 --- a/godtools/es.lproj/Localizable.strings +++ b/godtools/es.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "Reanudar progreso"; + +"lessons.resumeLessonModal.subtitle" = "¿Quieres continuar desde donde lo dejaste?"; +"lessons.resumeLessonModal.startOverButton" = "Comenzar de nuevo"; +"lessons.resumeLessonModal.continueButton" = "Continuar"; +"lessons.lessonCompleted" = "Completado"; +"lessons.completionProgress" = "%@ completado"; "network_connection_lost" = "Se perdió la conexión de red."; "language_name_fil" = "Filipino (Tagalog)"; "lessons.filter.navBar.language" = "Idioma de la lección"; diff --git a/godtools/fr.lproj/Localizable.strings b/godtools/fr.lproj/Localizable.strings index e908c50161..c9d6ad742c 100755 --- a/godtools/fr.lproj/Localizable.strings +++ b/godtools/fr.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "Reprendre la progression"; + +"lessons.resumeLessonModal.subtitle" = "Souhaitez-vous reprendre là où vous vous étiez arrêté?"; +"lessons.resumeLessonModal.startOverButton" = "Recommencer"; +"lessons.resumeLessonModal.continueButton" = "Continuer"; +"lessons.lessonCompleted" = "Terminé"; +"lessons.completionProgress" = "%@ Terminer"; "network_connection_lost" = "La connexion réseau a été perdue."; "language_name_fil" = "Philippine (Tagalog)"; "lessons.filter.navBar.language" = "Langue de la leçon"; diff --git a/godtools/hi.lproj/Localizable.strings b/godtools/hi.lproj/Localizable.strings index 5e8b0ea9a8..22f45de1b9 100755 --- a/godtools/hi.lproj/Localizable.strings +++ b/godtools/hi.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "प्रगति जारी रखें"; + +"lessons.resumeLessonModal.subtitle" = "वहीं से जारी रखें जहाँ से आपने छोड़ा था?"; +"lessons.resumeLessonModal.startOverButton" = "पुनः शुरू करें"; +"lessons.resumeLessonModal.continueButton" = "जारी रखें"; +"lessons.lessonCompleted" = "पूरा हुआ"; +"lessons.completionProgress" = "%@ पूरा हुआ"; "network_connection_lost" = "नेटवर्क कनेक्शन खो गया।"; "language_name_fil" = "फिलिपीनी"; "lessons.filter.navBar.language" = "पाठ की भाषा"; diff --git a/godtools/id.lproj/Localizable.strings b/godtools/id.lproj/Localizable.strings index 4f5044b9ef..723496afab 100755 --- a/godtools/id.lproj/Localizable.strings +++ b/godtools/id.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "Lanjutkan Kemajuan"; + +"lessons.resumeLessonModal.subtitle" = "Apakah Anda ingin melanjutkan dari tempat Anda berhenti?"; +"lessons.resumeLessonModal.startOverButton" = "Mulai Ulang"; +"lessons.resumeLessonModal.continueButton" = "Lanjutkan"; +"lessons.lessonCompleted" = "Selesai"; +"lessons.completionProgress" = "%@ Selesai"; "network_connection_lost" = "Koneksi jaringan terputus."; "language_name_fil" = "Filipina (Tagalog)"; "lessons.filter.navBar.language" = "Bahasa pelajaran"; diff --git a/godtools/ja.lproj/Localizable.strings b/godtools/ja.lproj/Localizable.strings index f07b6c59ea..1051560e04 100755 --- a/godtools/ja.lproj/Localizable.strings +++ b/godtools/ja.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "進捗を再開"; + +"lessons.resumeLessonModal.subtitle" = "中断したところから再開しますか?"; +"lessons.resumeLessonModal.startOverButton" = "やり直す"; +"lessons.resumeLessonModal.continueButton" = "続行"; +"lessons.lessonCompleted" = "完了"; +"lessons.completionProgress" = "%@完了"; "network_connection_lost" = "ネットワーク接続が失われました。"; "language_name_fil" = "フィリピン(タガログ)語"; "lessons.filter.navBar.language" = "レッスン言語"; diff --git a/godtools/ko.lproj/Localizable.strings b/godtools/ko.lproj/Localizable.strings index 42aca406c2..218dfe76b6 100644 --- a/godtools/ko.lproj/Localizable.strings +++ b/godtools/ko.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "진행 재개"; + +"lessons.resumeLessonModal.subtitle" = "중단한 지점부터 계속하시겠습니까?"; +"lessons.resumeLessonModal.startOverButton" = "다시 시작"; +"lessons.resumeLessonModal.continueButton" = "계속"; +"lessons.lessonCompleted" = "완료"; +"lessons.completionProgress" = "@% 완료"; "network_connection_lost" = "네트워크 연결이 끊어졌습니다."; "language_name_fil" = "필리핀어(타갈로그)"; "lessons.filter.navBar.language" = "수업 언어"; diff --git a/godtools/lv-LV.lproj/Localizable.strings b/godtools/lv-LV.lproj/Localizable.strings index 0c4a3a64bc..d3e416e929 100755 --- a/godtools/lv-LV.lproj/Localizable.strings +++ b/godtools/lv-LV.lproj/Localizable.strings @@ -1,4 +1,6 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ "lessons.resumeLessonModal.title" = "Atsākt progresu"; + "lessons.resumeLessonModal.subtitle" = "Vai vēlies turpināt iesākto?"; "lessons.resumeLessonModal.startOverButton" = "Sākt no sākuma"; "lessons.resumeLessonModal.continueButton" = "Turpināt"; diff --git a/godtools/lv.lproj/Localizable.strings b/godtools/lv.lproj/Localizable.strings index 0c4a3a64bc..d3e416e929 100644 --- a/godtools/lv.lproj/Localizable.strings +++ b/godtools/lv.lproj/Localizable.strings @@ -1,4 +1,6 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ "lessons.resumeLessonModal.title" = "Atsākt progresu"; + "lessons.resumeLessonModal.subtitle" = "Vai vēlies turpināt iesākto?"; "lessons.resumeLessonModal.startOverButton" = "Sākt no sākuma"; "lessons.resumeLessonModal.continueButton" = "Turpināt"; diff --git a/godtools/pt.lproj/Localizable.strings b/godtools/pt.lproj/Localizable.strings index 34fe8e142a..c1697023c2 100755 --- a/godtools/pt.lproj/Localizable.strings +++ b/godtools/pt.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "Retomar progresso"; + +"lessons.resumeLessonModal.subtitle" = "Você gostaria de continuar de onde parou?"; +"lessons.resumeLessonModal.startOverButton" = "Recomeçar"; +"lessons.resumeLessonModal.continueButton" = "Continuar"; +"lessons.lessonCompleted" = "Concluído"; +"lessons.completionProgress" = "%@ concluído"; "network_connection_lost" = "A conexão de rede foi perdida."; "language_name_fil" = "Filipino (Tagalog)"; "lessons.filter.navBar.language" = "Idioma da lição"; diff --git a/godtools/ro.lproj/Localizable.strings b/godtools/ro.lproj/Localizable.strings index 6c95364d4d..e56e97a9a8 100755 --- a/godtools/ro.lproj/Localizable.strings +++ b/godtools/ro.lproj/Localizable.strings @@ -1,3 +1,73 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "Reia progresul"; + +"lessons.resumeLessonModal.subtitle" = "Ai vrea să reiai de unde ai rămas?"; +"lessons.resumeLessonModal.startOverButton" = "Începe de la capăt"; +"lessons.resumeLessonModal.continueButton" = "Continuă"; +"lessons.lessonCompleted" = "Finalizat"; +"lessons.completionProgress" = "%@ Finalizat"; +"network_connection_lost" = "Conexiunea la rețea a fost întreruptă."; +"language_name_fil" = "Filipineză (Tagalog)"; +"lessons.filter.navBar.language" = "Limba lecției"; +"lessons.languageFilter.title" = "Lecțiile în:"; +"language_name_fil-x-taglish" = "Taglish"; +"language_name_sid" = "Sidama"; +"onboardingTutorial.chooseLanguageButton.title" = "Alege limba"; +"languageSettings.confirmAppLanguage.message" = "Ați selectat %@ ca limbă a aplicației. Acest lucru va schimba limba întregii aplicații GodTools. Esti sigur?"; +"languageSettings.confirmAppLanguage.changeLanguageButton.title" = "Schimbă limba"; +"languageSettings.confirmAppLanguage.nevermindButton.title" = "Anulează"; +"languageSettings.downloadableLanguages.title" = "Limbi descărcabile"; +"languageSettings.appInterface.title" = "Limba de interfață a aplicației"; +"languageSettings.appInterface.message" = "Setează limba în care dorești să fie afișată întreaga aplicație."; +"languageSettings.appInterface.languagesAvailable" = "Limbi disponibile"; +"languageSettings.toolLanguagesAvailableOffline.title" = "Limbi pentru instrumente disponibile offline"; +"languageSettings.toolLanguagesAvailableOffline.message" = "Descărcați toate instrumentele într-o limbă pentru a le face disponibile chiar dacă nu aveți acces WiFi sau serviciul celular. Setați limba instrumentului prin intermediul butonului de opțiuni din cadrul unui instrument."; +"languageSettings.toolLanguagesAvailableOffline.editDownloadedLanguagesButton.title" = "Editează limbile descărcate"; +"allTools.filter.title" = "Filtru"; +"allTools.filter.anyCategory" = "Orice categorie"; +"allTools.filter.anyLanguage" = "Orice limbă"; +"allTools.filter.navBar.language" = "Filtrează după limbă"; +"allTools.filter.navBar.category" = "Filtrează după categorie"; +"languageSettings.appLanguage.title" = "Limba aplicației"; +"authError.userAccountAlreadyExists.message" = "Contul de utilizator deja există."; +"authError.userAccountNotFound.message" = "Contul de utilizator nu a fost găsit."; +"createAccount.title" = "Creează cont"; +"createAccount.subtitle" = "Creează un cont pentru a avea la îndemână povești reale, încurajare și sfaturi practice."; +"deleteAccountProgress.title" = "Se șterge contul..."; +"confirmDeleteAccount.title" = "Ești sigur?"; +"confirmDeleteAccount.confirmButton.title" = "Şterge contul"; +"accountDeletedAlert.title" = "Cont șters"; +"accountDeletedAlert.message" = "Contul dvs. a fost șters."; +"deleteAccount.title" = "Nu pleca atât de repede"; +"deleteAccount.subtitle" = "Dacă îți ștergi contul, nu vei putea accesa instrumentele sau activitatea contului."; +"deleteAccount.confirmButton.title" = "Ștergeți-mi contul"; +"deleteAccount.cancelButton.title" = "Păstrează-mi contul"; +"signIn.title" = "Conectare"; +"signIn.subtitle" = "Conectează-te la contul dvs. pentru a avea la îndemână povești reale, încurajare și sfaturi practice."; +"signIn.google" = "Conectează-te cu Google"; +"signIn.facebook" = "Conectează-te cu Facebook"; +"signIn.apple" = "Continuă cu Apple"; +"menu_getStarted" = "Începe"; +"menu_support" = "Suport"; +"menu_about" = "Despre"; +"menu.sendFeedback" = "Trimite feedback"; +"menu.reportABug" = "Raportează o eroare"; +"menu.askAQuestion" = "Pune o întrebare"; +"menu.leaveAReview" = "Scrie părerea ta"; +"account.badges.sectionTitle" = "Insignele tale"; +"account.activity.sectionTitle" = "Activitatea ta"; + +/* Just translate "Joined" - leave the %@ - this is the date they started using GodTools */ +"account.joinedOn" = "S-a alăturat %@"; + +"account.globalActivity.title" = "Activitate Globală"; +"toolDetails.conversationStarters.title" = "Inițierea conversației"; + +/* A list of the main points of the tool will live behind a section called "Outline" */ +"toolDetails.outline.title" = "Contur"; + +"toolDetails.bibleReferences.title" = "Referințe biblice"; + /* This About refers to the whole app. */ "aboutApp.navTitle" = "Despre noi"; @@ -7,48 +77,89 @@ /* This means that the tool/resource is not available in the currently selected language. */ "lessonCard.languageNotAvailable" = "Indisponibil în %@"; +"menu.deleteAccount" = "Șterge contul"; +"alert.mailAppUnavailable.title" = "Aplicația de Email Indisponibilă"; +"alert.mailAppUnavailable.message" = "Aplicația nativă de Email fie nu este configurată, fie nu este disponibilă pe acest dispozitiv. "; "tool_menu_item.tools" = "Instrumentele"; "lessons.pageTitle" = "Lecții create pentru tine"; "lessons.pageSubtitle" = "Idei practice pentru a construi relații și a începe conversații relevante."; "toolSettings.languagesAvailable.title" = "Limbi disponibile"; -"toolDetails.versions.message" = "Alege o versiune diferită a instrumentului de mai jos. Fiecare versiune are un stil și un conținut unice pentru a le găsi pe cele care se potrivesc cel mai bine conversației tale. Poți adăuga la favorite mai multe versiuni ale aceluiași instrument."; -"favorites.noTools.title" = "Niciun instrument preferat de afișat"; +"toolDetails.versions.message" = "Alege o versiune diferită a instrumentului de mai jos. Fiecare versiune are un stil și un conținut unic pentru a le găsi pe cele care se potrivesc cel mai bine conversației tale. Poți adăuga la favorite mai multe versiuni ale aceluiași instrument."; +"favorites.noTools.title" = "Niciun instrument favorit de afișat"; "favorites.noTools.description" = "Atinge pictograma inimă pentru a adăuga la favorite un instrument și a-l face disponibil offline."; "favorites.noTools.button" = "Accesează Instrumentele"; "toolSettings.shareImagePreview.shareImageButton.title" = "Partajare imagine"; "favorites.pageTitle" = "Bun venit la GodTools"; "favorites.favoriteLessons.title" = "Lecție recomandată"; -"favorites.favoriteTools.title" = "Instrumentele tale preferate"; +"favorites.favoriteTools.title" = "Instrumentele tale favorite"; "favorites.favoriteTools.viewAll" = "Vezi tot"; "favorites.favoriteLessons.details" = "Detalii"; /* The meaning is "I don't want to set a second language". Language is no language or None */ "toolSettings.languagesList.deleteLanguage.title" = "Niciuna"; -"toolSettings.chooseLanguage.toggleMessage" = "Comută între două limbi diferite în acest instrument."; +"toolSettings.chooseLanguage.toggleMessage" = "Schimbă între două limbi diferite în acest instrument."; "toolDetails.versions.title" = "Versiuni"; "toolDetails.learnToShareToolButton.title" = "Află cum să partajezi acest instrument"; -"toolSettings.title" = "Opțiuni de instrumente"; +"toolSettings.title" = "Opțiuni pentru Instrumente"; "toolSettings.option.shareLink.title" = "Partajează un link"; "toolSettings.option.screenShare.title" = "Partajează ecranul"; -"toolSettings.option.trainingTips.show.title" = "Recomandări de instruire"; +"toolSettings.option.trainingTips.show.title" = "Recomandări de antrenare"; "toolSettings.option.trainingTips.hide.title" = "Ascunde recomandările"; -"toolSettings.chooseLanguage.title" = "Limbă secundară"; -"toolSettings.chooseLanguage.noParallelLanguageTitle" = "secundară"; +"toolSettings.chooseLanguage.title" = "Limbă Secundară"; +"toolSettings.chooseLanguage.noParallelLanguageTitle" = "Secundară"; "toolSettings.shareables.title" = "Grafice asociate"; -"allTools.spotlight.title" = "Recomandări de instrumente"; +"allTools.spotlight.title" = "Instrumentele Recomandate"; "allTools.spotlight.description" = "Iată câteva instrumente care credem că îți vor plăcea"; "allTools.categories.title" = "Categorii"; +"training_tip_ask" = "Întreabă"; +"training_tip_consider" = "Gândește"; +"training_tip_prepare" = "Pregătește-te"; +"training_tip_quote" = "Citat"; +"training_tip_tip" = "Recomandări"; +"start_training" = "Începe Antrenarea"; +"close" = "Închide"; "tool_menu_item.lessons" = "Lecții"; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.continueButton.title.closeTutorial" = "Închide tutorialul"; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.tool.title" = "Instrumente"; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.tool.message" = "Fiecare instrument este creat pentru o etapă diferită a conversației – înainte, în timpul conversației sau după."; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.toolTip.title" = "Recomandări pentru instrumente"; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.toolTip.message" = "Recomandările GodTools te ghidează pe măsură ce ajuți pe cineva să înțeleagă Evanghelia și să-L întâlnească pe Isus."; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.screenShare.title" = "Partajarea ecranului"; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.screenShare.message" = "Acum poți partaja ecranul de la distanță, astfel încât cealaltă persoană să poată urmări în timp ce utilizezi un instrument pentru a discuta Evanghelia."; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.lesson.title" = "Lecții"; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.lesson.message" = "În fiecare lecție GodTools înveți ceva care să te ajute să ai conversații reale despre Dumnezeu."; + +/* This is a tutorial phrase and is optional to translate. The tutorial is not shown in every language. Usually just with those that have lessons and tips translated. */ +"tutorial.findTutorial.title" = "Poți găsi acest tutorial în meniu oricând ai nevoie."; + "onboardingTutorial.beginButton.title" = "Începe"; "onboardingTutorial.nextButton.title" = "Următorul"; "tool_offline_favorite_message" = "Un instrument va fi disponibil offline dacă apeși pictograma inimă, care îl adaugă la Favorite."; /* This is a category description of a tool that helps you start a conversation */ -"tool_category_conversation_starter" = "Inițierea Conversațiilor"; +"tool_category_conversation_starter" = "Inițierea Conversației"; /* This phrase describes a category of tool that helps someone grow in their Christian faith */ -"tool_category_growth" = "Creșterea în credință"; +"tool_category_growth" = "Creșterea în Credință"; "share_link" = "Partajează un link"; "share_tool_menu.remote_share_tool" = "Partajează ecranul"; @@ -59,20 +170,32 @@ "share_tool_screen_tutorial.mirrored_experience.message" = "Pe măsură ce derulezi instrumentul pe telefonul tău, ecranul prietenului tău va răspunde la fel. Acest lucru vă permite să folosiți un instrument împreună pe 2 dispozitive în același timp."; "share_tool_screen_tutorial.get_started.title" = "Să începem"; "share_tool_screen_tutorial.get_started.message" = "Trimite linkul către una sau mai multe persoane pentru a începe o sesiune de partajare ecran acum."; -"share_tool_remote_link_message" = "Bună, urmează-mă în GodTools prin partajarea ecranului. Iată linkul: %@ Dacă nu primești acest mesaj până mai târziu, este posibil ca linkul să nu funcționeze. Poți încerca ulterior."; +"share_tool_remote_link_message" = "Bună, urmează-mă în GodTools prin partajarea ecranului. Iată linkul: %@ + +Dacă ai primit acest mesaj prea târziu, este posibil ca linkul să nu funcționeze. Mai târziu putem să mai încercăm."; "exit_tract_remote_share_session.message" = "Părăsești sesiunea de partajare la distanță acum?"; "load_tool_remote_session.message" = "Începe partajarea ecranului..."; -"onboardingTutorial.0.title" = "Pregătită pentru fiecare conversație"; -"onboardingTutorial.0.videoLink.title" = "Urmărește videoclipul"; +"learn_to_share_tool.learn_to_share.title" = "Învață să împărtășești acest instrument cu oricine"; +"learn_to_share_tool.learn_to_share.message" = "Exersează să folosești atâtea recomandări câte ai nevoie pentru a te simți încrezător în împărtășirea acestui instrument cu ceilalți."; +"learn_to_share_tool.tips_light_the_way.title" = "Recomandări pentru a lumina calea"; +"learn_to_share_tool.tips_light_the_way.message" = "Pe ecranele selectate, vei vedea o varietate de pictograme. Apăsă pictograma pentru a vedea o recomandare care te va ajuta să vorbești despre conținutul de pe ecran. Dacă un ecran nu are pictogramă, citește conținutul și discută după cum este necesar."; +"learn_to_share_tool.light_up_the_tips.title" = "Descoperă recomandările"; +"learn_to_share_tool.light_up_the_tips.message" = "Când o recomandare este descoperită, ai terminat acea parte de antrenare. Exersează să folosești atâtea recomandări câte ai nevoie pentru a te simți încrezător în a explica instrumentul"; +"lesson_evaluation.title" = "Părerea ta"; +"lesson_evaluation.wasThisHelpful" = "Ți-a fost de ajutor această lecție?"; +"lesson_evaluation.shareFaith" = "Cât de pregătit te simți să începi o conversație spirituală?"; +"lesson_evaluation.sendButtonTitle" = "Trimite feedback"; +"onboardingTutorial.0.title" = "Pregătit pentru fiecare conversație"; +"onboardingTutorial.0.videoLink.title" = "Urmărește videoul"; "onboardingTutorial.1.title" = "Discută despre Dumnezeu cu oricine"; "onboardingTutorial.1.message" = "GodTools te ajută să ai conversații constructive despre Dumnezeu."; "onboardingTutorial.2.title" = "Pregătește-te pentru momentele care contează"; "onboardingTutorial.2.message" = "Află cum să faci conversațiile despre credință o parte normală din viața ta."; "onboardingTutorial.3.title" = "Ajută pe cineva să-l descopere pe Iisus"; -"onboardingTutorial.3.message" = "GodTools este ghidul tău pentru propovăduirea Bibliei într-un mod clar și relevant."; +"onboardingTutorial.3.message" = "GodTools este ghidul tău pentru împărtășirea evangheliei într-un mod clar și relevant."; /* This is a category. The content will include training of how to share your faith. */ -"tool_category_training" = "Instruire"; +"tool_category_training" = "Antrenare"; /* This is an invitation for a user to open a tool */ "open" = "Deschide"; @@ -91,16 +214,21 @@ "loading_favorited_tool" = "Se descarcă cea mai nouă traducere pentru acest instrument."; /* Adds a question mark */ -"remove_from_favorites_title" = "Elimini din Favorite? "; +"remove_from_favorites_title" = "Elimină din Favorite? "; /* No translation needed for %@ - just use it as it is. It will be substituted with the name of the tool. */ "remove_from_favorites_message" = "Sigur vrei să elimini %@ din Favorite?"; /* Gospel indicates the gospel of Jesus Christ */ -"tool_category_gospel" = "Invitație să descoperi Biblia"; +"tool_category_gospel" = "Gospel Invitation"; /* Describes a format of content - like a newspaper article. */ "tool_category_articles" = "Articole"; + +"articles.downloadArticlesButton.title.retryDownload" = "Reîncearcă Descărcarea"; + +/* This is to let users know which version of the app is installed on their phone */ +"menu_version" = "Versiune"; "language_onboard" = "Peste 90 de limbi"; /* This is to indicate to the user that there are no additional tools or resources available for download because they have already downloaded everything. */ @@ -123,13 +251,17 @@ "okay" = "Ok"; // Menu "menu_general" = "General"; +"menu_account" = "Cont"; "menu_share" = "Distribuie"; "menu_legal" = "Juridic"; "language_settings" = "Setări de limbă"; +"menu.tutorial" = "Tutorial"; +"menu.my_account" = "Contul meu"; + // Login "login" = "Conectare"; "logout" = "Deconectare"; -"create_account" = "Creați cont"; +"create_account" = "Creează cont"; "account_login" = "Conectare la cont"; // Tool Detail @@ -138,10 +270,10 @@ "contact_us" = "Contactează-ne"; "preview_mode_translators_only" = "Mod previzualizare (doar traducători)"; "share_god_tools" = "Distribuie aplicația GodTools"; -"share_a_story_with_us" = "Împărtășește o poveste cu noi"; +"share_a_story_with_us" = "Împărtășește o experiență cu noi"; "terms_of_use" = "Condiții de utilizare"; "privacy_policy" = "Politica de confidențialitate"; -"copyright_info" = "Informații copyright"; +"copyright_info" = "Informații Copyright"; "share_god_tools_share_sheet_text" = "Descarcă aplicația GodTools: https://godtoolsapp.com Găsești versiunea online aici https://knowgod.com/"; @@ -155,7 +287,7 @@ Găsești versiunea online aici https://knowgod.com/"; // Language Settings "primary_language" = "Limba principală"; "select_primary_language" = "Selectează o limbă principală"; -"parallel_language" = "Limbă secundară"; +"parallel_language" = "Limbă Secundară"; "select_parallel_language" = "Selectează o limbă secundară"; "share_god_tools_native_language" = "Distribuie GodTools unei persoane în limba nativă a acesteia"; "not_every_tool_is_available" = "Nu toate instrumentele sunt disponibile în toate limbile"; @@ -189,7 +321,7 @@ Aplicația poate fi descărcată de pe https://godtoolsapp.com"; "remove" = "Elimină"; "clear" = "Șterge"; /* Please be aware that the word Tool has been used in other places in this project. Check for consistency. */ -"toolinfo_opentool" = "Deschide instrumentul"; +"toolinfo_opentool" = "Deschide Instrumentul"; // Alerts "error" = "Eroare"; @@ -197,26 +329,52 @@ Aplicația poate fi descărcată de pe https://godtoolsapp.com"; "cancel" = "Anulează"; "required_field_missing" = "\"%@\" este un câmp obligatoriu."; +"onboardingTutorial.getStartedButton.title" = "Să începem"; + // About "general_about_1" = "GodTools te ajută să-ți împărtășești credința în mod ușor și simplu."; +// Tutorial +"tutorial.tutorialItem.0.title" = "Privește"; "general_about_2" = "Aceste instrumente te ajută să explici celorlalți cum pot pune bazele unei relații cu Dumnezeu prin Iisus Hristos, chiar dacă nu ți-ai împărtășit credința până acum sau persoanele vorbesc o altă limbă."; "general_about_3" = "Alege din varietatea de instrumente pe baza preferințelor tale și a audienței. Nu toate instrumentele sunt disponibile în toate limbile."; "general_about_4" = "La sfârșitul fiecărui instrument sunt incluse link-uri către alte resurse."; "general_about_5" = "Este nevoie de conexiune online pentru a descărca fiecare instrument și/sau limbă nouă. După descărcare, acestea pot fi folosite offline."; "general_about_6" = "Întrebări? Sugestii? Solicitări? Contactați-ne la support@godtoolsapp.com"; "general_about_7" = "Puteți găsi versiunea online a instrumentelor pe knowgod.com. Implementați-o pe site-ul vostru!"; +"tutorial.tutorialItem.3.title" = "Acest tutorial este iarăși disponibil în meniu"; "general_about_8" = "Vizitați godtoolsapp.com pentru mai multe informații."; -"tutorial.continueButton.title.continue" = "Continuaţi"; -"general_about_9" = "Atunci când adopți inițiativa de a-ți împărtăși credința, nu uita că Dumnezeu este cel care schimbă inimile. Iubește fiecare persoană și ascult-o pentru a o înțelege."; +"tutorial.continueButton.title.continue" = "Continuă"; +"general_about_9" = "Pe măsură ce iei inițiativa de a-ți împărtăși credința, nu uita că Dumnezeu este Cel care schimbă inimile. Iubește fiecare persoană și ascult-o pentru a o înțelege."; +"tutorial.continueButton.title.startUsingGodTools" = "Începe să folosești GodTools"; + "general_about_10" = "„Vorbirea voastră să fie totdeauna cu har, dreasă cu sare, ca să ştiţi cum trebuie să răspundeţi fiecăruia.” Coloseni 4:6"; +// OpenTutorial +"openTutorial.showTutorialLabel.text" = "Arată-mi un Tutorial"; // Downloads "Download in progress" = "Descărcare în curs"; +"openTutorial.openTutorialButton.title" = "Deschide Tutorialul"; + // Navigation - this is an abbreviation for the word "Previous" meaning go back to the card that was previous to this one. -"card_status1" = "Ant."; +"card_status1" = "Anterior"; +// Account +"account.navTitle" = "Profilul Meu"; "card_status2" = "Următorul"; +"account.activity.title" = "Activitate"; + // Language Name Strings "language_name_fa" = "Persană (Farsi)"; +// Account Activity +"accountActivity.globalAnalytics.header.title" = "Activitate Globală"; +"accountActivity.globalAnalytics.users.title" = "Utilizatori\nUnici"; +"onboardingWelcome.titleLabel.tagline" = "Te ajutăm să-ți împărtășești credința"; +"accountActivity.globalAnalytics.gospelPresentation.title" = "Prezentări ale\nEvangheliei"; +"accountActivity.globalAnalytics.launches.title" = "Sesiuni"; +// OnboardingTutorial +"onboardingTutorial.aboutAppItem.0.title" = "Distribuie cu ceilalți"; +"accountActivity.globalAnalytics.countries.title" = "Țări"; + +"onboardingTutorial.showMoreButton.title" = "Arată-mi mai mult"; diff --git a/godtools/ro.lproj/Localizable.stringsdict b/godtools/ro.lproj/Localizable.stringsdict index 86bb016ba0..f5b682b39a 100644 --- a/godtools/ro.lproj/Localizable.stringsdict +++ b/godtools/ro.lproj/Localizable.stringsdict @@ -13,11 +13,11 @@ NSStringFormatValueTypeKey d one -%d Lesson available +%d Lecție disponibilă few - +Lecții disponibile other -%d Lessons available +%d Lecții disponibile account.activity.toolOpens @@ -31,11 +31,11 @@ NSStringFormatValueTypeKey d one -Tool open +Instrument deschis few - +Instrumente deschise other -Tool opens +Instrumente deschise account.activity.lessonCompletions @@ -49,11 +49,11 @@ NSStringFormatValueTypeKey d one -Lesson completion +Lecție finisată few - +Lecții finisate other -Lesson completions +Lecții finisate account.activity.screenShares @@ -67,11 +67,11 @@ NSStringFormatValueTypeKey d one -Screen share +Ecran partajat few - +Ecrane partajate other -Screen shares +Ecrane partajate account.activity.linksShared @@ -85,11 +85,11 @@ NSStringFormatValueTypeKey d one -Link share +Link partajat few - +Link-uri partajate other -Link shares +Link-uri partajate account.activity.languagesUsed @@ -103,11 +103,11 @@ NSStringFormatValueTypeKey d one -Language used +Limbă folosită few - +Limbi folosite other -Languages used +Limbi folosite account.activity.sessions @@ -121,11 +121,11 @@ NSStringFormatValueTypeKey d one -Session +Sesiune few - +Sesiuni other -Sessions +Sesiuni tools.filter.toolsAvailable @@ -139,11 +139,11 @@ NSStringFormatValueTypeKey d one -%d Tool available +%d Instrument disponibil few - +Instrumente disponibile other -%d Tools available +%d Instrumente disponibile languageSettings.appLanguage.numberAvailable @@ -157,11 +157,11 @@ NSStringFormatValueTypeKey d one -1 Language available +%d Limbă disponibilă few - +Limbi disponibile other -%d Languages available +%d Limbi disponibile badges.imagesShared @@ -175,11 +175,11 @@ NSStringFormatValueTypeKey d one -Shared 1 image +S-a partajat o imagine few - +Imagini partajate other -Shared %d images +Imagini partajate %d badges.articlesOpened @@ -193,11 +193,11 @@ NSStringFormatValueTypeKey d one -Read 1 article +Citește un articol few - +Citește articole other -Read %d articles +Citește %d articole badges.lessonsCompleted @@ -211,11 +211,11 @@ NSStringFormatValueTypeKey d one -Completed 1 lesson +Lecție finisată few - +Lecții finisate other -Completed %d lessons +Lecții finisate %d badges.toolsOpened @@ -229,11 +229,11 @@ NSStringFormatValueTypeKey d one -Opened 1 tool +Deschis un instrument few - +Instrumente deschise other -Opened %d tools +Instrumente deschise %d badges.tipsCompleted @@ -247,11 +247,11 @@ NSStringFormatValueTypeKey d one -Completed 1 training tip +O recomandare antrenată finisată few - +Recomandări antrenate finisate other -Completed %d training tips +Recomandări antrenate finisate %d diff --git a/godtools/ru.lproj/Localizable.strings b/godtools/ru.lproj/Localizable.strings index 71d58971c0..ca1de10c4d 100755 --- a/godtools/ru.lproj/Localizable.strings +++ b/godtools/ru.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "Продолжить урок"; + +"lessons.resumeLessonModal.subtitle" = "Вы хотели бы продолжить с того места, на котором остановились?"; +"lessons.resumeLessonModal.startOverButton" = "Начать заново"; +"lessons.resumeLessonModal.continueButton" = "Продолжить"; +"lessons.lessonCompleted" = "Завершено"; +"lessons.completionProgress" = "%@ Заполнено"; "network_connection_lost" = "Соединение с сетью потеряно."; "language_name_fil" = "Филиппинский (Тагальский)"; "lessons.filter.navBar.language" = "Язык урока"; diff --git a/godtools/sw.lproj/Localizable.strings b/godtools/sw.lproj/Localizable.strings index 65d9ac821e..f8b11f5e93 100755 --- a/godtools/sw.lproj/Localizable.strings +++ b/godtools/sw.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "Rejelea Maendeleo"; + +"lessons.resumeLessonModal.subtitle" = "Je, ungependa kuendelea kutoka mahali ulipoachia?"; +"lessons.resumeLessonModal.startOverButton" = "Anza upya"; +"lessons.resumeLessonModal.continueButton" = "Endelea"; +"lessons.lessonCompleted" = "Imekamilika"; +"lessons.completionProgress" = "%@ Kamili"; "network_connection_lost" = "Mtandao umepotea."; "language_name_fil" = "Kifilipino (Kitagalog)"; "lessons.filter.navBar.language" = "Lugha ya somo"; diff --git a/godtools/ur.lproj/Localizable.strings b/godtools/ur.lproj/Localizable.strings index 87e5e231c4..1e045584aa 100755 --- a/godtools/ur.lproj/Localizable.strings +++ b/godtools/ur.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "پیش رفت دوبارہ شروع کریں"; + +"lessons.resumeLessonModal.subtitle" = "کیا آپ وہاں سے دوبارہ آغاز کرنا چاہیں گے جہاں آپ نے چھوڑا تھا؟"; +"lessons.resumeLessonModal.startOverButton" = "دوبارہ شروع کریں"; +"lessons.resumeLessonModal.continueButton" = "جاری رکھیں"; +"lessons.lessonCompleted" = "مکمل ہوا"; +"lessons.completionProgress" = "%@ کامل"; "network_connection_lost" = "نیٹ ورک کنکشن ختم ہوگیا۔"; "language_name_fil" = "فلپائینی(تاگالوگ)"; "lessons.filter.navBar.language" = "سبق کی زبان"; diff --git a/godtools/vi.lproj/Localizable.strings b/godtools/vi.lproj/Localizable.strings index e9dac58224..4edf86266f 100755 --- a/godtools/vi.lproj/Localizable.strings +++ b/godtools/vi.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "Tiếp tục Tiến trình"; + +"lessons.resumeLessonModal.subtitle" = "Bạn có muốn tiếp tục từ nơi bạn đã dừng lại không?"; +"lessons.resumeLessonModal.startOverButton" = "Bắt đầu lại"; +"lessons.resumeLessonModal.continueButton" = "Tiếp tục"; +"lessons.lessonCompleted" = "Hoàn Tất"; +"lessons.completionProgress" = "%@ hoàn tất"; "network_connection_lost" = "Kết nối mạng đã bị mất."; "language_name_fil" = "Tiếng Philippines (Tagalog)"; "lessons.filter.navBar.language" = "Ngôn ngữ bài học"; diff --git a/godtools/zh-Hans.lproj/Localizable.strings b/godtools/zh-Hans.lproj/Localizable.strings index b4689c027a..65e8c6fa29 100755 --- a/godtools/zh-Hans.lproj/Localizable.strings +++ b/godtools/zh-Hans.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "恢复进度"; + +"lessons.resumeLessonModal.subtitle" = "您想从上次停止的地方继续吗?"; +"lessons.resumeLessonModal.startOverButton" = "重新开始"; +"lessons.resumeLessonModal.continueButton" = "继续"; +"lessons.lessonCompleted" = "已完成"; +"lessons.completionProgress" = "%@ 完成"; "network_connection_lost" = "网络连接已断开。"; "language_name_fil" = "菲律宾语(他加禄语)"; "lessons.filter.navBar.language" = "课程语言"; diff --git a/godtools/zh-Hant.lproj/Localizable.strings b/godtools/zh-Hant.lproj/Localizable.strings index 9802308aff..e23bc8f3f9 100755 --- a/godtools/zh-Hant.lproj/Localizable.strings +++ b/godtools/zh-Hant.lproj/Localizable.strings @@ -1,3 +1,11 @@ +/* The meaning for this is "Pick up where you left off" or "Continue from your previous spot". */ +"lessons.resumeLessonModal.title" = "恢復進度"; + +"lessons.resumeLessonModal.subtitle" = "您想繼續從上次停止的地方開始嗎?"; +"lessons.resumeLessonModal.startOverButton" = "重新開始"; +"lessons.resumeLessonModal.continueButton" = "繼續"; +"lessons.lessonCompleted" = "完成"; +"lessons.completionProgress" = "完成 %@"; "network_connection_lost" = "網絡連接已丟失。"; "language_name_fil" = "菲律賓文 (他加祿語)"; "lessons.filter.navBar.language" = "課程語言"; From 0c37f85efc609dc8f4f68cf15e802fe8d23b1f53 Mon Sep 17 00:00:00 2001 From: Levi Eggert Date: Mon, 2 Dec 2024 16:01:26 -0500 Subject: [PATCH 24/28] Add romanian to app languages --- .../Data/AppLanguagesRepository/Api/AppLanguagesApi.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/godtools/App/Features/AppLanguage/Data/AppLanguagesRepository/Api/AppLanguagesApi.swift b/godtools/App/Features/AppLanguage/Data/AppLanguagesRepository/Api/AppLanguagesApi.swift index 3b748e5517..e80647e584 100644 --- a/godtools/App/Features/AppLanguage/Data/AppLanguagesRepository/Api/AppLanguagesApi.swift +++ b/godtools/App/Features/AppLanguage/Data/AppLanguagesRepository/Api/AppLanguagesApi.swift @@ -31,6 +31,7 @@ class AppLanguagesApi { AppLanguageCodable(languageCode: "ko", languageDirection: .leftToRight, languageScriptCode: nil), AppLanguageCodable(languageCode: "lv", languageDirection: .leftToRight, languageScriptCode: nil), AppLanguageCodable(languageCode: "pt", languageDirection: .leftToRight, languageScriptCode: nil), + AppLanguageCodable(languageCode: "ro", languageDirection: .leftToRight, languageScriptCode: nil), AppLanguageCodable(languageCode: "ru", languageDirection: .leftToRight, languageScriptCode: nil), AppLanguageCodable(languageCode: "sw", languageDirection: .leftToRight, languageScriptCode: nil), AppLanguageCodable(languageCode: "ur", languageDirection: .rightToLeft, languageScriptCode: nil), From 59de23e41ad837d7a32191eb2dd23cd3310af1cf Mon Sep 17 00:00:00 2001 From: Levi Eggert Date: Mon, 2 Dec 2024 16:05:42 -0500 Subject: [PATCH 25/28] Pod update --- Podfile.lock | 4 +- godtools.xcodeproj/project.pbxproj | 68 +++++++++++++++--------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 7342329a66..d59010bec9 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -9,8 +9,8 @@ SPEC REPOS: - GodToolsShared SPEC CHECKSUMS: - GodToolsShared: 404a619e53dc1890091397ac4e1da69afb5eabcd + GodToolsShared: 6001489c49a3af8a0ae8b169bf2604ccf3009666 -PODFILE CHECKSUM: 1816453b60fe876696e3cc9b1da49602bb07e16b +PODFILE CHECKSUM: 4afa67206a45df71c21cb5eb808888f3037d2463 COCOAPODS: 1.15.2 diff --git a/godtools.xcodeproj/project.pbxproj b/godtools.xcodeproj/project.pbxproj index 560eb7bd9a..cb18440aea 100644 --- a/godtools.xcodeproj/project.pbxproj +++ b/godtools.xcodeproj/project.pbxproj @@ -7,10 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 1126A12613292426AB844CB8 /* libPods-godtoolsTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 86E2BC9667BFFD8E4967DC28 /* libPods-godtoolsTests.a */; }; 17141EFD230DDE150088BD7E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4FAF207A1F02933900C43AFC /* Localizable.strings */; }; 17339885230736DB00A715B4 /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17339884230736DB00A715B4 /* SnapshotHelper.swift */; }; 1737DFDF22FDB48000223CB0 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1737DFDE22FDB48000223CB0 /* GoogleService-Info.plist */; }; - 1E06EB6DA916BEF9C627866F /* Pods_godtools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D61FF360D11F854476B6E206 /* Pods_godtools.framework */; }; 450069892B193867008A7499 /* ViewLanguageSettingsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450069882B193867008A7499 /* ViewLanguageSettingsUseCase.swift */; }; 4500698B2B193880008A7499 /* ViewLanguageSettingsDomainModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4500698A2B193880008A7499 /* ViewLanguageSettingsDomainModel.swift */; }; 450069902B194371008A7499 /* ToolLanguagesAvailableOfflineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4500698F2B194371008A7499 /* ToolLanguagesAvailableOfflineView.swift */; }; @@ -813,8 +813,8 @@ 459BF7812AFEE0320053BA09 /* ToolScreenShareTutorialViewsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459BF77D2AFEE0320053BA09 /* ToolScreenShareTutorialViewsRepository.swift */; }; 459C526F289418EB00DA9E95 /* TranslationManifestFileDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459C526E289418EB00DA9E95 /* TranslationManifestFileDataModel.swift */; }; 459C527128941A5B00DA9E95 /* TranslationFilesDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459C527028941A5B00DA9E95 /* TranslationFilesDataModel.swift */; }; - 459C56D225FF954F00F15967 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 459C56D325FF954F00F15967 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 459C56D225FF954F00F15967 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 459C56D325FF954F00F15967 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; 459E27FA2AD8280D008275B3 /* DeleteUserCountersUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459E27F92AD8280D008275B3 /* DeleteUserCountersUseCase.swift */; }; 459E3A062A30BC2600070934 /* MenuItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459E3A032A30BC2600070934 /* MenuItemView.swift */; }; 459E3A072A30BC2600070934 /* MenuSectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459E3A042A30BC2600070934 /* MenuSectionView.swift */; }; @@ -1040,15 +1040,15 @@ 45B54C572A2641FE0042CD0E /* RealmDatabase+Read.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B54C542A2641FE0042CD0E /* RealmDatabase+Read.swift */; }; 45B54C582A2641FE0042CD0E /* RealmDatabase+Write.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B54C552A2641FE0042CD0E /* RealmDatabase+Write.swift */; }; 45B54C592A2641FE0042CD0E /* RealmDatabase+Delete.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B54C562A2641FE0042CD0E /* RealmDatabase+Delete.swift */; }; - 45B6480925E581660098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6480A25E581660098BAF1 /* (null) in Resources */ = {isa = PBXBuildFile; }; - 45B6480B25E581660098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6480C25E581660098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6481625E58ECC0098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6482025E58EE70098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6482825E593110098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; - 45B6482925E593110098BAF1 /* (null) in Resources */ = {isa = PBXBuildFile; }; - 45B6482A25E593110098BAF1 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 45B6480925E581660098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6480A25E581660098BAF1 /* BuildFile in Resources */ = {isa = PBXBuildFile; }; + 45B6480B25E581660098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6480C25E581660098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6481625E58ECC0098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6482025E58EE70098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6482825E593110098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 45B6482925E593110098BAF1 /* BuildFile in Resources */ = {isa = PBXBuildFile; }; + 45B6482A25E593110098BAF1 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; 45B6FF2A2BAA39660037B240 /* ViewToolFilterLanguagesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B6FF282BAA39660037B240 /* ViewToolFilterLanguagesUseCase.swift */; }; 45B6FF2B2BAA39660037B240 /* ViewToolFilterCategoriesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B6FF292BAA39660037B240 /* ViewToolFilterCategoriesUseCase.swift */; }; 45B6FF302BAA39720037B240 /* SearchToolFilterLanguagesRepositoryInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B6FF2C2BAA39710037B240 /* SearchToolFilterLanguagesRepositoryInterface.swift */; }; @@ -1477,8 +1477,8 @@ 4F2500621F0C1E8D00364FBC /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F2500611F0C1E8D00364FBC /* AdSupport.framework */; }; 4F5732971EA69CF00082035C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F5732961EA69CF00082035C /* Assets.xcassets */; }; 4FAF20781F02933900C43AFC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4FAF207A1F02933900C43AFC /* Localizable.strings */; }; - 8C8C44BD9B31E90E469C99FF /* Pods_godtoolsTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D487087EDFEFD1AF7B39128C /* Pods_godtoolsTests.framework */; }; - B53E1698B88EF1DB21A2DD30 /* Pods_godtoolsUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E639208D24BEB8ADAAB1104 /* Pods_godtoolsUITests.framework */; }; + 69279CE105E6A1BDB5738C99 /* libPods-godtoolsUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C7283D0A8A2C938D721593A /* libPods-godtoolsUITests.a */; }; + BBF77B54D82614FA43460544 /* libPods-godtools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FE0DBD49D6EF7D669B3B48D5 /* libPods-godtools.a */; }; D105922E252FA2E700F120CA /* share_tool_tutorial_mirrored.json in Resources */ = {isa = PBXBuildFile; fileRef = D115A65D25265813007F11AD /* share_tool_tutorial_mirrored.json */; }; D163EA96254A00BE00BA4EA9 /* share_tool_tutorial_link.json in Resources */ = {isa = PBXBuildFile; fileRef = D163EA95254A00BE00BA4EA9 /* share_tool_tutorial_link.json */; }; D1838479257E86B3004F5674 /* container in Resources */ = {isa = PBXBuildFile; fileRef = D1838478257E86B3004F5674 /* container */; }; @@ -3118,7 +3118,6 @@ 45FE82502ACE5D8C00930C39 /* AppLayoutDirectionNavBarItemController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppLayoutDirectionNavBarItemController.swift; sourceTree = ""; }; 45FE82522ACE5D8C00930C39 /* NavBarItemContentType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavBarItemContentType.swift; sourceTree = ""; }; 45FE82532ACE5D8C00930C39 /* NavBarItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavBarItem.swift; sourceTree = ""; }; - 4E639208D24BEB8ADAAB1104 /* Pods_godtoolsUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_godtoolsUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4F0CCC1E1EE73E9D00AE4E45 /* Podfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Podfile; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 4F12296C20852BE3008842CC /* godtoolsUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = godtoolsUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 4F12297020852BE3008842CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -3176,6 +3175,8 @@ 684328EB1EB7C7F4005E9131 /* fastlane */ = {isa = PBXFileReference; lastKnownFileType = folder; path = fastlane; sourceTree = ""; }; 684328F11EB7CF66005E9131 /* godtoolsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = godtoolsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 6A3486217BA7BF7A1AA9B8F5 /* Pods-godtools.analyticslogging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtools.analyticslogging.xcconfig"; path = "Pods/Target Support Files/Pods-godtools/Pods-godtools.analyticslogging.xcconfig"; sourceTree = ""; }; + 7C7283D0A8A2C938D721593A /* libPods-godtoolsUITests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-godtoolsUITests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 86E2BC9667BFFD8E4967DC28 /* libPods-godtoolsTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-godtoolsTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; A9BDC99CD6AA5FF3CCAC0E93 /* Pods-godtools.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtools.staging.xcconfig"; path = "Pods/Target Support Files/Pods-godtools/Pods-godtools.staging.xcconfig"; sourceTree = ""; }; B03BA6AC6918BE450406F1E6 /* Pods-godtools.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtools.debug.xcconfig"; path = "Pods/Target Support Files/Pods-godtools/Pods-godtools.debug.xcconfig"; sourceTree = ""; }; CD35532F620E5D79E5C5E9B9 /* Pods-godtoolsUITests.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtoolsUITests.staging.xcconfig"; path = "Pods/Target Support Files/Pods-godtoolsUITests/Pods-godtoolsUITests.staging.xcconfig"; sourceTree = ""; }; @@ -3231,7 +3232,6 @@ D47DF0452B2A3D5D0079219B /* DownloadedLanguageDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadedLanguageDataModel.swift; sourceTree = ""; }; D48018BF28EF650700389565 /* DashboardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardView.swift; sourceTree = ""; }; D48018C128EF6A7100389565 /* DashboardViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardViewModel.swift; sourceTree = ""; }; - D487087EDFEFD1AF7B39128C /* Pods_godtoolsTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_godtoolsTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D4960CC12CBDE40B0090B114 /* GetLessonListItemProgressRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetLessonListItemProgressRepository.swift; sourceTree = ""; }; D4960CC52CC6D77B0090B114 /* GetTranslatedPercentage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetTranslatedPercentage.swift; sourceTree = ""; }; D4960CC72CC6DEAE0090B114 /* UserLessonProgressDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserLessonProgressDomainModel.swift; sourceTree = ""; }; @@ -3385,7 +3385,6 @@ D4F045822BBB4CDA00B115C9 /* UserToolLanguageFilterDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserToolLanguageFilterDataModel.swift; sourceTree = ""; }; D4F1DE8C2967538A00A2F674 /* IncrementUserCounterUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncrementUserCounterUseCase.swift; sourceTree = ""; }; D4F1DE8F29676B8A00A2F674 /* UserCounterDomainModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserCounterDomainModel.swift; sourceTree = ""; }; - D61FF360D11F854476B6E206 /* Pods_godtools.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_godtools.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E0F338026DD564DE8D5B7CE2 /* Pods-godtoolsTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtoolsTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-godtoolsTests/Pods-godtoolsTests.debug.xcconfig"; sourceTree = ""; }; E60CDF010C22554D98B9B158 /* Pods-godtoolsUITests.analyticslogging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtoolsUITests.analyticslogging.xcconfig"; path = "Pods/Target Support Files/Pods-godtoolsUITests/Pods-godtoolsUITests.analyticslogging.xcconfig"; sourceTree = ""; }; EBE523140714C16DAAB6B473 /* Pods-godtools.production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtools.production.xcconfig"; path = "Pods/Target Support Files/Pods-godtools/Pods-godtools.production.xcconfig"; sourceTree = ""; }; @@ -3402,6 +3401,7 @@ ECD344FF1F141A4700906471 /* tr-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "tr-TR"; path = "tr-TR.lproj/Localizable.strings"; sourceTree = ""; }; ECD345001F142C3000906471 /* ko-KR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ko-KR"; path = "ko-KR.lproj/Localizable.strings"; sourceTree = ""; }; F1BE3B21D598FF586906D91D /* Pods-godtoolsTests.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-godtoolsTests.staging.xcconfig"; path = "Pods/Target Support Files/Pods-godtoolsTests/Pods-godtoolsTests.staging.xcconfig"; sourceTree = ""; }; + FE0DBD49D6EF7D669B3B48D5 /* libPods-godtools.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-godtools.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -3423,13 +3423,13 @@ 45A4160C2A9943D50030E2C7 /* YouTubeiOSPlayerHelper in Frameworks */, 45A416082A9943D50030E2C7 /* RequestOperation in Frameworks */, 45A4161A2A9943D50030E2C7 /* Starscream in Frameworks */, - B53E1698B88EF1DB21A2DD30 /* Pods_godtoolsUITests.framework in Frameworks */, 45A4161C2A9943D50030E2C7 /* Fuzi in Frameworks */, 45A416062A9943D50030E2C7 /* Lottie in Frameworks */, 45A416122A9943D50030E2C7 /* FirebaseCrashlytics in Frameworks */, 45A4160E2A9943D50030E2C7 /* ZipArchive in Frameworks */, 45A416102A9943D50030E2C7 /* FirebaseAnalytics in Frameworks */, 45A416162A9943D50030E2C7 /* FirebaseInAppMessaging-Beta in Frameworks */, + 69279CE105E6A1BDB5738C99 /* libPods-godtoolsUITests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3445,13 +3445,13 @@ 45CF09702784B910007F13D3 /* RequestOperation in Frameworks */, 457771B629A00C5C00EA8115 /* FirebaseDynamicLinks in Frameworks */, 45E7D4C42977430A008C7503 /* ZipArchive in Frameworks */, - 1E06EB6DA916BEF9C627866F /* Pods_godtools.framework in Frameworks */, D4997E0E28D4CED800205B4C /* YouTubeiOSPlayerHelper in Frameworks */, 457771B429A00C5C00EA8115 /* FirebaseCrashlytics in Frameworks */, 45E39EDC27457E0C006A59E4 /* Lottie in Frameworks */, 457771B829A00C5C00EA8115 /* FirebaseInAppMessaging-Beta in Frameworks */, 45D48C8629F81324004E92B1 /* SocialAuthentication in Frameworks */, 45D40C682A5315B400E8E4AE /* Starscream in Frameworks */, + BBF77B54D82614FA43460544 /* libPods-godtools.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3463,7 +3463,7 @@ 4581EAA52BFBE257008115FF /* RealmSwift in Frameworks */, 45F486F22B76D513004E0E27 /* Nimble in Frameworks */, 45F486EF2B76D501004E0E27 /* Quick in Frameworks */, - 8C8C44BD9B31E90E469C99FF /* Pods_godtoolsTests.framework in Frameworks */, + 1126A12613292426AB844CB8 /* libPods-godtoolsTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3508,10 +3508,10 @@ 451F7A822ABD2F1400006EF2 /* Nimble.framework */, 451F7A802ABD2F1100006EF2 /* Quick.framework */, 4F2500611F0C1E8D00364FBC /* AdSupport.framework */, - D61FF360D11F854476B6E206 /* Pods_godtools.framework */, - D487087EDFEFD1AF7B39128C /* Pods_godtoolsTests.framework */, 0B35785ED952890E2E07F786 /* Pods_godtools_Tests_godtoolsTests.framework */, - 4E639208D24BEB8ADAAB1104 /* Pods_godtoolsUITests.framework */, + FE0DBD49D6EF7D669B3B48D5 /* libPods-godtools.a */, + 86E2BC9667BFFD8E4967DC28 /* libPods-godtoolsTests.a */, + 7C7283D0A8A2C938D721593A /* libPods-godtoolsUITests.a */, ); name = Frameworks; sourceTree = ""; @@ -12219,7 +12219,7 @@ 451A17522756C10400D35D78 /* tutorial_screenshare.json in Resources */, D4B522D929D761B700D85213 /* Localizable.stringsdict in Resources */, 1737DFDF22FDB48000223CB0 /* GoogleService-Info.plist in Resources */, - 45B6482925E593110098BAF1 /* (null) in Resources */, + 45B6482925E593110098BAF1 /* BuildFile in Resources */, 458CFE9329D4E0B9007B423C /* ArticlesErrorMessageView.xib in Resources */, 455583FC269F2DA500C3FF14 /* MobileContentInputView.xib in Resources */, 451A17542756C10400D35D78 /* tutorial_tooltip.json in Resources */, @@ -12252,7 +12252,7 @@ D19EB5E0259BB75900685156 /* training_tip_tips.json in Resources */, 458CFE9129D4E0B9007B423C /* ArticleWebView.xib in Resources */, 4555840F269F2DA500C3FF14 /* MobileContentTextView.xib in Resources */, - 45B6480A25E581660098BAF1 /* (null) in Resources */, + 45B6480A25E581660098BAF1 /* BuildFile in Resources */, 45F7162E290A12D70019B715 /* WebContentView.xib in Resources */, 45DEF22E2576A6A20007AC64 /* learn_to_share_tool_with_anyone.json in Resources */, 45BE4A7D2AF28788004021DA /* SF-Pro-Display-Regular.otf in Resources */, @@ -12523,7 +12523,7 @@ 45D63E56288F67F8009B4610 /* IgnoreCacheSession.swift in Sources */, 458B91C32B7D676900785C6F /* ViewFavoritesDomainModel.swift in Sources */, 459E86DD28EDA86C00E197A5 /* DeepLinkUrlParserType.swift in Sources */, - 459C56D225FF954F00F15967 /* (null) in Sources */, + 459C56D225FF954F00F15967 /* BuildFile in Sources */, 45D63E86288F75B0009B4610 /* RealmAttachment.swift in Sources */, 45C649C22B31E212000249E0 /* GetShareToolInterfaceStringsRepositoryInterface.swift in Sources */, 45A8BDE32ACC9F47007A1EBB /* LessonsViewModel.swift in Sources */, @@ -12558,7 +12558,7 @@ 45AC9DED2B28A9CD00DEEBFE /* LanguageDownloadIcon.swift in Sources */, 459E86EE28EDA86C00E197A5 /* DeepLinkingParserManifestUrl.swift in Sources */, 45D00A1A2B1FD0E3007D2B65 /* String+ParseUrls.swift in Sources */, - 45B6481625E58ECC0098BAF1 /* (null) in Sources */, + 45B6481625E58ECC0098BAF1 /* BuildFile in Sources */, 45F3AF062B5EC0A600CE8D41 /* PageNavigationCollectionViewFlowLayout.swift in Sources */, 45CBDA042BA38F200007DEC8 /* LaunchCountCache.swift in Sources */, 45F71629290A12D70019B715 /* WebContentType.swift in Sources */, @@ -12622,7 +12622,7 @@ 45B3382F2AF42A6400D18C63 /* TutorialInterfaceStringsDomainModel.swift in Sources */, D4E7EE262CA5E62B00F75DA6 /* StoreUserLessonProgressRepository.swift in Sources */, D4E7EE1A2CA345DD00F75DA6 /* UserLessonProgressRepository.swift in Sources */, - 45B6480B25E581660098BAF1 /* (null) in Sources */, + 45B6480B25E581660098BAF1 /* BuildFile in Sources */, 458B91B12B7D5D6800785C6F /* ConfirmRemoveToolFromFavoritesAlertViewModel.swift in Sources */, 4512D4D32B29127C00DFAFB3 /* GetToolSettingsToolLanguagesListInterfaceStringsRepository.swift in Sources */, 4534F93B2AE9B11600A7A071 /* RealmLessonEvaluation.swift in Sources */, @@ -12729,7 +12729,7 @@ 459BF77E2AFEE0320053BA09 /* ToolScreenShareTutorialViewDataModel.swift in Sources */, 45EB9B7229F16CF200CA74A8 /* UILabel+AttributedString.swift in Sources */, 45B54C572A2641FE0042CD0E /* RealmDatabase+Read.swift in Sources */, - 45B6482025E58EE70098BAF1 /* (null) in Sources */, + 45B6482025E58EE70098BAF1 /* BuildFile in Sources */, 45645C162AFE774900BD233D /* GetShareToolScreenShareSessionInterfaceStringsRepository.swift in Sources */, 45AD1BD925938A4F00A096A0 /* AlertMessageView.swift in Sources */, 4512D4DD2B29129100DFAFB3 /* ToolSettingsToolLanguagesListItemView.swift in Sources */, @@ -12897,7 +12897,7 @@ 45C8835D2A93EDDF00F33E6D /* DashboardTabBarItemView.swift in Sources */, 4504BA282AF3EE67001151E5 /* GetTutorialUseCase.swift in Sources */, 459F86862AC51A9A00B4E5CA /* ChooseAppLanguageNavigationFlow.swift in Sources */, - 45B6480925E581660098BAF1 /* (null) in Sources */, + 45B6480925E581660098BAF1 /* BuildFile in Sources */, 45EB9B8329F16CF200CA74A8 /* Color+RGB.swift in Sources */, 45558407269F2DA500C3FF14 /* MobileContentPagesViewModel.swift in Sources */, 45ACCA582CD2BFBB00567AE6 /* AppMessagingInterface.swift in Sources */, @@ -13114,7 +13114,7 @@ 45BE4A812AF287D2004021DA /* ConfirmAppLanguageViewModel.swift in Sources */, 45AE975527C97A9500C2CB33 /* Input+MobileContentRenderableModel.swift in Sources */, 452D355A2A8FB9EB00BC4F97 /* FavoritedResourceDataModel.swift in Sources */, - 459C56D325FF954F00F15967 /* (null) in Sources */, + 459C56D325FF954F00F15967 /* BuildFile in Sources */, 451CCF1427A9AA4700E8D2D3 /* MobileContentViewPositionState.swift in Sources */, 45F71623290A12D70019B715 /* WebContentViewModel.swift in Sources */, 458B91AB2B7D5D6800785C6F /* FavoritesView.swift in Sources */, @@ -13190,7 +13190,7 @@ 45AAC2AB2BB30F0A000AE690 /* MobileContentGlobalAnalyticsDecodable.swift in Sources */, 45EB9B7329F16CF200CA74A8 /* UIButton+ImageColor.swift in Sources */, 45F378FC2B23642600EEF039 /* GetLearnToShareToolTutorialItemsRepository.swift in Sources */, - 45B6482A25E593110098BAF1 /* (null) in Sources */, + 45B6482A25E593110098BAF1 /* BuildFile in Sources */, D42FEBD62875D8D50002FAD9 /* GetOptInOnboardingTutorialAvailableUseCase.swift in Sources */, 4534F92C2AE9A99200A7A071 /* TrackLessonFeedbackDomainModel.swift in Sources */, D40D77BF2AB36766008D3642 /* SearchBarViewModel.swift in Sources */, @@ -13272,7 +13272,7 @@ 458B91B02B7D5D6800785C6F /* YourFavoriteToolsView.swift in Sources */, 452DFB372B7FAAE5003A4A59 /* GetToolListItemInterfaceStringsRepository.swift in Sources */, 45369AD72AFA7FA500BD10F0 /* ToolScreenShareTutorialView.swift in Sources */, - 45B6480C25E581660098BAF1 /* (null) in Sources */, + 45B6480C25E581660098BAF1 /* BuildFile in Sources */, 45723DF72ABA24CE00C697E6 /* MobileContentApiErrorCodableCode.swift in Sources */, 45369AD42AFA7FA500BD10F0 /* ToolScreenShareTutorialPageDomainModel.swift in Sources */, 455582E5269F2C1000C3FF14 /* TrainingTipView.swift in Sources */, @@ -13408,7 +13408,7 @@ 4585BF662AC391F100A6D720 /* SetUserPreferredAppLanguageRepositoryInterface.swift in Sources */, 45F378FF2B23642600EEF039 /* LearnToShareToolDataLayerDependencies.swift in Sources */, 45B3F44A2AC3A86100D61BFD /* UserAppLanguageRepository.swift in Sources */, - 45B6482825E593110098BAF1 /* (null) in Sources */, + 45B6482825E593110098BAF1 /* BuildFile in Sources */, 45A835102AD1A40D004F5593 /* GetToolDetailsMediaUseCase.swift in Sources */, 4534F9462AE9B8E700A7A071 /* GetLessonEvaluatedUseCase.swift in Sources */, 45F378FD2B23642600EEF039 /* LearnToShareToolDomainLayerDependencies.swift in Sources */, From 5ec0e706ab5435e9899ff1c426ab68003814c744 Mon Sep 17 00:00:00 2001 From: Levi Eggert Date: Wed, 4 Dec 2024 18:20:49 -0500 Subject: [PATCH 26/28] Update tests target for iOS 15 --- godtools.xcodeproj/project.pbxproj | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/godtools.xcodeproj/project.pbxproj b/godtools.xcodeproj/project.pbxproj index 25edebfcef..1cd79ffb07 100644 --- a/godtools.xcodeproj/project.pbxproj +++ b/godtools.xcodeproj/project.pbxproj @@ -14188,7 +14188,7 @@ CODE_SIGN_STYLE = Manual; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUIRecording/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14319,7 +14319,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = DQ48D9BF2V; INFOPLIST_FILE = godtoolsTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14389,7 +14389,7 @@ CODE_SIGN_STYLE = Manual; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUIRecording/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14521,7 +14521,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = DQ48D9BF2V; INFOPLIST_FILE = godtoolsTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14591,7 +14591,7 @@ CODE_SIGN_STYLE = Manual; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUIRecording/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14721,7 +14721,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = DQ48D9BF2V; INFOPLIST_FILE = godtoolsTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14791,7 +14791,7 @@ CODE_SIGN_STYLE = Manual; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUIRecording/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14924,7 +14924,7 @@ DEVELOPMENT_TEAM = DQ48D9BF2V; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = DQ48D9BF2V; INFOPLIST_FILE = godtoolsTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14995,7 +14995,7 @@ CODE_SIGN_STYLE = Manual; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUIRecording/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -15159,7 +15159,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = DQ48D9BF2V; INFOPLIST_FILE = godtoolsTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", From f58b7b40807e8c8d6df06cabea92dfdb8e279970 Mon Sep 17 00:00:00 2001 From: Levi Eggert Date: Wed, 4 Dec 2024 19:10:12 -0500 Subject: [PATCH 27/28] Set ui tests min deployment to ios 15 --- godtools.xcodeproj/project.pbxproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/godtools.xcodeproj/project.pbxproj b/godtools.xcodeproj/project.pbxproj index 1cd79ffb07..9d215bbc5b 100644 --- a/godtools.xcodeproj/project.pbxproj +++ b/godtools.xcodeproj/project.pbxproj @@ -14357,7 +14357,7 @@ DEVELOPMENT_TEAM = DQ48D9BF2V; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14559,7 +14559,7 @@ DEVELOPMENT_TEAM = DQ48D9BF2V; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14759,7 +14759,7 @@ DEVELOPMENT_TEAM = DQ48D9BF2V; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14963,7 +14963,7 @@ DEVELOPMENT_TEAM = DQ48D9BF2V; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -15035,7 +15035,7 @@ DEVELOPMENT_TEAM = DQ48D9BF2V; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = godtoolsUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", From 8430204e076082ff75087b203ecd4e6b1d7abecd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 23:01:42 +0000 Subject: [PATCH 28/28] Lock file maintenance --- Gemfile.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c72cbf24f7..595fbd8446 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -25,8 +25,8 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.1013.0) - aws-sdk-core (3.213.0) + aws-partitions (1.1018.0) + aws-sdk-core (3.214.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -34,7 +34,7 @@ GEM aws-sdk-kms (1.96.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.173.0) + aws-sdk-s3 (1.176.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -218,23 +218,23 @@ GEM signet (>= 0.16, < 2.a) highline (2.0.3) http-accept (1.7.0) - http-cookie (1.0.7) + http-cookie (1.0.8) domain_name (~> 0.5) httpclient (2.8.3) i18n (1.14.6) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.8.2) + json (2.9.0) jwt (2.9.3) base64 - logger (1.6.1) + logger (1.6.2) mime-types (3.6.0) logger mime-types-data (~> 3.2015) - mime-types-data (3.2024.1105) + mime-types-data (3.2024.1203) mini_magick (4.13.2) mini_mime (1.1.5) - minitest (5.25.2) + minitest (5.25.4) molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.4.1) @@ -265,7 +265,7 @@ GEM ruby-macho (2.5.1) ruby2_keywords (0.0.5) rubyzip (2.3.2) - securerandom (0.3.2) + securerandom (0.4.0) security (0.1.5) signet (0.19.0) addressable (~> 2.8)