diff --git a/Authorization/Authorization.xcodeproj/project.pbxproj b/Authorization/Authorization.xcodeproj/project.pbxproj index 8c3380cd1..acde4b3e3 100644 --- a/Authorization/Authorization.xcodeproj/project.pbxproj +++ b/Authorization/Authorization.xcodeproj/project.pbxproj @@ -31,7 +31,6 @@ DE843D6BB1B9DDA398494890 /* Pods_App_Authorization.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47BCFB7C19382EECF15131B6 /* Pods_App_Authorization.framework */; }; E03261642AE64676002CA7EB /* StartupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E03261632AE64676002CA7EB /* StartupViewModel.swift */; }; E03261662AE64AF4002CA7EB /* StartupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E03261652AE64AF4002CA7EB /* StartupView.swift */; }; - E03261682AE9F156002CA7EB /* LogistrationBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E03261672AE9F156002CA7EB /* LogistrationBottomView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -84,7 +83,6 @@ BADB3F542AD6DFC3004D5CFA /* SocialAuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialAuthViewModel.swift; sourceTree = ""; }; E03261632AE64676002CA7EB /* StartupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartupViewModel.swift; sourceTree = ""; }; E03261652AE64AF4002CA7EB /* StartupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartupView.swift; sourceTree = ""; }; - E03261672AE9F156002CA7EB /* LogistrationBottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogistrationBottomView.swift; sourceTree = ""; }; E78971D8E6ED2116BBF9FD66 /* Pods-App-Authorization.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Authorization.release.xcconfig"; path = "Target Support Files/Pods-App-Authorization/Pods-App-Authorization.release.xcconfig"; sourceTree = ""; }; F52826C68AEA1CF4769389EA /* Pods-App-Authorization.releasestage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Authorization.releasestage.xcconfig"; path = "Target Support Files/Pods-App-Authorization/Pods-App-Authorization.releasestage.xcconfig"; sourceTree = ""; }; F5802BBA113276950ABCD9B3 /* Pods-App-Authorization.releaseprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Authorization.releaseprod.xcconfig"; path = "Target Support Files/Pods-App-Authorization/Pods-App-Authorization.releaseprod.xcconfig"; sourceTree = ""; }; @@ -284,7 +282,6 @@ children = ( E03261632AE64676002CA7EB /* StartupViewModel.swift */, E03261652AE64AF4002CA7EB /* StartupView.swift */, - E03261672AE9F156002CA7EB /* LogistrationBottomView.swift */, ); path = Startup; sourceTree = ""; @@ -505,7 +502,6 @@ 02066B462906D72F00F4307E /* SignUpViewModel.swift in Sources */, E03261642AE64676002CA7EB /* StartupViewModel.swift in Sources */, 02A2ACDB2A4B016100FBBBBB /* AuthorizationAnalytics.swift in Sources */, - E03261682AE9F156002CA7EB /* LogistrationBottomView.swift in Sources */, 025F40E029D1E2FC0064C183 /* ResetPasswordView.swift in Sources */, 020C31CB290BF49900D6DEA2 /* FieldsView.swift in Sources */, 0770DE4E28D0A677006D8A5D /* SignInView.swift in Sources */, diff --git a/Authorization/Authorization/Presentation/Login/SignInView.swift b/Authorization/Authorization/Presentation/Login/SignInView.swift index 0fece9b53..86f717f8c 100644 --- a/Authorization/Authorization/Presentation/Login/SignInView.swift +++ b/Authorization/Authorization/Presentation/Login/SignInView.swift @@ -100,9 +100,8 @@ public struct SignInView: View { ) HStack { if !viewModel.config.features.startupScreenEnabled { - Button(AuthLocalization.SignIn.registerBtn) { - viewModel.trackSignUpClicked() - viewModel.router.showRegisterScreen() + Button(CoreLocalization.SignIn.registerBtn) { + viewModel.router.showRegisterScreen(sourceScreen: viewModel.sourceScreen) }.foregroundColor(Theme.Colors.accentColor) Spacer() @@ -121,7 +120,7 @@ public struct SignInView: View { .padding(20) }.frame(maxWidth: .infinity) } else { - StyledButton(AuthLocalization.SignIn.logInBtn) { + StyledButton(CoreLocalization.SignIn.logInBtn) { Task { await viewModel.login(username: email, password: password) } @@ -192,7 +191,8 @@ struct SignInView_Previews: PreviewProvider { router: AuthorizationRouterMock(), config: ConfigMock(), analytics: AuthorizationAnalyticsMock(), - validator: Validator() + validator: Validator(), + sourceScreen: .default ) SignInView(viewModel: vm) diff --git a/Authorization/Authorization/Presentation/Login/SignInViewModel.swift b/Authorization/Authorization/Presentation/Login/SignInViewModel.swift index a2439a10b..3edd28bcf 100644 --- a/Authorization/Authorization/Presentation/Login/SignInViewModel.swift +++ b/Authorization/Authorization/Presentation/Login/SignInViewModel.swift @@ -19,6 +19,8 @@ public class SignInViewModel: ObservableObject { @Published private(set) var isShowProgress = false @Published private(set) var showError: Bool = false @Published private(set) var showAlert: Bool = false + let sourceScreen: LogistrationSourceScreen + var errorMessage: String? { didSet { withAnimation { @@ -45,13 +47,15 @@ public class SignInViewModel: ObservableObject { router: AuthorizationRouter, config: ConfigProtocol, analytics: AuthorizationAnalytics, - validator: Validator + validator: Validator, + sourceScreen: LogistrationSourceScreen ) { self.interactor = interactor self.router = router self.config = config self.analytics = analytics self.validator = validator + self.sourceScreen = sourceScreen } var socialAuthEnabled: Bool { @@ -77,7 +81,7 @@ public class SignInViewModel: ObservableObject { let user = try await interactor.login(username: username, password: password) analytics.setUserID("\(user.id)") analytics.userLogin(method: .password) - router.showMainOrWhatsNewScreen() + router.showMainOrWhatsNewScreen(sourceScreen: sourceScreen) } catch let error { failure(error) } @@ -108,7 +112,7 @@ public class SignInViewModel: ObservableObject { let user = try await interactor.login(externalToken: externalToken, backend: backend) analytics.setUserID("\(user.id)") analytics.userLogin(method: authMethod) - router.showMainOrWhatsNewScreen() + router.showMainOrWhatsNewScreen(sourceScreen: sourceScreen) } catch let error { failure(error, authMethod: authMethod) } @@ -138,10 +142,6 @@ public class SignInViewModel: ObservableObject { } } - func trackSignUpClicked() { - analytics.signUpClicked() - } - func trackForgotPasswordClicked() { analytics.forgotPasswordClicked() } diff --git a/Authorization/Authorization/Presentation/Registration/SignUpView.swift b/Authorization/Authorization/Presentation/Registration/SignUpView.swift index 13320ee9b..17986ec7e 100644 --- a/Authorization/Authorization/Presentation/Registration/SignUpView.swift +++ b/Authorization/Authorization/Presentation/Registration/SignUpView.swift @@ -38,7 +38,7 @@ public struct SignUpView: View { VStack(alignment: .center) { ZStack { HStack { - Text(AuthLocalization.SignIn.registerBtn) + Text(CoreLocalization.SignIn.registerBtn) .titleSettings(color: Theme.Colors.white) } VStack { @@ -177,7 +177,8 @@ struct SignUpView_Previews: PreviewProvider { analytics: AuthorizationAnalyticsMock(), config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: Validator() + validator: Validator(), + sourceScreen: .default ) SignUpView(viewModel: vm) diff --git a/Authorization/Authorization/Presentation/Registration/SignUpViewModel.swift b/Authorization/Authorization/Presentation/Registration/SignUpViewModel.swift index 927651b7d..760f836dd 100644 --- a/Authorization/Authorization/Presentation/Registration/SignUpViewModel.swift +++ b/Authorization/Authorization/Presentation/Registration/SignUpViewModel.swift @@ -19,6 +19,8 @@ public class SignUpViewModel: ObservableObject { @Published var scrollTo: Int? @Published var showError: Bool = false @Published var thirdPartyAuthSuccess: Bool = false + let sourceScreen: LogistrationSourceScreen + var errorMessage: String? { didSet { withAnimation { @@ -43,7 +45,8 @@ public class SignUpViewModel: ObservableObject { analytics: AuthorizationAnalytics, config: ConfigProtocol, cssInjector: CSSInjector, - validator: Validator + validator: Validator, + sourceScreen: LogistrationSourceScreen ) { self.interactor = interactor self.router = router @@ -51,6 +54,7 @@ public class SignUpViewModel: ObservableObject { self.config = config self.cssInjector = cssInjector self.validator = validator + self.sourceScreen = sourceScreen } var socialAuthEnabled: Bool { @@ -114,7 +118,7 @@ public class SignUpViewModel: ObservableObject { analytics.setUserID("\(user.id)") analytics.registrationSuccess() isShowProgress = false - router.showMainOrWhatsNewScreen() + router.showMainOrWhatsNewScreen(sourceScreen: sourceScreen) } catch let error { isShowProgress = false @@ -171,7 +175,7 @@ public class SignUpViewModel: ObservableObject { analytics.setUserID("\(user.id)") analytics.userLogin(method: authMethod) isShowProgress = false - router.showMainOrWhatsNewScreen() + router.showMainOrWhatsNewScreen(sourceScreen: sourceScreen) } catch { update(fullName: response.name, email: response.email) self.externalToken = response.token diff --git a/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift b/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift index acb2a6df3..84703fa5d 100644 --- a/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift +++ b/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift @@ -61,7 +61,7 @@ public struct ResetPasswordView: View { .multilineTextAlignment(.center) .foregroundColor(Theme.Colors.textPrimary) .padding(.bottom, 20) - StyledButton(AuthLocalization.SignIn.logInBtn) { + StyledButton(CoreLocalization.SignIn.logInBtn) { viewModel.router.backToRoot(animated: true) } .padding(.top, 30) diff --git a/Authorization/Authorization/Presentation/Startup/StartupView.swift b/Authorization/Authorization/Presentation/Startup/StartupView.swift index 8cfc50347..c3605d1a6 100644 --- a/Authorization/Authorization/Presentation/Startup/StartupView.swift +++ b/Authorization/Authorization/Presentation/Startup/StartupView.swift @@ -53,7 +53,10 @@ public struct StartupView: View { .padding(.top, 1) TextField(AuthLocalization.Startup.searchPlaceholder, text: $searchQuery, onCommit: { if searchQuery.isEmpty { return } - viewModel.router.showDiscoveryScreen(searchQuery: searchQuery, fromStartupScreen: true) + viewModel.router.showDiscoveryScreen( + searchQuery: searchQuery, + sourceScreen: .startup + ) }) .autocapitalization(.none) .autocorrectionDisabled() @@ -71,7 +74,10 @@ public struct StartupView: View { ) Button { - viewModel.router.showDiscoveryScreen(searchQuery: searchQuery, fromStartupScreen: true) + viewModel.router.showDiscoveryScreen ( + searchQuery: searchQuery, + sourceScreen: .startup + ) } label: { Text(AuthLocalization.Startup.exploreAllCourses) .underline() @@ -83,7 +89,14 @@ public struct StartupView: View { } .padding(.horizontal, isHorizontal ? 10 : 24) - LogistrationBottomView(viewModel: viewModel) + LogistrationBottomView { buttonAction in + switch buttonAction { + case .signIn: + viewModel.router.showLoginScreen(sourceScreen: .startup) + case .register: + viewModel.router.showRegisterScreen(sourceScreen: .startup) + } + } } .padding(.top, 10) .padding(.bottom, 2) @@ -106,9 +119,7 @@ public struct StartupView: View { struct StartupView_Previews: PreviewProvider { static var previews: some View { let vm = StartupViewModel( - interactor: AuthInteractor.mock, - router: AuthorizationRouterMock(), - analytics: AuthorizationAnalyticsMock() + router: AuthorizationRouterMock() ) StartupView(viewModel: vm) diff --git a/Authorization/Authorization/Presentation/Startup/StartupViewModel.swift b/Authorization/Authorization/Presentation/Startup/StartupViewModel.swift index 1a13aaea9..1549940a1 100644 --- a/Authorization/Authorization/Presentation/Startup/StartupViewModel.swift +++ b/Authorization/Authorization/Presentation/Startup/StartupViewModel.swift @@ -10,21 +10,11 @@ import Core public class StartupViewModel: ObservableObject { let router: AuthorizationRouter - private let interactor: AuthInteractorProtocol - private let analytics: AuthorizationAnalytics @Published var searchQuery: String? public init( - interactor: AuthInteractorProtocol, - router: AuthorizationRouter, - analytics: AuthorizationAnalytics + router: AuthorizationRouter ) { - self.interactor = interactor self.router = router - self.analytics = analytics - } - - func tracksignUpClicked() { - analytics.signUpClicked() } } diff --git a/Authorization/Authorization/SwiftGen/Strings.swift b/Authorization/Authorization/SwiftGen/Strings.swift index a2cd9accf..64e6e1123 100644 --- a/Authorization/Authorization/SwiftGen/Strings.swift +++ b/Authorization/Authorization/SwiftGen/Strings.swift @@ -57,8 +57,6 @@ public enum AuthLocalization { public static let emailOrUsername = AuthLocalization.tr("Localizable", "SIGN_IN.EMAIL_OR_USERNAME", fallback: "Email or username") /// Forgot password? public static let forgotPassBtn = AuthLocalization.tr("Localizable", "SIGN_IN.FORGOT_PASS_BTN", fallback: "Forgot password?") - /// Sign in - public static let logInBtn = AuthLocalization.tr("Localizable", "SIGN_IN.LOG_IN_BTN", fallback: "Sign in") /// Localizable.strings /// Authorization /// @@ -66,8 +64,6 @@ public enum AuthLocalization { public static let logInTitle = AuthLocalization.tr("Localizable", "SIGN_IN.LOG_IN_TITLE", fallback: "Sign in") /// Password public static let password = AuthLocalization.tr("Localizable", "SIGN_IN.PASSWORD", fallback: "Password") - /// Register - public static let registerBtn = AuthLocalization.tr("Localizable", "SIGN_IN.REGISTER_BTN", fallback: "Register") /// Welcome back! Please authorize to continue. public static let welcomeBack = AuthLocalization.tr("Localizable", "SIGN_IN.WELCOME_BACK", fallback: "Welcome back! Please authorize to continue.") } diff --git a/Authorization/Authorization/en.lproj/Localizable.strings b/Authorization/Authorization/en.lproj/Localizable.strings index 50807ea57..239ce33cb 100644 --- a/Authorization/Authorization/en.lproj/Localizable.strings +++ b/Authorization/Authorization/en.lproj/Localizable.strings @@ -11,9 +11,7 @@ "SIGN_IN.EMAIL" = "Email"; "SIGN_IN.EMAIL_OR_USERNAME" = "Email or username"; "SIGN_IN.PASSWORD" = "Password"; -"SIGN_IN.REGISTER_BTN" = "Register"; "SIGN_IN.FORGOT_PASS_BTN" = "Forgot password?"; -"SIGN_IN.LOG_IN_BTN" = "Sign in"; "ERROR.INVALID_EMAIL_ADDRESS" = "Invalid email address"; "ERROR.INVALID_PASSWORD_LENGHT" = "Invalid password lenght"; diff --git a/Authorization/Authorization/uk.lproj/Localizable.strings b/Authorization/Authorization/uk.lproj/Localizable.strings index 5cbcbb2d8..02dd21fbf 100644 --- a/Authorization/Authorization/uk.lproj/Localizable.strings +++ b/Authorization/Authorization/uk.lproj/Localizable.strings @@ -10,9 +10,7 @@ "SIGN_IN.WELCOME_BACK" = "З поверненням! Авторизуйтесь, щоб продовжити."; "SIGN_IN.EMAIL" = "Пошта"; "SIGN_IN.PASSWORD" = "Пароль"; -"SIGN_IN.REGISTER_BTN" = "Реєстрація"; "SIGN_IN.FORGOT_PASS_BTN" = "Забули пароль?"; -"SIGN_IN.LOG_IN_BTN" = "Увійти"; "ERROR.INVALID_EMAIL_ADDRESS" = "невірна адреса електронної пошти"; "ERROR.INVALID_PASSWORD_LENGHT" = "Пароль занадто короткий або занадто довгий"; diff --git a/Authorization/AuthorizationTests/AuthorizationMock.generated.swift b/Authorization/AuthorizationTests/AuthorizationMock.generated.swift index d6a968438..c2bca8452 100644 --- a/Authorization/AuthorizationTests/AuthorizationMock.generated.swift +++ b/Authorization/AuthorizationTests/AuthorizationMock.generated.swift @@ -816,10 +816,10 @@ open class AuthorizationRouterMock: AuthorizationRouter, Mock { perform?(`controllers`) } - open func showMainOrWhatsNewScreen() { - addInvocation(.m_showMainOrWhatsNewScreen) - let perform = methodPerformValue(.m_showMainOrWhatsNewScreen) as? () -> Void - perform?() + open func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showStartupScreen() { @@ -828,16 +828,16 @@ open class AuthorizationRouterMock: AuthorizationRouter, Mock { perform?() } - open func showLoginScreen() { - addInvocation(.m_showLoginScreen) - let perform = methodPerformValue(.m_showLoginScreen) as? () -> Void - perform?() + open func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } - open func showRegisterScreen() { - addInvocation(.m_showRegisterScreen) - let perform = methodPerformValue(.m_showRegisterScreen) as? () -> Void - perform?() + open func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showForgotPasswordScreen() { @@ -846,10 +846,10 @@ open class AuthorizationRouterMock: AuthorizationRouter, Mock { perform?() } - open func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) { - addInvocation(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) - let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) as? (String?, Bool) -> Void - perform?(`searchQuery`, `fromStartupScreen`) + open func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) as? (String?, LogistrationSourceScreen) -> Void + perform?(`searchQuery`, `sourceScreen`) } open func presentAlert(alertTitle: String, alertMessage: String, positiveAction: String, onCloseTapped: @escaping () -> Void, okTapped: @escaping () -> Void, type: AlertViewType) { @@ -884,12 +884,12 @@ open class AuthorizationRouterMock: AuthorizationRouter, Mock { case m_backWithFade case m_dismiss__animated_animated(Parameter) case m_removeLastView__controllers_controllers(Parameter) - case m_showMainOrWhatsNewScreen + case m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter) case m_showStartupScreen - case m_showLoginScreen - case m_showRegisterScreen + case m_showLoginScreen__sourceScreen_sourceScreen(Parameter) + case m_showRegisterScreen__sourceScreen_sourceScreen(Parameter) case m_showForgotPasswordScreen - case m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter, Parameter) + case m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(Parameter, Parameter, Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter<() -> Void>) case m_presentView__transitionStyle_transitionStyleview_view(Parameter, Parameter) @@ -924,20 +924,29 @@ open class AuthorizationRouterMock: AuthorizationRouter, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsControllers, rhs: rhsControllers, with: matcher), lhsControllers, rhsControllers, "controllers")) return Matcher.ComparisonResult(results) - case (.m_showMainOrWhatsNewScreen, .m_showMainOrWhatsNewScreen): return .match + case (.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showStartupScreen, .m_showStartupScreen): return .match - case (.m_showLoginScreen, .m_showLoginScreen): return .match + case (.m_showLoginScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showLoginScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) - case (.m_showRegisterScreen, .m_showRegisterScreen): return .match + case (.m_showRegisterScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showRegisterScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showForgotPasswordScreen, .m_showForgotPasswordScreen): return .match - case (.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let lhsSearchquery, let lhsFromstartupscreen), .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let rhsSearchquery, let rhsFromstartupscreen)): + case (.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let lhsSearchquery, let lhsSourcescreen), .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let rhsSearchquery, let rhsSourcescreen)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSearchquery, rhs: rhsSearchquery, with: matcher), lhsSearchquery, rhsSearchquery, "searchQuery")) - results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFromstartupscreen, rhs: rhsFromstartupscreen, with: matcher), lhsFromstartupscreen, rhsFromstartupscreen, "fromStartupScreen")) + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) return Matcher.ComparisonResult(results) case (.m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let lhsAlerttitle, let lhsAlertmessage, let lhsPositiveaction, let lhsOnclosetapped, let lhsOktapped, let lhsType), .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let rhsAlerttitle, let rhsAlertmessage, let rhsPositiveaction, let rhsOnclosetapped, let rhsOktapped, let rhsType)): @@ -985,12 +994,12 @@ open class AuthorizationRouterMock: AuthorizationRouter, Mock { case .m_backWithFade: return 0 case let .m_dismiss__animated_animated(p0): return p0.intValue case let .m_removeLastView__controllers_controllers(p0): return p0.intValue - case .m_showMainOrWhatsNewScreen: return 0 + case let .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showStartupScreen: return 0 - case .m_showLoginScreen: return 0 - case .m_showRegisterScreen: return 0 + case let .m_showLoginScreen__sourceScreen_sourceScreen(p0): return p0.intValue + case let .m_showRegisterScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showForgotPasswordScreen: return 0 - case let .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(p0, p1): return p0.intValue + p1.intValue + case let .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(p0, p1): return p0.intValue + p1.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(p0, p1, p2, p3, p4, p5): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(p0, p1, p2, p3, p4, p5, p6, p7): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue + p6.intValue + p7.intValue case let .m_presentView__transitionStyle_transitionStyleview_view(p0, p1): return p0.intValue + p1.intValue @@ -1005,12 +1014,12 @@ open class AuthorizationRouterMock: AuthorizationRouter, Mock { case .m_backWithFade: return ".backWithFade()" case .m_dismiss__animated_animated: return ".dismiss(animated:)" case .m_removeLastView__controllers_controllers: return ".removeLastView(controllers:)" - case .m_showMainOrWhatsNewScreen: return ".showMainOrWhatsNewScreen()" + case .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen: return ".showMainOrWhatsNewScreen(sourceScreen:)" case .m_showStartupScreen: return ".showStartupScreen()" - case .m_showLoginScreen: return ".showLoginScreen()" - case .m_showRegisterScreen: return ".showRegisterScreen()" + case .m_showLoginScreen__sourceScreen_sourceScreen: return ".showLoginScreen(sourceScreen:)" + case .m_showRegisterScreen__sourceScreen_sourceScreen: return ".showRegisterScreen(sourceScreen:)" case .m_showForgotPasswordScreen: return ".showForgotPasswordScreen()" - case .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen: return ".showDiscoveryScreen(searchQuery:fromStartupScreen:)" + case .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen: return ".showDiscoveryScreen(searchQuery:sourceScreen:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type: return ".presentAlert(alertTitle:alertMessage:positiveAction:onCloseTapped:okTapped:type:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped: return ".presentAlert(alertTitle:alertMessage:nextSectionName:action:image:onCloseTapped:okTapped:nextSectionTapped:)" case .m_presentView__transitionStyle_transitionStyleview_view: return ".presentView(transitionStyle:view:)" @@ -1039,12 +1048,12 @@ open class AuthorizationRouterMock: AuthorizationRouter, Mock { public static func backWithFade() -> Verify { return Verify(method: .m_backWithFade)} public static func dismiss(animated: Parameter) -> Verify { return Verify(method: .m_dismiss__animated_animated(`animated`))} public static func removeLastView(controllers: Parameter) -> Verify { return Verify(method: .m_removeLastView__controllers_controllers(`controllers`))} - public static func showMainOrWhatsNewScreen() -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen)} + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showStartupScreen() -> Verify { return Verify(method: .m_showStartupScreen)} - public static func showLoginScreen() -> Verify { return Verify(method: .m_showLoginScreen)} - public static func showRegisterScreen() -> Verify { return Verify(method: .m_showRegisterScreen)} + public static func showLoginScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`))} + public static func showRegisterScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showForgotPasswordScreen() -> Verify { return Verify(method: .m_showForgotPasswordScreen)} - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`))} + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, nextSectionName: Parameter, action: Parameter, image: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, nextSectionTapped: Parameter<() -> Void>) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(`alertTitle`, `alertMessage`, `nextSectionName`, `action`, `image`, `onCloseTapped`, `okTapped`, `nextSectionTapped`))} public static func presentView(transitionStyle: Parameter, view: Parameter) -> Verify { return Verify(method: .m_presentView__transitionStyle_transitionStyleview_view(`transitionStyle`, `view`))} @@ -1073,23 +1082,23 @@ open class AuthorizationRouterMock: AuthorizationRouter, Mock { public static func removeLastView(controllers: Parameter, perform: @escaping (Int) -> Void) -> Perform { return Perform(method: .m_removeLastView__controllers_controllers(`controllers`), performs: perform) } - public static func showMainOrWhatsNewScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showMainOrWhatsNewScreen, performs: perform) + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showStartupScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showStartupScreen, performs: perform) } - public static func showLoginScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showLoginScreen, performs: perform) + public static func showLoginScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } - public static func showRegisterScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showRegisterScreen, performs: perform) + public static func showRegisterScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showForgotPasswordScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showForgotPasswordScreen, performs: perform) } - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter, perform: @escaping (String?, Bool) -> Void) -> Perform { - return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`), performs: perform) + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter, perform: @escaping (String?, LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`), performs: perform) } public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter, perform: @escaping (String, String, String, @escaping () -> Void, @escaping () -> Void, AlertViewType) -> Void) -> Perform { return Perform(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`), performs: perform) @@ -1252,10 +1261,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?(`controllers`) } - open func showMainOrWhatsNewScreen() { - addInvocation(.m_showMainOrWhatsNewScreen) - let perform = methodPerformValue(.m_showMainOrWhatsNewScreen) as? () -> Void - perform?() + open func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showStartupScreen() { @@ -1264,16 +1273,16 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showLoginScreen() { - addInvocation(.m_showLoginScreen) - let perform = methodPerformValue(.m_showLoginScreen) as? () -> Void - perform?() + open func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } - open func showRegisterScreen() { - addInvocation(.m_showRegisterScreen) - let perform = methodPerformValue(.m_showRegisterScreen) as? () -> Void - perform?() + open func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showForgotPasswordScreen() { @@ -1282,10 +1291,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) { - addInvocation(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) - let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) as? (String?, Bool) -> Void - perform?(`searchQuery`, `fromStartupScreen`) + open func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) as? (String?, LogistrationSourceScreen) -> Void + perform?(`searchQuery`, `sourceScreen`) } open func presentAlert(alertTitle: String, alertMessage: String, positiveAction: String, onCloseTapped: @escaping () -> Void, okTapped: @escaping () -> Void, type: AlertViewType) { @@ -1319,12 +1328,12 @@ open class BaseRouterMock: BaseRouter, Mock { case m_backWithFade case m_dismiss__animated_animated(Parameter) case m_removeLastView__controllers_controllers(Parameter) - case m_showMainOrWhatsNewScreen + case m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter) case m_showStartupScreen - case m_showLoginScreen - case m_showRegisterScreen + case m_showLoginScreen__sourceScreen_sourceScreen(Parameter) + case m_showRegisterScreen__sourceScreen_sourceScreen(Parameter) case m_showForgotPasswordScreen - case m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter, Parameter) + case m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(Parameter, Parameter, Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter<() -> Void>) case m_presentView__transitionStyle_transitionStyleview_view(Parameter, Parameter) @@ -1354,20 +1363,29 @@ open class BaseRouterMock: BaseRouter, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsControllers, rhs: rhsControllers, with: matcher), lhsControllers, rhsControllers, "controllers")) return Matcher.ComparisonResult(results) - case (.m_showMainOrWhatsNewScreen, .m_showMainOrWhatsNewScreen): return .match + case (.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showStartupScreen, .m_showStartupScreen): return .match - case (.m_showLoginScreen, .m_showLoginScreen): return .match + case (.m_showLoginScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showLoginScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) - case (.m_showRegisterScreen, .m_showRegisterScreen): return .match + case (.m_showRegisterScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showRegisterScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showForgotPasswordScreen, .m_showForgotPasswordScreen): return .match - case (.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let lhsSearchquery, let lhsFromstartupscreen), .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let rhsSearchquery, let rhsFromstartupscreen)): + case (.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let lhsSearchquery, let lhsSourcescreen), .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let rhsSearchquery, let rhsSourcescreen)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSearchquery, rhs: rhsSearchquery, with: matcher), lhsSearchquery, rhsSearchquery, "searchQuery")) - results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFromstartupscreen, rhs: rhsFromstartupscreen, with: matcher), lhsFromstartupscreen, rhsFromstartupscreen, "fromStartupScreen")) + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) return Matcher.ComparisonResult(results) case (.m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let lhsAlerttitle, let lhsAlertmessage, let lhsPositiveaction, let lhsOnclosetapped, let lhsOktapped, let lhsType), .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let rhsAlerttitle, let rhsAlertmessage, let rhsPositiveaction, let rhsOnclosetapped, let rhsOktapped, let rhsType)): @@ -1414,12 +1432,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return 0 case let .m_dismiss__animated_animated(p0): return p0.intValue case let .m_removeLastView__controllers_controllers(p0): return p0.intValue - case .m_showMainOrWhatsNewScreen: return 0 + case let .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showStartupScreen: return 0 - case .m_showLoginScreen: return 0 - case .m_showRegisterScreen: return 0 + case let .m_showLoginScreen__sourceScreen_sourceScreen(p0): return p0.intValue + case let .m_showRegisterScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showForgotPasswordScreen: return 0 - case let .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(p0, p1): return p0.intValue + p1.intValue + case let .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(p0, p1): return p0.intValue + p1.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(p0, p1, p2, p3, p4, p5): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(p0, p1, p2, p3, p4, p5, p6, p7): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue + p6.intValue + p7.intValue case let .m_presentView__transitionStyle_transitionStyleview_view(p0, p1): return p0.intValue + p1.intValue @@ -1433,12 +1451,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return ".backWithFade()" case .m_dismiss__animated_animated: return ".dismiss(animated:)" case .m_removeLastView__controllers_controllers: return ".removeLastView(controllers:)" - case .m_showMainOrWhatsNewScreen: return ".showMainOrWhatsNewScreen()" + case .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen: return ".showMainOrWhatsNewScreen(sourceScreen:)" case .m_showStartupScreen: return ".showStartupScreen()" - case .m_showLoginScreen: return ".showLoginScreen()" - case .m_showRegisterScreen: return ".showRegisterScreen()" + case .m_showLoginScreen__sourceScreen_sourceScreen: return ".showLoginScreen(sourceScreen:)" + case .m_showRegisterScreen__sourceScreen_sourceScreen: return ".showRegisterScreen(sourceScreen:)" case .m_showForgotPasswordScreen: return ".showForgotPasswordScreen()" - case .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen: return ".showDiscoveryScreen(searchQuery:fromStartupScreen:)" + case .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen: return ".showDiscoveryScreen(searchQuery:sourceScreen:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type: return ".presentAlert(alertTitle:alertMessage:positiveAction:onCloseTapped:okTapped:type:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped: return ".presentAlert(alertTitle:alertMessage:nextSectionName:action:image:onCloseTapped:okTapped:nextSectionTapped:)" case .m_presentView__transitionStyle_transitionStyleview_view: return ".presentView(transitionStyle:view:)" @@ -1466,12 +1484,12 @@ open class BaseRouterMock: BaseRouter, Mock { public static func backWithFade() -> Verify { return Verify(method: .m_backWithFade)} public static func dismiss(animated: Parameter) -> Verify { return Verify(method: .m_dismiss__animated_animated(`animated`))} public static func removeLastView(controllers: Parameter) -> Verify { return Verify(method: .m_removeLastView__controllers_controllers(`controllers`))} - public static func showMainOrWhatsNewScreen() -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen)} + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showStartupScreen() -> Verify { return Verify(method: .m_showStartupScreen)} - public static func showLoginScreen() -> Verify { return Verify(method: .m_showLoginScreen)} - public static func showRegisterScreen() -> Verify { return Verify(method: .m_showRegisterScreen)} + public static func showLoginScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`))} + public static func showRegisterScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showForgotPasswordScreen() -> Verify { return Verify(method: .m_showForgotPasswordScreen)} - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`))} + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, nextSectionName: Parameter, action: Parameter, image: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, nextSectionTapped: Parameter<() -> Void>) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(`alertTitle`, `alertMessage`, `nextSectionName`, `action`, `image`, `onCloseTapped`, `okTapped`, `nextSectionTapped`))} public static func presentView(transitionStyle: Parameter, view: Parameter) -> Verify { return Verify(method: .m_presentView__transitionStyle_transitionStyleview_view(`transitionStyle`, `view`))} @@ -1497,23 +1515,23 @@ open class BaseRouterMock: BaseRouter, Mock { public static func removeLastView(controllers: Parameter, perform: @escaping (Int) -> Void) -> Perform { return Perform(method: .m_removeLastView__controllers_controllers(`controllers`), performs: perform) } - public static func showMainOrWhatsNewScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showMainOrWhatsNewScreen, performs: perform) + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showStartupScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showStartupScreen, performs: perform) } - public static func showLoginScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showLoginScreen, performs: perform) + public static func showLoginScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } - public static func showRegisterScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showRegisterScreen, performs: perform) + public static func showRegisterScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showForgotPasswordScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showForgotPasswordScreen, performs: perform) } - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter, perform: @escaping (String?, Bool) -> Void) -> Perform { - return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`), performs: perform) + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter, perform: @escaping (String?, LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`), performs: perform) } public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter, perform: @escaping (String, String, String, @escaping () -> Void, @escaping () -> Void, AlertViewType) -> Void) -> Perform { return Perform(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`), performs: perform) diff --git a/Authorization/AuthorizationTests/Presentation/Login/SignInViewModelTests.swift b/Authorization/AuthorizationTests/Presentation/Login/SignInViewModelTests.swift index 484807136..e824ad975 100644 --- a/Authorization/AuthorizationTests/Presentation/Login/SignInViewModelTests.swift +++ b/Authorization/AuthorizationTests/Presentation/Login/SignInViewModelTests.swift @@ -32,13 +32,14 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) await viewModel.login(username: "", password: "") Verify(interactor, 0, .login(username: .any, password: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.errorMessage, AuthLocalization.Error.invalidEmailAddressOrUsername) XCTAssertEqual(viewModel.isShowProgress, false) @@ -54,12 +55,13 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) await viewModel.login(username: "edxUser@edx.com", password: "") Verify(interactor, 0, .login(username: .any, password: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.errorMessage, AuthLocalization.Error.invalidPasswordLenght) XCTAssertEqual(viewModel.isShowProgress, false) @@ -75,7 +77,8 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) let user = User(id: 1, username: "username", email: "edxUser@edx.com", name: "Name", userAvatar: "") @@ -85,7 +88,7 @@ final class SignInViewModelTests: XCTestCase { Verify(interactor, 1, .login(username: .any, password: .any)) Verify(analytics, .userLogin(method: .any)) - Verify(router, 1, .showMainOrWhatsNewScreen()) + Verify(router, 1, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.errorMessage, nil) XCTAssertEqual(viewModel.isShowProgress, true) @@ -101,7 +104,8 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) let result: Result = .success(.apple( @@ -115,7 +119,7 @@ final class SignInViewModelTests: XCTestCase { Verify(interactor, 1, .login(externalToken: .any, backend: .any)) Verify(analytics, .userLogin(method: .any)) - Verify(router, 1, .showMainOrWhatsNewScreen()) + Verify(router, 1, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.errorMessage, nil) XCTAssertEqual(viewModel.isShowProgress, true) @@ -131,7 +135,8 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) let result: Result = .success( @@ -149,7 +154,7 @@ final class SignInViewModelTests: XCTestCase { await viewModel.login(with: result) Verify(interactor, 1, .login(externalToken: .any, backend: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.errorMessage, validationErrorMessage) XCTAssertEqual(viewModel.isShowProgress, false) @@ -165,7 +170,8 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) let validationErrorMessage = "Some error" @@ -177,7 +183,7 @@ final class SignInViewModelTests: XCTestCase { await viewModel.login(username: "edxUser@edx.com", password: "password123") Verify(interactor, 1, .login(username: .any, password: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.errorMessage, validationErrorMessage) XCTAssertEqual(viewModel.isShowProgress, false) @@ -193,7 +199,8 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) Given(interactor, .login(username: .any, password: .any, willThrow: APIError.invalidGrant)) @@ -201,7 +208,7 @@ final class SignInViewModelTests: XCTestCase { await viewModel.login(username: "edxUser@edx.com", password: "password123") Verify(interactor, 1, .login(username: .any, password: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.errorMessage, CoreLocalization.Error.invalidCredentials) XCTAssertEqual(viewModel.isShowProgress, false) @@ -217,7 +224,8 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) Given(interactor, .login(username: .any, password: .any, willThrow: NSError())) @@ -225,7 +233,7 @@ final class SignInViewModelTests: XCTestCase { await viewModel.login(username: "edxUser@edx.com", password: "password123") Verify(interactor, 1, .login(username: .any, password: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.errorMessage, CoreLocalization.Error.unknownError) XCTAssertEqual(viewModel.isShowProgress, false) @@ -241,7 +249,8 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) let noInternetError = AFError.sessionInvalidated(error: URLError(.notConnectedToInternet)) @@ -251,30 +260,12 @@ final class SignInViewModelTests: XCTestCase { await viewModel.login(username: "edxUser@edx.com", password: "password123") Verify(interactor, 1, .login(username: .any, password: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.errorMessage, CoreLocalization.Error.slowOrNoInternetConnection) XCTAssertEqual(viewModel.isShowProgress, false) } - func testTrackSignUpClicked() { - let interactor = AuthInteractorProtocolMock() - let router = AuthorizationRouterMock() - let validator = Validator() - let analytics = AuthorizationAnalyticsMock() - let viewModel = SignInViewModel( - interactor: interactor, - router: router, - config: ConfigMock(), - analytics: analytics, - validator: validator - ) - - viewModel.trackSignUpClicked() - - Verify(analytics, 1, .signUpClicked()) - } - func testTrackForgotPasswordClicked() { let interactor = AuthInteractorProtocolMock() let router = AuthorizationRouterMock() @@ -285,7 +276,8 @@ final class SignInViewModelTests: XCTestCase { router: router, config: ConfigMock(), analytics: analytics, - validator: validator + validator: validator, + sourceScreen: .default ) viewModel.trackForgotPasswordClicked() diff --git a/Authorization/AuthorizationTests/Presentation/Register/SignUpViewModelTests.swift b/Authorization/AuthorizationTests/Presentation/Register/SignUpViewModelTests.swift index 77f9ad85e..ad180a925 100644 --- a/Authorization/AuthorizationTests/Presentation/Register/SignUpViewModelTests.swift +++ b/Authorization/AuthorizationTests/Presentation/Register/SignUpViewModelTests.swift @@ -33,7 +33,8 @@ final class SignUpViewModelTests: XCTestCase { analytics: analytics, config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: validator + validator: validator, + sourceScreen: .default ) let fields = [ @@ -64,7 +65,8 @@ final class SignUpViewModelTests: XCTestCase { analytics: analytics, config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: validator + validator: validator, + sourceScreen: .default ) let noInternetError = AFError.sessionInvalidated(error: URLError(.notConnectedToInternet)) @@ -90,7 +92,8 @@ final class SignUpViewModelTests: XCTestCase { analytics: analytics, config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: validator + validator: validator, + sourceScreen: .default ) Given(interactor, .getRegistrationFields(willThrow: NSError())) @@ -114,7 +117,8 @@ final class SignUpViewModelTests: XCTestCase { analytics: analytics, config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: validator + validator: validator, + sourceScreen: .default ) Given(interactor, .registerUser(fields: .any, isSocial: .any, willReturn: .init(id: 1, @@ -128,7 +132,7 @@ final class SignUpViewModelTests: XCTestCase { Verify(interactor, 1, .validateRegistrationFields(fields: .any)) Verify(interactor, 1, .registerUser(fields: .any, isSocial: .any)) - Verify(router, 1, .showMainOrWhatsNewScreen()) + Verify(router, 1, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.isShowProgress, false) XCTAssertEqual(viewModel.showError, false) @@ -145,7 +149,8 @@ final class SignUpViewModelTests: XCTestCase { analytics: analytics, config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: validator + validator: validator, + sourceScreen: .default ) viewModel.fields = [ @@ -164,7 +169,7 @@ final class SignUpViewModelTests: XCTestCase { Verify(interactor, 1, .validateRegistrationFields(fields: .any)) Verify(interactor, 0, .registerUser(fields: .any, isSocial: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.isShowProgress, false) XCTAssertEqual(viewModel.showError, false) @@ -182,7 +187,8 @@ final class SignUpViewModelTests: XCTestCase { analytics: analytics, config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: validator + validator: validator, + sourceScreen: .default ) Given(interactor, .validateRegistrationFields(fields: .any, willReturn: [:])) @@ -192,7 +198,7 @@ final class SignUpViewModelTests: XCTestCase { Verify(interactor, 1, .validateRegistrationFields(fields: .any)) Verify(interactor, 1, .registerUser(fields: .any, isSocial: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.isShowProgress, false) XCTAssertEqual(viewModel.showError, true) @@ -210,7 +216,8 @@ final class SignUpViewModelTests: XCTestCase { analytics: analytics, config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: validator + validator: validator, + sourceScreen: .default ) Given(interactor, .validateRegistrationFields(fields: .any, willReturn: [:])) @@ -220,7 +227,7 @@ final class SignUpViewModelTests: XCTestCase { Verify(interactor, 1, .validateRegistrationFields(fields: .any)) Verify(interactor, 1, .registerUser(fields: .any, isSocial: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.isShowProgress, false) XCTAssertEqual(viewModel.showError, true) @@ -238,7 +245,8 @@ final class SignUpViewModelTests: XCTestCase { analytics: analytics, config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: validator + validator: validator, + sourceScreen: .default ) let noInternetError = AFError.sessionInvalidated(error: URLError(.notConnectedToInternet)) @@ -250,7 +258,7 @@ final class SignUpViewModelTests: XCTestCase { Verify(interactor, 1, .validateRegistrationFields(fields: .any)) Verify(interactor, 1, .registerUser(fields: .any, isSocial: .any)) - Verify(router, 0, .showMainOrWhatsNewScreen()) + Verify(router, 0, .showMainOrWhatsNewScreen(sourceScreen: .any)) XCTAssertEqual(viewModel.isShowProgress, false) XCTAssertEqual(viewModel.showError, true) @@ -268,7 +276,8 @@ final class SignUpViewModelTests: XCTestCase { analytics: analytics, config: ConfigMock(), cssInjector: CSSInjectorMock(), - validator: validator + validator: validator, + sourceScreen: .default ) viewModel.trackCreateAccountClicked() diff --git a/Core/Core.xcodeproj/project.pbxproj b/Core/Core.xcodeproj/project.pbxproj index e178689ba..d784a64f4 100644 --- a/Core/Core.xcodeproj/project.pbxproj +++ b/Core/Core.xcodeproj/project.pbxproj @@ -130,6 +130,8 @@ BA8FA66C2AD59BBC00EA029A /* GoogleSignIn in Frameworks */ = {isa = PBXBuildFile; productRef = BA8FA66B2AD59BBC00EA029A /* GoogleSignIn */; }; BA8FA66E2AD59E7D00EA029A /* FacebookAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8FA66D2AD59E7D00EA029A /* FacebookAuthProvider.swift */; }; BA8FA6702AD59EA300EA029A /* MicrosoftAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8FA66F2AD59EA300EA029A /* MicrosoftAuthProvider.swift */; }; + BAAD62C62AFCF00B000E6103 /* CustomDisclosureGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAAD62C52AFCF00B000E6103 /* CustomDisclosureGroup.swift */; }; + BAD9CA422B2B140100DE790A /* AgreementConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAD9CA412B2B140100DE790A /* AgreementConfigTests.swift */; }; BADB3F5B2AD6EC56004D5CFA /* ResultExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BADB3F5A2AD6EC56004D5CFA /* ResultExtension.swift */; }; BAF0D4CB2AD6AE14007AC334 /* FacebookLogin in Frameworks */ = {isa = PBXBuildFile; productRef = BAF0D4CA2AD6AE14007AC334 /* FacebookLogin */; }; BAFB99822B0E2354007D09F9 /* FacebookConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAFB99812B0E2354007D09F9 /* FacebookConfig.swift */; }; @@ -144,6 +146,7 @@ E055A5392B18DC95008D9E5E /* Theme.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E055A5382B18DC95008D9E5E /* Theme.framework */; }; E055A53A2B18DC95008D9E5E /* Theme.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E055A5382B18DC95008D9E5E /* Theme.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; E09179FD2B0F204E002AB695 /* ConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E09179FC2B0F204D002AB695 /* ConfigTests.swift */; }; + E0D586362B314CD3009B4BA7 /* LogistrationBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0D586352B314CD3009B4BA7 /* LogistrationBottomView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -302,6 +305,8 @@ BA8FA6692AD59B5500EA029A /* GoogleAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleAuthProvider.swift; sourceTree = ""; }; BA8FA66D2AD59E7D00EA029A /* FacebookAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FacebookAuthProvider.swift; sourceTree = ""; }; BA8FA66F2AD59EA300EA029A /* MicrosoftAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MicrosoftAuthProvider.swift; sourceTree = ""; }; + BAAD62C52AFCF00B000E6103 /* CustomDisclosureGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomDisclosureGroup.swift; sourceTree = ""; }; + BAD9CA412B2B140100DE790A /* AgreementConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgreementConfigTests.swift; sourceTree = ""; }; BADB3F5A2AD6EC56004D5CFA /* ResultExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResultExtension.swift; sourceTree = ""; }; BAFB99812B0E2354007D09F9 /* FacebookConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FacebookConfig.swift; sourceTree = ""; }; BAFB99832B0E282E007D09F9 /* MicrosoftConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MicrosoftConfig.swift; sourceTree = ""; }; @@ -314,6 +319,7 @@ DBF6F2492B0380E00098414B /* FeaturesConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturesConfig.swift; sourceTree = ""; }; E055A5382B18DC95008D9E5E /* Theme.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Theme.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E09179FC2B0F204D002AB695 /* ConfigTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigTests.swift; sourceTree = ""; }; + E0D586352B314CD3009B4BA7 /* LogistrationBottomView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogistrationBottomView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -608,6 +614,7 @@ 0770DE7728D0C49E006D8A5D /* Base */ = { isa = PBXGroup; children = ( + E0D586352B314CD3009B4BA7 /* LogistrationBottomView.swift */, 02A4833B29B8C57800D33F33 /* DownloadView.swift */, 02D800CB29348F460099CF16 /* ImagePicker.swift */, 024D723429C8BB1A006D36ED /* NavigationBar.swift */, @@ -732,6 +739,7 @@ isa = PBXGroup; children = ( E09179FC2B0F204D002AB695 /* ConfigTests.swift */, + BAD9CA412B2B140100DE790A /* AgreementConfigTests.swift */, ); path = Configuration; sourceTree = ""; @@ -916,6 +924,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + BAD9CA422B2B140100DE790A /* AgreementConfigTests.swift in Sources */, E09179FD2B0F204E002AB695 /* ConfigTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -946,6 +955,7 @@ 02B3E3B32930198600A50475 /* AVPlayerViewControllerExtension.swift in Sources */, 0295C885299B99DD00ABE571 /* RefreshableScrollView.swift in Sources */, 0282DA7328F98CC9003C3F07 /* WebUnitView.swift in Sources */, + E0D586362B314CD3009B4BA7 /* LogistrationBottomView.swift in Sources */, 0727878128D25EFD002E9142 /* SnackBarView.swift in Sources */, 021D924828DC860C00ACC565 /* Data_UserProfile.swift in Sources */, BA593F1C2AF8E498009ADB51 /* ScrollSlidingTabBar.swift in Sources */, diff --git a/Core/Core/Configuration/BaseRouter.swift b/Core/Core/Configuration/BaseRouter.swift index a153aa067..70e5fb008 100644 --- a/Core/Core/Configuration/BaseRouter.swift +++ b/Core/Core/Configuration/BaseRouter.swift @@ -21,17 +21,17 @@ public protocol BaseRouter { func removeLastView(controllers: Int) - func showMainOrWhatsNewScreen() + func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) func showStartupScreen() - func showLoginScreen() + func showLoginScreen(sourceScreen: LogistrationSourceScreen) - func showRegisterScreen() + func showRegisterScreen(sourceScreen: LogistrationSourceScreen) func showForgotPasswordScreen() - func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) + func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) func presentAlert( alertTitle: String, @@ -77,17 +77,17 @@ open class BaseRouterMock: BaseRouter { public func dismiss(animated: Bool) {} - public func showMainOrWhatsNewScreen() {} + public func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) {} public func showStartupScreen() {} - public func showLoginScreen() {} + public func showLoginScreen(sourceScreen: LogistrationSourceScreen) {} - public func showRegisterScreen() {} + public func showRegisterScreen(sourceScreen: LogistrationSourceScreen) {} public func showForgotPasswordScreen() {} - public func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) {} + public func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) {} public func backToRoot(animated: Bool) {} diff --git a/Core/Core/Configuration/Config/AgreementConfig.swift b/Core/Core/Configuration/Config/AgreementConfig.swift index 46059500e..b790f2cca 100644 --- a/Core/Core/Configuration/Config/AgreementConfig.swift +++ b/Core/Core/Configuration/Config/AgreementConfig.swift @@ -10,16 +10,60 @@ import Foundation private enum AgreementKeys: String { case privacyPolicyURL = "PRIVACY_POLICY_URL" case tosURL = "TOS_URL" + case cookiePolicyURL = "COOKIE_POLICY_URL" + case dataSellContentURL = "DATA_SELL_CONSENT_URL" + case supportedLanguages = "SUPPORTED_LANGUAGES" } public class AgreementConfig: NSObject { public var privacyPolicyURL: URL? public var tosURL: URL? - + public var cookiePolicyURL: URL? + public var dataSellContentURL: URL? + public var supportedLanguages: [String]? + init(dictionary: [String: AnyObject]) { - privacyPolicyURL = (dictionary[AgreementKeys.privacyPolicyURL.rawValue] as? String).flatMap(URL.init) - tosURL = (dictionary[AgreementKeys.tosURL.rawValue] as? String).flatMap(URL.init) + supportedLanguages = dictionary[AgreementKeys.supportedLanguages.rawValue] as? [String] + cookiePolicyURL = (dictionary[AgreementKeys.cookiePolicyURL.rawValue] as? String).flatMap(URL.init) + dataSellContentURL = (dictionary[AgreementKeys.dataSellContentURL.rawValue] as? String).flatMap(URL.init) + super.init() + + if let tosURL = dictionary[AgreementKeys.tosURL.rawValue] as? String { + self.tosURL = URL(string: completePath(url: tosURL)) + } + + if let privacyPolicyURL = dictionary[AgreementKeys.privacyPolicyURL.rawValue] as? String { + self.privacyPolicyURL = URL(string: completePath(url: privacyPolicyURL)) + } + } + + private func completePath(url: String) -> String { + let langCode: String + if #available(iOS 16, *) { + langCode = Locale.current.language.languageCode?.identifier ?? "" + } else { + langCode = Locale.current.languageCode ?? "" + } + + if let supportedLanguages = supportedLanguages, + !supportedLanguages.contains(langCode) { + return url + } + + let URL = URL(string: url) + let host = URL?.host ?? "" + let components = url.components(separatedBy: host) + + if components.count != 2 { + return url + } + + if let firstComponent = components.first, let lastComponent = components.last { + return "\(firstComponent)\(host)/\(langCode)\(lastComponent)" + } + + return url } } diff --git a/Core/Core/Configuration/Config/Config.swift b/Core/Core/Configuration/Config/Config.swift index a10438eb6..75c6dc7c4 100644 --- a/Core/Core/Configuration/Config/Config.swift +++ b/Core/Core/Configuration/Config/Config.swift @@ -13,6 +13,7 @@ public protocol ConfigProtocol { var tokenType: TokenType { get } var feedbackEmail: String { get } var appStoreLink: String { get } + var faq: URL? { get } var platformName: String { get } var agreement: AgreementConfig { get } var firebase: FirebaseConfig { get } @@ -38,6 +39,7 @@ private enum ConfigKeys: String { case platformName = "PLATFORM_NAME" case organizationCode = "ORGANIZATION_CODE" case appstoreID = "APP_STORE_ID" + case faq = "FAQ_URL" } public class Config { @@ -137,6 +139,14 @@ extension Config: ConfigProtocol { public var appStoreLink: String { "itms-apps://itunes.apple.com/app/id\(appStoreId)?mt=8" } + + public var faq: URL? { + guard let urlString = string(for: ConfigKeys.faq.rawValue), + let url = URL(string: urlString) else { + return nil + } + return url + } } // Mark - For testing and SwiftUI preview @@ -151,7 +161,10 @@ public class ConfigMock: Config { "WHATS_NEW_ENABLED": false, "AGREEMENT_URLS": [ "PRIVACY_POLICY_URL": "https://www.example.com/privacy", - "TOS_URL": "https://www.example.com/tos" + "TOS_URL": "https://www.example.com/tos", + "DATA_SELL_CONSENT_URL": "https://www.example.com/sell", + "COOKIE_POLICY_URL": "https://www.example.com/cookie", + "SUPPORTED_LANGUAGES": ["es"] ], "GOOGLE": [ "ENABLED": true, diff --git a/Core/Core/SwiftGen/Strings.swift b/Core/Core/SwiftGen/Strings.swift index a7de0a666..5fb863c94 100644 --- a/Core/Core/SwiftGen/Strings.swift +++ b/Core/Core/SwiftGen/Strings.swift @@ -31,8 +31,6 @@ public enum CoreLocalization { public static let backToOutline = CoreLocalization.tr("Localizable", "COURSEWARE.BACK_TO_OUTLINE", fallback: "Back to outline") /// Continue public static let `continue` = CoreLocalization.tr("Localizable", "COURSEWARE.CONTINUE", fallback: "Continue") - /// Continue with: - public static let continueWith = CoreLocalization.tr("Localizable", "COURSEWARE.CONTINUE_WITH", fallback: "Continue with:") /// Course content public static let courseContent = CoreLocalization.tr("Localizable", "COURSEWARE.COURSE_CONTENT", fallback: "Course content") /// Course units @@ -55,6 +53,8 @@ public enum CoreLocalization { public static let previous = CoreLocalization.tr("Localizable", "COURSEWARE.PREVIOUS", fallback: "Prev") /// Resume public static let resume = CoreLocalization.tr("Localizable", "COURSEWARE.RESUME", fallback: "Resume") + /// Resume with: + public static let resumeWith = CoreLocalization.tr("Localizable", "COURSEWARE.RESUME_WITH", fallback: "Resume with:") /// Section “ public static let section = CoreLocalization.tr("Localizable", "COURSEWARE.SECTION", fallback: "Section “") } @@ -177,6 +177,12 @@ public enum CoreLocalization { public static let title = CoreLocalization.tr("Localizable", "REVIEW.EMAIL.TITLE", fallback: "Select email client:") } } + public enum SignIn { + /// Sign in + public static let logInBtn = CoreLocalization.tr("Localizable", "SIGN_IN.LOG_IN_BTN", fallback: "Sign in") + /// Register + public static let registerBtn = CoreLocalization.tr("Localizable", "SIGN_IN.REGISTER_BTN", fallback: "Register") + } public enum View { public enum Snackbar { /// Try Again diff --git a/Authorization/Authorization/Presentation/Startup/LogistrationBottomView.swift b/Core/Core/View/Base/LogistrationBottomView.swift similarity index 62% rename from Authorization/Authorization/Presentation/Startup/LogistrationBottomView.swift rename to Core/Core/View/Base/LogistrationBottomView.swift index 8bd82e445..0bd1f27ef 100644 --- a/Authorization/Authorization/Presentation/Startup/LogistrationBottomView.swift +++ b/Core/Core/View/Base/LogistrationBottomView.swift @@ -7,31 +7,42 @@ import Foundation import SwiftUI -import Core import Theme +public enum LogistrationSourceScreen: Equatable { + case `default` + case startup + case discovery + case courseDetail(String, String) +} + +public enum LogistrationAction { + case signIn + case register +} + public struct LogistrationBottomView: View { - @ObservedObject - private var viewModel: StartupViewModel + private let action: (LogistrationAction) -> Void @Environment(\.isHorizontal) private var isHorizontal - public init(viewModel: StartupViewModel) { - self.viewModel = viewModel + public init(_ action: @escaping (LogistrationAction) -> Void) { + self.action = action } public var body: some View { VStack(alignment: .leading) { HStack(spacing: 24) { - StyledButton(AuthLocalization.SignIn.registerBtn) { - viewModel.router.showRegisterScreen() - viewModel.tracksignUpClicked() + StyledButton(CoreLocalization.SignIn.registerBtn) { + action(.register) } .frame(maxWidth: .infinity) StyledButton( - AuthLocalization.SignIn.logInTitle, - action: { viewModel.router.showLoginScreen() }, + CoreLocalization.SignIn.logInBtn, + action: { + action(.signIn) + }, color: .white, textColor: Theme.Colors.accentColor, borderColor: Theme.Colors.textInputStroke @@ -47,17 +58,12 @@ public struct LogistrationBottomView: View { #if DEBUG struct LogistrationBottomView_Previews: PreviewProvider { static var previews: some View { - let vm = StartupViewModel( - interactor: AuthInteractor.mock, - router: AuthorizationRouterMock(), - analytics: AuthorizationAnalyticsMock() - ) - LogistrationBottomView(viewModel: vm) + LogistrationBottomView {_ in } .preferredColorScheme(.light) .previewDisplayName("StartupView Light") .loadFonts() - LogistrationBottomView(viewModel: vm) + LogistrationBottomView {_ in } .preferredColorScheme(.dark) .previewDisplayName("StartupView Dark") .loadFonts() diff --git a/Core/Core/View/Base/WebBrowser.swift b/Core/Core/View/Base/WebBrowser.swift index ef04c50c5..dafd884fc 100644 --- a/Core/Core/View/Base/WebBrowser.swift +++ b/Core/Core/View/Base/WebBrowser.swift @@ -10,42 +10,56 @@ import WebKit import Theme public struct WebBrowser: View { - - var url: String - var pageTitle: String - @State private var isShowProgress: Bool = true + + @State private var isLoading: Bool = true @Environment(\.presentationMode) var presentationMode + + private var url: String + private var pageTitle: String + private var showProgress: Bool - public init(url: String, pageTitle: String) { + public init(url: String, pageTitle: String, showProgress: Bool = false) { self.url = url self.pageTitle = pageTitle + self.showProgress = showProgress } public var body: some View { - ZStack(alignment: .top) { - Theme.Colors.background.ignoresSafeArea() - // MARK: - Page name - VStack(alignment: .center) { - NavigationBar(title: pageTitle, - leftButtonAction: { presentationMode.wrappedValue.dismiss() }) - - // MARK: - Page Body - VStack { - ZStack(alignment: .top) { -// NavigationView { - WebView( - viewModel: .init(url: url, baseURL: ""), - isLoading: $isShowProgress, - refreshCookies: {} - ) - -// } - }.navigationBarTitle(Text("")) // Needed for hide navBar on ios 14, 15 - .navigationBarHidden(true) - .ignoresSafeArea() + GeometryReader { proxy in + ZStack(alignment: .center) { + Theme.Colors.background.ignoresSafeArea() + webView(proxy: proxy) + if isLoading, showProgress { + HStack(alignment: .center) { + ProgressBar( + size: 40, + lineWidth: 8 + ) + .padding(20) + } + .frame(maxWidth: .infinity) } } + .navigationBarTitle(Text("")) + .navigationBarHidden(true) + .ignoresSafeArea() + } + } + + private func webView(proxy: GeometryProxy) -> some View { + VStack(alignment: .center) { + NavigationBar( + title: pageTitle, + leftButtonAction: { presentationMode.wrappedValue.dismiss() } + ) + WebView( + viewModel: .init(url: url, baseURL: ""), + isLoading: $isLoading, + refreshCookies: {} + ) } + .padding(.top, proxy.safeAreaInsets.top) + .padding(.bottom, proxy.safeAreaInsets.bottom) } } diff --git a/Core/Core/en.lproj/Localizable.strings b/Core/Core/en.lproj/Localizable.strings index 27cbbfaad..01ef3f850 100644 --- a/Core/Core/en.lproj/Localizable.strings +++ b/Core/Core/en.lproj/Localizable.strings @@ -33,7 +33,7 @@ "COURSEWARE.IS_FINISHED" = "“ is finished."; "COURSEWARE.CONTINUE" = "Continue"; "COURSEWARE.RESUME" = "Resume"; -"COURSEWARE.CONTINUE_WITH" = "Continue with:"; +"COURSEWARE.RESUME_WITH" = "Resume with:"; "COURSEWARE.NEXT_SECTION" = "Next section"; "COURSEWARE.NEXT_SECTION_DESCRIPTION_FIRST" = "To proceed with “"; @@ -96,3 +96,5 @@ "SOCIAL_SIGN_CANCELED" = "The user canceled the sign-in flow."; +"SIGN_IN.LOG_IN_BTN" = "Sign in"; +"SIGN_IN.REGISTER_BTN" = "Register"; diff --git a/Core/Core/uk.lproj/Localizable.strings b/Core/Core/uk.lproj/Localizable.strings index 5dbf95db3..d2128641b 100644 --- a/Core/Core/uk.lproj/Localizable.strings +++ b/Core/Core/uk.lproj/Localizable.strings @@ -32,7 +32,7 @@ "COURSEWARE.IS_FINISHED" = "“ завершена."; "COURSEWARE.CONTINUE" = "Продовжити"; "COURSEWARE.RESUME" = "Resume"; -"COURSEWARE.CONTINUE_WITH" = "Продовжити далі:"; +"COURSEWARE.RESUME_WITH" = "Продовжити далі:"; "COURSEWARE.NEXT_SECTION" = "Наступний розділ"; "COURSEWARE.NEXT_SECTION_DESCRIPTION_FIRST" = "Щоб перейти до “"; @@ -96,3 +96,6 @@ "SOCIAL_SIGN_CANCELED" = "The user canceled the sign-in flow."; "AUTHORIZATION_FAILED" = "Authorization failed."; + +"SIGN_IN.LOG_IN_BTN" = "Увійти"; +"SIGN_IN.REGISTER_BTN" = "Реєстрація"; diff --git a/Core/CoreTests/Configuration/AgreementConfigTests.swift b/Core/CoreTests/Configuration/AgreementConfigTests.swift new file mode 100644 index 000000000..9a30e84fb --- /dev/null +++ b/Core/CoreTests/Configuration/AgreementConfigTests.swift @@ -0,0 +1,38 @@ +// +// AgreementConfigTests.swift +// CoreTests +// +// Created by Eugene Yatsenko on 14.12.2023. +// + +import XCTest +@testable import Core + +class AgreementConfigTests: XCTestCase { + + private let privacy = "https://www.example.com/privacy" + private let tos = "https://www.example.com/tos" + private let dataSellContent = "https://www.example.com/sell" + private let cookie = "https://www.example.com/cookie" + private let supportedLanguages = ["es"] + + private lazy var properties: [String: Any] = [ + "AGREEMENT_URLS": [ + "PRIVACY_POLICY_URL": privacy, + "TOS_URL": tos, + "DATA_SELL_CONSENT_URL": dataSellContent, + "COOKIE_POLICY_URL": cookie, + "SUPPORTED_LANGUAGES": supportedLanguages + ] + ] + + func testAgreementConfigInitialization() { + let config = Config(properties: properties) + + XCTAssertEqual(config.agreement.privacyPolicyURL, URL(string: privacy)) + XCTAssertEqual(config.agreement.tosURL, URL(string: tos)) + XCTAssertEqual(config.agreement.cookiePolicyURL, URL(string: cookie)) + XCTAssertEqual(config.agreement.dataSellContentURL, URL(string: dataSellContent)) + XCTAssertEqual(config.agreement.supportedLanguages, supportedLanguages) + } +} diff --git a/Core/CoreTests/Configuration/ConfigTests.swift b/Core/CoreTests/Configuration/ConfigTests.swift index 694ee6734..32638e484 100644 --- a/Core/CoreTests/Configuration/ConfigTests.swift +++ b/Core/CoreTests/Configuration/ConfigTests.swift @@ -18,7 +18,10 @@ class ConfigTests: XCTestCase { "WHATS_NEW_ENABLED": true, "AGREEMENT_URLS": [ "PRIVACY_POLICY_URL": "https://www.example.com/privacy", - "TOS_URL": "https://www.example.com/tos" + "TOS_URL": "https://www.example.com/tos", + "DATA_SELL_CONSENT_URL": "https://www.example.com/sell", + "COOKIE_POLICY_URL": "https://www.example.com/cookie", + "SUPPORTED_LANGUAGES": ["es"] ], "FIREBASE": [ "ENABLED": true, @@ -68,13 +71,6 @@ class ConfigTests: XCTestCase { XCTAssertTrue(config.features.whatNewEnabled) } - func testAgreementConfigInitialization() { - let config = Config(properties: properties) - - XCTAssertEqual(config.agreement.privacyPolicyURL, URL(string: "https://www.example.com/privacy")) - XCTAssertEqual(config.agreement.tosURL, URL(string: "https://www.example.com/tos")) - } - func testFirebaseConfigInitialization() { let config = Config(properties: properties) diff --git a/Course/Course/Presentation/Container/CourseContainerViewModel.swift b/Course/Course/Presentation/Container/CourseContainerViewModel.swift index e7589f9ad..84f7221de 100644 --- a/Course/Course/Presentation/Container/CourseContainerViewModel.swift +++ b/Course/Course/Presentation/Container/CourseContainerViewModel.swift @@ -277,7 +277,8 @@ public class CourseContainerViewModel: BaseCourseViewModel { return ContinueWith( chapterIndex: chapterIndex, sequentialIndex: sequentialIndex, - verticalIndex: verticalIndex + verticalIndex: verticalIndex, + lastVisitedBlockId: block.id ) } } diff --git a/Course/Course/Presentation/Details/CourseDetailsView.swift b/Course/Course/Presentation/Details/CourseDetailsView.swift index a0d53b779..4be478f8e 100644 --- a/Course/Course/Presentation/Details/CourseDetailsView.swift +++ b/Course/Course/Presentation/Details/CourseDetailsView.swift @@ -142,6 +142,26 @@ public struct CourseDetailsView: View { Spacer(minLength: 84) } } + if !viewModel.userloggedIn { + LogistrationBottomView { buttonAction in + switch buttonAction { + case .signIn: + viewModel.router.showLoginScreen( + sourceScreen: .courseDetail( + courseID, + viewModel.courseDetails?.courseTitle ?? "" + ) + ) + case .register: + viewModel.router.showRegisterScreen( + sourceScreen: .courseDetail( + courseID, + viewModel.courseDetails?.courseTitle ?? "" + ) + ) + } + } + } }.padding(.top, 8) .navigationBarHidden(false) .navigationBarBackButtonHidden(false) @@ -200,8 +220,12 @@ private struct CourseStateView: View { switch viewModel.courseState() { case .enrollOpen: StyledButton(CourseLocalization.Details.enrollNow, action: { - Task { - await viewModel.enrollToCourse(id: courseDetails.courseID) + if !viewModel.userloggedIn { + viewModel.router.showRegisterScreen(sourceScreen: .courseDetail(courseDetails.courseID, courseDetails.courseTitle)) + } else { + Task { + await viewModel.enrollToCourse(id: courseDetails.courseID) + } } }) .padding(16) @@ -213,17 +237,23 @@ private struct CourseStateView: View { .padding(.vertical, 24) case .alreadyEnrolled: StyledButton(CourseLocalization.Details.viewCourse, action: { - viewModel.viewCourseClicked(courseId: courseDetails.courseID, - courseName: courseDetails.courseTitle) - viewModel.router.showCourseScreens( - courseID: courseDetails.courseID, - isActive: nil, - courseStart: courseDetails.courseStart, - courseEnd: courseDetails.courseEnd, - enrollmentStart: courseDetails.enrollmentStart, - enrollmentEnd: courseDetails.enrollmentEnd, - title: title - ) + if !viewModel.userloggedIn { + viewModel.router.showRegisterScreen(sourceScreen: .courseDetail(courseDetails.courseID, courseDetails.courseTitle)) + } else { + viewModel.viewCourseClicked( + courseId: courseDetails.courseID, + courseName: courseDetails.courseTitle + ) + viewModel.router.showCourseScreens( + courseID: courseDetails.courseID, + isActive: nil, + courseStart: courseDetails.courseStart, + courseEnd: courseDetails.courseEnd, + enrollmentStart: courseDetails.enrollmentStart, + enrollmentEnd: courseDetails.enrollmentEnd, + title: title + ) + } }) .padding(16) } @@ -330,7 +360,8 @@ struct CourseDetailsView_Previews: PreviewProvider { analytics: CourseAnalyticsMock(), config: ConfigMock(), cssInjector: CSSInjectorMock(), - connectivity: Connectivity() + connectivity: Connectivity(), + storage: CoreStorageMock() ) CourseDetailsView( diff --git a/Course/Course/Presentation/Details/CourseDetailsViewModel.swift b/Course/Course/Presentation/Details/CourseDetailsViewModel.swift index d0facca5a..3524e3d78 100644 --- a/Course/Course/Presentation/Details/CourseDetailsViewModel.swift +++ b/Course/Course/Presentation/Details/CourseDetailsViewModel.swift @@ -35,6 +35,11 @@ public class CourseDetailsViewModel: ObservableObject { let config: ConfigProtocol let cssInjector: CSSInjector let connectivity: ConnectivityProtocol + let storage: CoreStorage + + var userloggedIn: Bool { + return !(storage.user?.username?.isEmpty ?? true) + } public init( interactor: CourseInteractorProtocol, @@ -42,7 +47,8 @@ public class CourseDetailsViewModel: ObservableObject { analytics: CourseAnalytics, config: ConfigProtocol, cssInjector: CSSInjector, - connectivity: ConnectivityProtocol + connectivity: ConnectivityProtocol, + storage: CoreStorage ) { self.interactor = interactor self.router = router @@ -50,6 +56,7 @@ public class CourseDetailsViewModel: ObservableObject { self.config = config self.cssInjector = cssInjector self.connectivity = connectivity + self.storage = storage } @MainActor diff --git a/Course/Course/Presentation/Outline/ContinueWithView.swift b/Course/Course/Presentation/Outline/ContinueWithView.swift index e124a4002..8116fa90b 100644 --- a/Course/Course/Presentation/Outline/ContinueWithView.swift +++ b/Course/Course/Presentation/Outline/ContinueWithView.swift @@ -13,29 +13,28 @@ struct ContinueWith { let chapterIndex: Int let sequentialIndex: Int let verticalIndex: Int + let lastVisitedBlockId: String } struct ContinueWithView: View { private let data: ContinueWith - private let courseStructure: CourseStructure private let action: () -> Void + private let courseContinueUnit: CourseVertical private var idiom: UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom } - init(data: ContinueWith, courseStructure: CourseStructure, action: @escaping () -> Void) { + init(data: ContinueWith, courseContinueUnit: CourseVertical, action: @escaping () -> Void) { self.data = data - self.courseStructure = courseStructure self.action = action + self.courseContinueUnit = courseContinueUnit } var body: some View { VStack(alignment: .leading) { - let chapter = courseStructure.childs[data.chapterIndex] - if let vertical = chapter.childs[data.sequentialIndex].childs.first { if idiom == .pad { HStack(alignment: .top) { VStack(alignment: .leading) { - ContinueTitle(vertical: vertical) + ContinueTitle(vertical: courseContinueUnit) }.foregroundColor(Theme.Colors.textPrimary) Spacer() UnitButtonView(type: .continueLesson, action: action) @@ -44,13 +43,11 @@ struct ContinueWithView: View { .padding(.top, 32) } else { VStack(alignment: .leading) { - ContinueTitle(vertical: vertical) + ContinueTitle(vertical: courseContinueUnit) .foregroundColor(Theme.Colors.textPrimary) } UnitButtonView(type: .continueLesson, action: action) } - - } }.padding(.horizontal, 24) .padding(.top, 32) } @@ -61,7 +58,7 @@ private struct ContinueTitle: View { let vertical: CourseVertical var body: some View { - Text(CoreLocalization.Courseware.continueWith) + Text(CoreLocalization.Courseware.resumeWith) .font(Theme.Fonts.labelMedium) .foregroundColor(Theme.Colors.textSecondary) HStack { @@ -78,55 +75,51 @@ private struct ContinueTitle: View { #if DEBUG struct ContinueWithView_Previews: PreviewProvider { static var previews: some View { - - let childs = [ - CourseChapter( - blockId: "123", - id: "123", - displayName: "Continue lesson", - type: .chapter, - childs: [ - CourseSequential( - blockId: "1", - id: "1", - displayName: "Name", - type: .sequential, - completion: 0, - childs: [ - CourseVertical( - blockId: "1", - id: "1", - courseId: "123", - displayName: "Vertical", - type: .vertical, - completion: 0, - childs: [ - CourseBlock( - blockId: "2", - id: "2", - courseId: "123", - graded: true, - completion: 0, - type: .html, - displayName: "Continue lesson", - studentUrl: "") - ])])]) + let blocks = [ + CourseBlock( + blockId: "1", + id: "1", + courseId: "123", + topicId: "1", + graded: false, + completion: 0, + type: .video, + displayName: "Lesson 1", + studentUrl: "", + videoUrl: nil, + youTubeUrl: nil + ), + CourseBlock( + blockId: "2", + id: "2", + courseId: "123", + topicId: "2", + graded: false, + completion: 0, + type: .video, + displayName: "Lesson 2", + studentUrl: "2", + videoUrl: nil, + youTubeUrl: nil + ) ] ContinueWithView( - data: ContinueWith(chapterIndex: 0, sequentialIndex: 0, verticalIndex: 0), - courseStructure: CourseStructure( - id: "123", - graded: true, - completion: 0, - viewYouTubeUrl: "", - encodedVideo: "", - displayName: "Namaste", - childs: childs, - media: DataLayer.CourseMedia( - image: .init(raw: "", small: "", large: "") - ), - certificate: nil) + data: ContinueWith( + chapterIndex: 0, + sequentialIndex: 0, + verticalIndex: 0, + lastVisitedBlockId: "test_block_id" + ), + courseContinueUnit: CourseVertical( + blockId: "2", + id: "2", + courseId: "123", + displayName: "Second Unit", + type: .vertical, + completion: 1, + childs: blocks + ) ) { } } diff --git a/Course/Course/Presentation/Outline/CourseExpandableContentView.swift b/Course/Course/Presentation/Outline/CourseExpandableContentView.swift index ee742d727..d0f73e917 100644 --- a/Course/Course/Presentation/Outline/CourseExpandableContentView.swift +++ b/Course/Course/Presentation/Outline/CourseExpandableContentView.swift @@ -50,14 +50,9 @@ struct CourseExpandableContentView: View { .lineLimit(1) .foregroundColor(Theme.Colors.textPrimary) Spacer() - if isExpanded { - Image(systemName: "chevron.right") - .foregroundColor(Theme.Colors.accentColor) - .rotationEffect(.degrees(90)) - } else { - Image(systemName: "chevron.right") - .foregroundColor(Theme.Colors.accentColor) - } + Image(systemName: "chevron.right") + .foregroundColor(Theme.Colors.accentColor) + .dropdownArrowRotationAnimation(value: isExpanded) } .padding(.horizontal, 30) .padding(.vertical, 15) diff --git a/Course/Course/Presentation/Outline/CourseOutlineView.swift b/Course/Course/Presentation/Outline/CourseOutlineView.swift index 6db7740c1..04ee19406 100644 --- a/Course/Course/Presentation/Outline/CourseOutlineView.swift +++ b/Course/Course/Presentation/Outline/CourseOutlineView.swift @@ -49,26 +49,39 @@ public struct CourseOutlineView: View { if let continueWith = viewModel.continueWith, let courseStructure = viewModel.courseStructure, !isVideo { + let chapter = courseStructure.childs[continueWith.chapterIndex] + let sequential = chapter.childs[continueWith.sequentialIndex] + let continueUnit = sequential.childs[continueWith.verticalIndex] // MARK: - ContinueWith button ContinueWithView( data: continueWith, - courseStructure: courseStructure + courseContinueUnit: continueUnit ) { - let chapter = courseStructure.childs[continueWith.chapterIndex] - let sequential = chapter.childs[continueWith.sequentialIndex] + var continueBlock: CourseBlock? + continueUnit.childs.forEach { block in + if block.id == continueWith.lastVisitedBlockId { + continueBlock = block + } + } viewModel.trackResumeCourseTapped( - blockId: sequential.childs[continueWith.verticalIndex].blockId - ) - viewModel.router.showCourseVerticalView( - courseID: courseStructure.id, - courseName: courseStructure.displayName, - title: sequential.displayName, - chapters: courseStructure.childs, - chapterIndex: continueWith.chapterIndex, - sequentialIndex: continueWith.sequentialIndex + blockId: continueBlock?.id ?? "" ) + + if let course = viewModel.courseStructure { + viewModel.router.showCourseUnit( + courseName: course.displayName, + blockId: continueBlock?.id ?? "", + courseID: course.id, + sectionName: continueUnit.displayName, + verticalIndex: continueWith.verticalIndex, + chapters: course.childs, + chapterIndex: continueWith.chapterIndex, + sequentialIndex: continueWith.sequentialIndex + ) + } +//"Saeed" } } diff --git a/Course/Course/Presentation/Unit/CourseUnitView.swift b/Course/Course/Presentation/Unit/CourseUnitView.swift index 6cbcb2aa3..2d5437b54 100644 --- a/Course/Course/Presentation/Unit/CourseUnitView.swift +++ b/Course/Course/Presentation/Unit/CourseUnitView.swift @@ -156,8 +156,11 @@ public struct CourseUnitView: View { case .unknown(let url): if index >= viewModel.index - 1 && index <= viewModel.index + 1 { if viewModel.connectivity.isInternetAvaliable { - UnknownView(url: url, viewModel: viewModel) - Spacer() + ScrollView(showsIndicators: false) { + UnknownView(url: url, viewModel: viewModel) + Spacer() + .frame(minHeight: 100) + } } else { NoInternetView(playerStateSubject: playerStateSubject) } @@ -296,21 +299,26 @@ public struct CourseUnitView: View { } } VStack { - NavigationBar( - title: isDropdownActive ? sequenceTitle : "", - leftButtonAction: { - viewModel.router.back() - playerStateSubject.send(VideoPlayerState.kill) - }).padding(.top, isHorizontal ? 10 : 0) + Group { + NavigationBar( + title: isDropdownActive ? sequenceTitle : "", + leftButtonAction: { + viewModel.router.back() + playerStateSubject.send(VideoPlayerState.kill) + }) + .padding(.top, isHorizontal ? 10 : 0) .padding(.leading, isHorizontal ? -16 : 0) - if isDropdownActive { - CourseUnitDropDownTitle( - title: unitTitle, - isAvailable: isDropdownAvailable, - showDropdown: $showDropdown) - .padding(.top, 0) - .offset(y: -25) + if isDropdownActive { + CourseUnitDropDownTitle( + title: unitTitle, + isAvailable: isDropdownAvailable, + showDropdown: $showDropdown) + .padding(.top, 0) + .padding(.horizontal, 48) + .offset(y: -25) + } } + .padding(.trailing, isHorizontal ? 215 : 0) Spacer() } HStack(alignment: .center) { diff --git a/Course/Course/Presentation/Unit/Subviews/DropdownList/CourseUnitDropDownTitle.swift b/Course/Course/Presentation/Unit/Subviews/DropdownList/CourseUnitDropDownTitle.swift index e2d83af16..413edcc8e 100644 --- a/Course/Course/Presentation/Unit/Subviews/DropdownList/CourseUnitDropDownTitle.swift +++ b/Course/Course/Presentation/Unit/Subviews/DropdownList/CourseUnitDropDownTitle.swift @@ -22,19 +22,17 @@ struct CourseUnitDropDownTitle: View { HStack { Text(title) .opacity(showDropdown ? 0.7 : 1.0) + .lineLimit(1) if isAvailable { - if showDropdown { - Image(systemName: "chevron.right") - .rotationEffect(.degrees(90)) - } else { - Image(systemName: "chevron.right") - } + Image(systemName: "chevron.right") + .dropdownArrowRotationAnimation(value: showDropdown) } } } .buttonStyle(.plain) } else { Text(title) + .lineLimit(1) } } } diff --git a/Course/Course/Presentation/Unit/Subviews/DropdownList/CourseUnitVerticalsDropdownView.swift b/Course/Course/Presentation/Unit/Subviews/DropdownList/CourseUnitVerticalsDropdownView.swift index 94c83ec7f..cf3db4309 100644 --- a/Course/Course/Presentation/Unit/Subviews/DropdownList/CourseUnitVerticalsDropdownView.swift +++ b/Course/Course/Presentation/Unit/Subviews/DropdownList/CourseUnitVerticalsDropdownView.swift @@ -22,6 +22,12 @@ struct CourseUnitVerticalsDropdownView: View { .onTapGesture { showDropdown.toggle() } + .simultaneousGesture( + DragGesture() + .onChanged { _ in + if showDropdown { showDropdown.toggle() } + } + ) CourseUnitDropDownList(content: { ForEach(verticals, id: \.id) { vertical in let isLast = verticals.last?.id == vertical.id @@ -31,6 +37,10 @@ struct CourseUnitVerticalsDropdownView: View { isLast: isLast, isSelected: isSelected ) { + if isSelected { + showDropdown.toggle() + return + } action(vertical) } } diff --git a/Course/Course/Presentation/Unit/Subviews/DropdownList/DropdownAnimationModifier.swift b/Course/Course/Presentation/Unit/Subviews/DropdownList/DropdownAnimationModifier.swift index b1529edb9..c1ef7d230 100644 --- a/Course/Course/Presentation/Unit/Subviews/DropdownList/DropdownAnimationModifier.swift +++ b/Course/Course/Presentation/Unit/Subviews/DropdownList/DropdownAnimationModifier.swift @@ -20,8 +20,21 @@ struct DropdownAnimationModifier: ViewModifier where V: Equatable { } } +struct DropdownArrowRotationModifier: ViewModifier { + var value: Bool + func body(content: Content) -> some View { + content + .rotationEffect(value ? .degrees(90) : .degrees(0)) + .animation(.easeOut(duration: 0.2), value: value) + } +} + extension View { func dropdownAnimation(isActive: Bool, value: V) -> some View where V: Equatable { modifier(DropdownAnimationModifier(isActive: isActive, value: value)) } + + func dropdownArrowRotationAnimation(value: Bool) -> some View { + modifier(DropdownArrowRotationModifier(value: value)) + } } diff --git a/Course/Course/SwiftGen/Strings.swift b/Course/Course/SwiftGen/Strings.swift index 4815bb970..8da16a132 100644 --- a/Course/Course/SwiftGen/Strings.swift +++ b/Course/Course/SwiftGen/Strings.swift @@ -27,8 +27,6 @@ public enum CourseLocalization { public static let backToOutline = CourseLocalization.tr("Localizable", "COURSEWARE.BACK_TO_OUTLINE", fallback: "Back to outline") /// Continue public static let `continue` = CourseLocalization.tr("Localizable", "COURSEWARE.CONTINUE", fallback: "Continue") - /// Continue with: - public static let continueWith = CourseLocalization.tr("Localizable", "COURSEWARE.CONTINUE_WITH", fallback: "Continue with:") /// Course content public static let courseContent = CourseLocalization.tr("Localizable", "COURSEWARE.COURSE_CONTENT", fallback: "Course content") /// Course units @@ -43,6 +41,8 @@ public enum CourseLocalization { public static let next = CourseLocalization.tr("Localizable", "COURSEWARE.NEXT", fallback: "Next") /// Prev public static let previous = CourseLocalization.tr("Localizable", "COURSEWARE.PREVIOUS", fallback: "Prev") + /// Resume with: + public static let resumeWith = CourseLocalization.tr("Localizable", "COURSEWARE.RESUME_WITH", fallback: "Resume with:") /// Section “ public static let section = CourseLocalization.tr("Localizable", "COURSEWARE.SECTION", fallback: "Section “") } diff --git a/Course/Course/en.lproj/Localizable.strings b/Course/Course/en.lproj/Localizable.strings index 65d83b0b6..8fe3b7008 100644 --- a/Course/Course/en.lproj/Localizable.strings +++ b/Course/Course/en.lproj/Localizable.strings @@ -28,7 +28,7 @@ "COURSEWARE.SECTION" = "Section “"; "COURSEWARE.IS_FINISHED" = "“ is finished."; "COURSEWARE.CONTINUE" = "Continue"; -"COURSEWARE.CONTINUE_WITH" = "Continue with:"; +"COURSEWARE.RESUME_WITH" = "Resume with:"; "ERROR.NO_INTERNET" = "You are not connected to the Internet. Please check your Internet connection."; "ERROR.RELOAD" = "Reload"; diff --git a/Course/Course/uk.lproj/Localizable.strings b/Course/Course/uk.lproj/Localizable.strings index d479f9381..180474854 100644 --- a/Course/Course/uk.lproj/Localizable.strings +++ b/Course/Course/uk.lproj/Localizable.strings @@ -27,7 +27,7 @@ "COURSEWARE.SECTION" = "Секція “"; "COURSEWARE.IS_FINISHED" = "“ завершена."; "COURSEWARE.CONTINUE" = "Продовжити"; -"COURSEWARE.CONTINUE_WITH" = "Продовжити далі:"; +"COURSEWARE.RESUME_WITH" = "Продовжити далі:"; "ERROR.NO_INTERNET" = "Ви не підключені до Інтернету. Перевірте підключення до Інтернету і спробуйте ще."; "ERROR.RELOAD" = "Перезавантажити"; diff --git a/Course/CourseTests/CourseMock.generated.swift b/Course/CourseTests/CourseMock.generated.swift index bd324ab2d..d536c8379 100644 --- a/Course/CourseTests/CourseMock.generated.swift +++ b/Course/CourseTests/CourseMock.generated.swift @@ -539,10 +539,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?(`controllers`) } - open func showMainOrWhatsNewScreen() { - addInvocation(.m_showMainOrWhatsNewScreen) - let perform = methodPerformValue(.m_showMainOrWhatsNewScreen) as? () -> Void - perform?() + open func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showStartupScreen() { @@ -551,16 +551,16 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showLoginScreen() { - addInvocation(.m_showLoginScreen) - let perform = methodPerformValue(.m_showLoginScreen) as? () -> Void - perform?() + open func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } - open func showRegisterScreen() { - addInvocation(.m_showRegisterScreen) - let perform = methodPerformValue(.m_showRegisterScreen) as? () -> Void - perform?() + open func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showForgotPasswordScreen() { @@ -569,10 +569,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) { - addInvocation(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) - let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) as? (String?, Bool) -> Void - perform?(`searchQuery`, `fromStartupScreen`) + open func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) as? (String?, LogistrationSourceScreen) -> Void + perform?(`searchQuery`, `sourceScreen`) } open func presentAlert(alertTitle: String, alertMessage: String, positiveAction: String, onCloseTapped: @escaping () -> Void, okTapped: @escaping () -> Void, type: AlertViewType) { @@ -606,12 +606,12 @@ open class BaseRouterMock: BaseRouter, Mock { case m_backWithFade case m_dismiss__animated_animated(Parameter) case m_removeLastView__controllers_controllers(Parameter) - case m_showMainOrWhatsNewScreen + case m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter) case m_showStartupScreen - case m_showLoginScreen - case m_showRegisterScreen + case m_showLoginScreen__sourceScreen_sourceScreen(Parameter) + case m_showRegisterScreen__sourceScreen_sourceScreen(Parameter) case m_showForgotPasswordScreen - case m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter, Parameter) + case m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(Parameter, Parameter, Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter<() -> Void>) case m_presentView__transitionStyle_transitionStyleview_view(Parameter, Parameter) @@ -641,20 +641,29 @@ open class BaseRouterMock: BaseRouter, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsControllers, rhs: rhsControllers, with: matcher), lhsControllers, rhsControllers, "controllers")) return Matcher.ComparisonResult(results) - case (.m_showMainOrWhatsNewScreen, .m_showMainOrWhatsNewScreen): return .match + case (.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showStartupScreen, .m_showStartupScreen): return .match - case (.m_showLoginScreen, .m_showLoginScreen): return .match + case (.m_showLoginScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showLoginScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) - case (.m_showRegisterScreen, .m_showRegisterScreen): return .match + case (.m_showRegisterScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showRegisterScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showForgotPasswordScreen, .m_showForgotPasswordScreen): return .match - case (.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let lhsSearchquery, let lhsFromstartupscreen), .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let rhsSearchquery, let rhsFromstartupscreen)): + case (.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let lhsSearchquery, let lhsSourcescreen), .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let rhsSearchquery, let rhsSourcescreen)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSearchquery, rhs: rhsSearchquery, with: matcher), lhsSearchquery, rhsSearchquery, "searchQuery")) - results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFromstartupscreen, rhs: rhsFromstartupscreen, with: matcher), lhsFromstartupscreen, rhsFromstartupscreen, "fromStartupScreen")) + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) return Matcher.ComparisonResult(results) case (.m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let lhsAlerttitle, let lhsAlertmessage, let lhsPositiveaction, let lhsOnclosetapped, let lhsOktapped, let lhsType), .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let rhsAlerttitle, let rhsAlertmessage, let rhsPositiveaction, let rhsOnclosetapped, let rhsOktapped, let rhsType)): @@ -701,12 +710,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return 0 case let .m_dismiss__animated_animated(p0): return p0.intValue case let .m_removeLastView__controllers_controllers(p0): return p0.intValue - case .m_showMainOrWhatsNewScreen: return 0 + case let .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showStartupScreen: return 0 - case .m_showLoginScreen: return 0 - case .m_showRegisterScreen: return 0 + case let .m_showLoginScreen__sourceScreen_sourceScreen(p0): return p0.intValue + case let .m_showRegisterScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showForgotPasswordScreen: return 0 - case let .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(p0, p1): return p0.intValue + p1.intValue + case let .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(p0, p1): return p0.intValue + p1.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(p0, p1, p2, p3, p4, p5): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(p0, p1, p2, p3, p4, p5, p6, p7): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue + p6.intValue + p7.intValue case let .m_presentView__transitionStyle_transitionStyleview_view(p0, p1): return p0.intValue + p1.intValue @@ -720,12 +729,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return ".backWithFade()" case .m_dismiss__animated_animated: return ".dismiss(animated:)" case .m_removeLastView__controllers_controllers: return ".removeLastView(controllers:)" - case .m_showMainOrWhatsNewScreen: return ".showMainOrWhatsNewScreen()" + case .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen: return ".showMainOrWhatsNewScreen(sourceScreen:)" case .m_showStartupScreen: return ".showStartupScreen()" - case .m_showLoginScreen: return ".showLoginScreen()" - case .m_showRegisterScreen: return ".showRegisterScreen()" + case .m_showLoginScreen__sourceScreen_sourceScreen: return ".showLoginScreen(sourceScreen:)" + case .m_showRegisterScreen__sourceScreen_sourceScreen: return ".showRegisterScreen(sourceScreen:)" case .m_showForgotPasswordScreen: return ".showForgotPasswordScreen()" - case .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen: return ".showDiscoveryScreen(searchQuery:fromStartupScreen:)" + case .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen: return ".showDiscoveryScreen(searchQuery:sourceScreen:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type: return ".presentAlert(alertTitle:alertMessage:positiveAction:onCloseTapped:okTapped:type:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped: return ".presentAlert(alertTitle:alertMessage:nextSectionName:action:image:onCloseTapped:okTapped:nextSectionTapped:)" case .m_presentView__transitionStyle_transitionStyleview_view: return ".presentView(transitionStyle:view:)" @@ -753,12 +762,12 @@ open class BaseRouterMock: BaseRouter, Mock { public static func backWithFade() -> Verify { return Verify(method: .m_backWithFade)} public static func dismiss(animated: Parameter) -> Verify { return Verify(method: .m_dismiss__animated_animated(`animated`))} public static func removeLastView(controllers: Parameter) -> Verify { return Verify(method: .m_removeLastView__controllers_controllers(`controllers`))} - public static func showMainOrWhatsNewScreen() -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen)} + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showStartupScreen() -> Verify { return Verify(method: .m_showStartupScreen)} - public static func showLoginScreen() -> Verify { return Verify(method: .m_showLoginScreen)} - public static func showRegisterScreen() -> Verify { return Verify(method: .m_showRegisterScreen)} + public static func showLoginScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`))} + public static func showRegisterScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showForgotPasswordScreen() -> Verify { return Verify(method: .m_showForgotPasswordScreen)} - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`))} + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, nextSectionName: Parameter, action: Parameter, image: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, nextSectionTapped: Parameter<() -> Void>) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(`alertTitle`, `alertMessage`, `nextSectionName`, `action`, `image`, `onCloseTapped`, `okTapped`, `nextSectionTapped`))} public static func presentView(transitionStyle: Parameter, view: Parameter) -> Verify { return Verify(method: .m_presentView__transitionStyle_transitionStyleview_view(`transitionStyle`, `view`))} @@ -784,23 +793,23 @@ open class BaseRouterMock: BaseRouter, Mock { public static func removeLastView(controllers: Parameter, perform: @escaping (Int) -> Void) -> Perform { return Perform(method: .m_removeLastView__controllers_controllers(`controllers`), performs: perform) } - public static func showMainOrWhatsNewScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showMainOrWhatsNewScreen, performs: perform) + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showStartupScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showStartupScreen, performs: perform) } - public static func showLoginScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showLoginScreen, performs: perform) + public static func showLoginScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } - public static func showRegisterScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showRegisterScreen, performs: perform) + public static func showRegisterScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showForgotPasswordScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showForgotPasswordScreen, performs: perform) } - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter, perform: @escaping (String?, Bool) -> Void) -> Perform { - return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`), performs: perform) + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter, perform: @escaping (String?, LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`), performs: perform) } public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter, perform: @escaping (String, String, String, @escaping () -> Void, @escaping () -> Void, AlertViewType) -> Void) -> Perform { return Perform(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`), performs: perform) @@ -1650,15 +1659,15 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { } open func getLoadedCourseDetails(courseID: String) throws -> CourseDetails { - addInvocation(.m_getCourseDetailsOffline__courseID_courseID(Parameter.value(courseID))) - let perform = methodPerformValue(.m_getCourseDetailsOffline__courseID_courseID(Parameter.value(courseID))) as? (String) -> Void - perform?(courseID) + addInvocation(.m_getLoadedCourseDetails__courseID_courseID(Parameter.value(`courseID`))) + let perform = methodPerformValue(.m_getLoadedCourseDetails__courseID_courseID(Parameter.value(`courseID`))) as? (String) -> Void + perform?(`courseID`) var __value: CourseDetails do { - __value = try methodReturnValue(.m_getCourseDetailsOffline__courseID_courseID(Parameter.value(courseID))).casted() + __value = try methodReturnValue(.m_getLoadedCourseDetails__courseID_courseID(Parameter.value(`courseID`))).casted() } catch MockError.notStubed { - onFatalFailure("Stub return value not specified for getCourseDetailsOffline(courseID: String). Use given") - Failure("Stub return value not specified for getCourseDetailsOffline(courseID: String). Use given") + onFatalFailure("Stub return value not specified for getLoadedCourseDetails(courseID: String). Use given") + Failure("Stub return value not specified for getLoadedCourseDetails(courseID: String). Use given") } catch { throw error } @@ -1666,15 +1675,15 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { } open func getLoadedCourseBlocks(courseID: String) throws -> CourseStructure { - addInvocation(.m_getCourseBlocksOffline__courseID_courseID(Parameter.value(courseID))) - let perform = methodPerformValue(.m_getCourseBlocksOffline__courseID_courseID(Parameter.value(courseID))) as? (String) -> Void - perform?(courseID) + addInvocation(.m_getLoadedCourseBlocks__courseID_courseID(Parameter.value(`courseID`))) + let perform = methodPerformValue(.m_getLoadedCourseBlocks__courseID_courseID(Parameter.value(`courseID`))) as? (String) -> Void + perform?(`courseID`) var __value: CourseStructure do { - __value = try methodReturnValue(.m_getCourseBlocksOffline__courseID_courseID(Parameter.value(courseID))).casted() + __value = try methodReturnValue(.m_getLoadedCourseBlocks__courseID_courseID(Parameter.value(`courseID`))).casted() } catch MockError.notStubed { - onFatalFailure("Stub return value not specified for getCourseBlocksOffline(courseID: String). Use given") - Failure("Stub return value not specified for getCourseBlocksOffline(courseID: String). Use given") + onFatalFailure("Stub return value not specified for getLoadedCourseBlocks(courseID: String). Use given") + Failure("Stub return value not specified for getLoadedCourseBlocks(courseID: String). Use given") } catch { throw error } @@ -1794,8 +1803,8 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { case m_getCourseDetails__courseID_courseID(Parameter) case m_getCourseBlocks__courseID_courseID(Parameter) case m_getCourseVideoBlocks__fullStructure_fullStructure(Parameter) - case m_getCourseDetailsOffline__courseID_courseID(Parameter) - case m_getCourseBlocksOffline__courseID_courseID(Parameter) + case m_getLoadedCourseDetails__courseID_courseID(Parameter) + case m_getLoadedCourseBlocks__courseID_courseID(Parameter) case m_enrollToCourse__courseID_courseID(Parameter) case m_blockCompletionRequest__courseID_courseIDblockID_blockID(Parameter, Parameter) case m_getHandouts__courseID_courseID(Parameter) @@ -1821,12 +1830,12 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFullstructure, rhs: rhsFullstructure, with: matcher), lhsFullstructure, rhsFullstructure, "fullStructure")) return Matcher.ComparisonResult(results) - case (.m_getCourseDetailsOffline__courseID_courseID(let lhsCourseid), .m_getCourseDetailsOffline__courseID_courseID(let rhsCourseid)): + case (.m_getLoadedCourseDetails__courseID_courseID(let lhsCourseid), .m_getLoadedCourseDetails__courseID_courseID(let rhsCourseid)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsCourseid, rhs: rhsCourseid, with: matcher), lhsCourseid, rhsCourseid, "courseID")) return Matcher.ComparisonResult(results) - case (.m_getCourseBlocksOffline__courseID_courseID(let lhsCourseid), .m_getCourseBlocksOffline__courseID_courseID(let rhsCourseid)): + case (.m_getLoadedCourseBlocks__courseID_courseID(let lhsCourseid), .m_getLoadedCourseBlocks__courseID_courseID(let rhsCourseid)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsCourseid, rhs: rhsCourseid, with: matcher), lhsCourseid, rhsCourseid, "courseID")) return Matcher.ComparisonResult(results) @@ -1876,8 +1885,8 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { case let .m_getCourseDetails__courseID_courseID(p0): return p0.intValue case let .m_getCourseBlocks__courseID_courseID(p0): return p0.intValue case let .m_getCourseVideoBlocks__fullStructure_fullStructure(p0): return p0.intValue - case let .m_getCourseDetailsOffline__courseID_courseID(p0): return p0.intValue - case let .m_getCourseBlocksOffline__courseID_courseID(p0): return p0.intValue + case let .m_getLoadedCourseDetails__courseID_courseID(p0): return p0.intValue + case let .m_getLoadedCourseBlocks__courseID_courseID(p0): return p0.intValue case let .m_enrollToCourse__courseID_courseID(p0): return p0.intValue case let .m_blockCompletionRequest__courseID_courseIDblockID_blockID(p0, p1): return p0.intValue + p1.intValue case let .m_getHandouts__courseID_courseID(p0): return p0.intValue @@ -1892,8 +1901,8 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { case .m_getCourseDetails__courseID_courseID: return ".getCourseDetails(courseID:)" case .m_getCourseBlocks__courseID_courseID: return ".getCourseBlocks(courseID:)" case .m_getCourseVideoBlocks__fullStructure_fullStructure: return ".getCourseVideoBlocks(fullStructure:)" - case .m_getCourseDetailsOffline__courseID_courseID: return ".getCourseDetailsOffline(courseID:)" - case .m_getCourseBlocksOffline__courseID_courseID: return ".getCourseBlocksOffline(courseID:)" + case .m_getLoadedCourseDetails__courseID_courseID: return ".getLoadedCourseDetails(courseID:)" + case .m_getLoadedCourseBlocks__courseID_courseID: return ".getLoadedCourseBlocks(courseID:)" case .m_enrollToCourse__courseID_courseID: return ".enrollToCourse(courseID:)" case .m_blockCompletionRequest__courseID_courseIDblockID_blockID: return ".blockCompletionRequest(courseID:blockID:)" case .m_getHandouts__courseID_courseID: return ".getHandouts(courseID:)" @@ -1923,11 +1932,11 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { public static func getCourseVideoBlocks(fullStructure: Parameter, willReturn: CourseStructure...) -> MethodStub { return Given(method: .m_getCourseVideoBlocks__fullStructure_fullStructure(`fullStructure`), products: willReturn.map({ StubProduct.return($0 as Any) })) } - public static func getCourseDetailsOffline(courseID: Parameter, willReturn: CourseDetails...) -> MethodStub { - return Given(method: .m_getCourseDetailsOffline__courseID_courseID(`courseID`), products: willReturn.map({ StubProduct.return($0 as Any) })) + public static func getLoadedCourseDetails(courseID: Parameter, willReturn: CourseDetails...) -> MethodStub { + return Given(method: .m_getLoadedCourseDetails__courseID_courseID(`courseID`), products: willReturn.map({ StubProduct.return($0 as Any) })) } - public static func getCourseBlocksOffline(courseID: Parameter, willReturn: CourseStructure...) -> MethodStub { - return Given(method: .m_getCourseBlocksOffline__courseID_courseID(`courseID`), products: willReturn.map({ StubProduct.return($0 as Any) })) + public static func getLoadedCourseBlocks(courseID: Parameter, willReturn: CourseStructure...) -> MethodStub { + return Given(method: .m_getLoadedCourseBlocks__courseID_courseID(`courseID`), products: willReturn.map({ StubProduct.return($0 as Any) })) } public static func enrollToCourse(courseID: Parameter, willReturn: Bool...) -> MethodStub { return Given(method: .m_enrollToCourse__courseID_courseID(`courseID`), products: willReturn.map({ StubProduct.return($0 as Any) })) @@ -1974,22 +1983,22 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { willProduce(stubber) return given } - public static func getCourseDetailsOffline(courseID: Parameter, willThrow: Error...) -> MethodStub { - return Given(method: .m_getCourseDetailsOffline__courseID_courseID(`courseID`), products: willThrow.map({ StubProduct.throw($0) })) + public static func getLoadedCourseDetails(courseID: Parameter, willThrow: Error...) -> MethodStub { + return Given(method: .m_getLoadedCourseDetails__courseID_courseID(`courseID`), products: willThrow.map({ StubProduct.throw($0) })) } - public static func getCourseDetailsOffline(courseID: Parameter, willProduce: (StubberThrows) -> Void) -> MethodStub { + public static func getLoadedCourseDetails(courseID: Parameter, willProduce: (StubberThrows) -> Void) -> MethodStub { let willThrow: [Error] = [] - let given: Given = { return Given(method: .m_getCourseDetailsOffline__courseID_courseID(`courseID`), products: willThrow.map({ StubProduct.throw($0) })) }() + let given: Given = { return Given(method: .m_getLoadedCourseDetails__courseID_courseID(`courseID`), products: willThrow.map({ StubProduct.throw($0) })) }() let stubber = given.stubThrows(for: (CourseDetails).self) willProduce(stubber) return given } - public static func getCourseBlocksOffline(courseID: Parameter, willThrow: Error...) -> MethodStub { - return Given(method: .m_getCourseBlocksOffline__courseID_courseID(`courseID`), products: willThrow.map({ StubProduct.throw($0) })) + public static func getLoadedCourseBlocks(courseID: Parameter, willThrow: Error...) -> MethodStub { + return Given(method: .m_getLoadedCourseBlocks__courseID_courseID(`courseID`), products: willThrow.map({ StubProduct.throw($0) })) } - public static func getCourseBlocksOffline(courseID: Parameter, willProduce: (StubberThrows) -> Void) -> MethodStub { + public static func getLoadedCourseBlocks(courseID: Parameter, willProduce: (StubberThrows) -> Void) -> MethodStub { let willThrow: [Error] = [] - let given: Given = { return Given(method: .m_getCourseBlocksOffline__courseID_courseID(`courseID`), products: willThrow.map({ StubProduct.throw($0) })) }() + let given: Given = { return Given(method: .m_getLoadedCourseBlocks__courseID_courseID(`courseID`), products: willThrow.map({ StubProduct.throw($0) })) }() let stubber = given.stubThrows(for: (CourseStructure).self) willProduce(stubber) return given @@ -2072,8 +2081,8 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { public static func getCourseDetails(courseID: Parameter) -> Verify { return Verify(method: .m_getCourseDetails__courseID_courseID(`courseID`))} public static func getCourseBlocks(courseID: Parameter) -> Verify { return Verify(method: .m_getCourseBlocks__courseID_courseID(`courseID`))} public static func getCourseVideoBlocks(fullStructure: Parameter) -> Verify { return Verify(method: .m_getCourseVideoBlocks__fullStructure_fullStructure(`fullStructure`))} - public static func getCourseDetailsOffline(courseID: Parameter) -> Verify { return Verify(method: .m_getCourseDetailsOffline__courseID_courseID(`courseID`))} - public static func getCourseBlocksOffline(courseID: Parameter) -> Verify { return Verify(method: .m_getCourseBlocksOffline__courseID_courseID(`courseID`))} + public static func getLoadedCourseDetails(courseID: Parameter) -> Verify { return Verify(method: .m_getLoadedCourseDetails__courseID_courseID(`courseID`))} + public static func getLoadedCourseBlocks(courseID: Parameter) -> Verify { return Verify(method: .m_getLoadedCourseBlocks__courseID_courseID(`courseID`))} public static func enrollToCourse(courseID: Parameter) -> Verify { return Verify(method: .m_enrollToCourse__courseID_courseID(`courseID`))} public static func blockCompletionRequest(courseID: Parameter, blockID: Parameter) -> Verify { return Verify(method: .m_blockCompletionRequest__courseID_courseIDblockID_blockID(`courseID`, `blockID`))} public static func getHandouts(courseID: Parameter) -> Verify { return Verify(method: .m_getHandouts__courseID_courseID(`courseID`))} @@ -2096,11 +2105,11 @@ open class CourseInteractorProtocolMock: CourseInteractorProtocol, Mock { public static func getCourseVideoBlocks(fullStructure: Parameter, perform: @escaping (CourseStructure) -> Void) -> Perform { return Perform(method: .m_getCourseVideoBlocks__fullStructure_fullStructure(`fullStructure`), performs: perform) } - public static func getCourseDetailsOffline(courseID: Parameter, perform: @escaping (String) -> Void) -> Perform { - return Perform(method: .m_getCourseDetailsOffline__courseID_courseID(`courseID`), performs: perform) + public static func getLoadedCourseDetails(courseID: Parameter, perform: @escaping (String) -> Void) -> Perform { + return Perform(method: .m_getLoadedCourseDetails__courseID_courseID(`courseID`), performs: perform) } - public static func getCourseBlocksOffline(courseID: Parameter, perform: @escaping (String) -> Void) -> Perform { - return Perform(method: .m_getCourseBlocksOffline__courseID_courseID(`courseID`), performs: perform) + public static func getLoadedCourseBlocks(courseID: Parameter, perform: @escaping (String) -> Void) -> Perform { + return Perform(method: .m_getLoadedCourseBlocks__courseID_courseID(`courseID`), performs: perform) } public static func enrollToCourse(courseID: Parameter, perform: @escaping (String) -> Void) -> Perform { return Perform(method: .m_enrollToCourse__courseID_courseID(`courseID`), performs: perform) diff --git a/Course/CourseTests/Presentation/Container/CourseContainerViewModelTests.swift b/Course/CourseTests/Presentation/Container/CourseContainerViewModelTests.swift index ef8f08708..dc75d4402 100644 --- a/Course/CourseTests/Presentation/Container/CourseContainerViewModelTests.swift +++ b/Course/CourseTests/Presentation/Container/CourseContainerViewModelTests.swift @@ -157,13 +157,13 @@ final class CourseContainerViewModelTests: XCTestCase { certificate: nil ) - Given(interactor, .getCourseBlocksOffline(courseID: .any, willReturn: courseStructure)) + Given(interactor, .getLoadedCourseBlocks(courseID: .any, willReturn: courseStructure)) Given(interactor, .getCourseVideoBlocks(fullStructure: .any, willReturn: courseStructure)) await viewModel.getCourseBlocks(courseID: "123") - Verify(interactor, .getCourseBlocksOffline(courseID: .any)) + Verify(interactor, .getLoadedCourseBlocks(courseID: .any)) Verify(interactor, .getCourseVideoBlocks(fullStructure: .any)) XCTAssertFalse(viewModel.isShowProgress) XCTAssertFalse(viewModel.showError) diff --git a/Course/CourseTests/Presentation/Details/CourseDetailsViewModelTests.swift b/Course/CourseTests/Presentation/Details/CourseDetailsViewModelTests.swift index 108fc104b..288966a25 100644 --- a/Course/CourseTests/Presentation/Details/CourseDetailsViewModelTests.swift +++ b/Course/CourseTests/Presentation/Details/CourseDetailsViewModelTests.swift @@ -29,7 +29,8 @@ final class CourseDetailsViewModelTests: XCTestCase { analytics: analytics, config: config, cssInjector: cssInjector, - connectivity: connectivity) + connectivity: connectivity, + storage: CoreStorageMock()) let courseDetails = CourseDetails( courseID: "123", @@ -74,7 +75,8 @@ final class CourseDetailsViewModelTests: XCTestCase { analytics: analytics, config: config, cssInjector: cssInjector, - connectivity: connectivity) + connectivity: connectivity, + storage: CoreStorageMock()) let courseDetails = CourseDetails( courseID: "123", @@ -91,12 +93,12 @@ final class CourseDetailsViewModelTests: XCTestCase { courseVideoURL: nil ) - Given(interactor, .getCourseDetailsOffline(courseID: "123", + Given(interactor, .getLoadedCourseDetails(courseID: "123", willReturn: courseDetails)) await viewModel.getCourseDetail(courseID: "123") - Verify(interactor, 1, .getCourseDetailsOffline(courseID: .any)) + Verify(interactor, 1, .getLoadedCourseDetails(courseID: .any)) XCTAssertFalse(viewModel.isShowProgress) XCTAssertNil(viewModel.errorMessage) @@ -118,7 +120,8 @@ final class CourseDetailsViewModelTests: XCTestCase { analytics: analytics, config: config, cssInjector: cssInjector, - connectivity: connectivity) + connectivity: connectivity, + storage: CoreStorageMock()) let noInternetError = AFError.sessionInvalidated(error: URLError(.notConnectedToInternet)) @@ -149,7 +152,8 @@ final class CourseDetailsViewModelTests: XCTestCase { analytics: analytics, config: config, cssInjector: cssInjector, - connectivity: connectivity) + connectivity: connectivity, + storage: CoreStorageMock()) Given(interactor, .getCourseDetails(courseID: "123", willThrow: NoCachedDataError())) @@ -178,7 +182,8 @@ final class CourseDetailsViewModelTests: XCTestCase { analytics: analytics, config: config, cssInjector: cssInjector, - connectivity: connectivity) + connectivity: connectivity, + storage: CoreStorageMock()) Given(interactor, .getCourseDetails(courseID: "123", willThrow: NSError())) @@ -207,7 +212,8 @@ final class CourseDetailsViewModelTests: XCTestCase { analytics: analytics, config: config, cssInjector: cssInjector, - connectivity: connectivity) + connectivity: connectivity, + storage: CoreStorageMock()) Given(interactor, .enrollToCourse(courseID: "123", willReturn: true)) @@ -237,7 +243,8 @@ final class CourseDetailsViewModelTests: XCTestCase { analytics: analytics, config: config, cssInjector: cssInjector, - connectivity: connectivity) + connectivity: connectivity, + storage: CoreStorageMock()) Given(interactor, .enrollToCourse(courseID: "123", willThrow: AFError.explicitlyCancelled)) @@ -267,7 +274,8 @@ final class CourseDetailsViewModelTests: XCTestCase { analytics: analytics, config: config, cssInjector: cssInjector, - connectivity: connectivity) + connectivity: connectivity, + storage: CoreStorageMock()) let noInternetError = AFError.sessionInvalidated(error: URLError(.notConnectedToInternet)) @@ -298,7 +306,8 @@ final class CourseDetailsViewModelTests: XCTestCase { analytics: analytics, config: config, cssInjector: cssInjector, - connectivity: connectivity) + connectivity: connectivity, + storage: CoreStorageMock()) Given(interactor, .enrollToCourse(courseID: "123", willThrow: NoCachedDataError())) diff --git a/Dashboard/DashboardTests/DashboardMock.generated.swift b/Dashboard/DashboardTests/DashboardMock.generated.swift index 70acae430..f5c74c668 100644 --- a/Dashboard/DashboardTests/DashboardMock.generated.swift +++ b/Dashboard/DashboardTests/DashboardMock.generated.swift @@ -539,10 +539,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?(`controllers`) } - open func showMainOrWhatsNewScreen() { - addInvocation(.m_showMainOrWhatsNewScreen) - let perform = methodPerformValue(.m_showMainOrWhatsNewScreen) as? () -> Void - perform?() + open func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showStartupScreen() { @@ -551,16 +551,16 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showLoginScreen() { - addInvocation(.m_showLoginScreen) - let perform = methodPerformValue(.m_showLoginScreen) as? () -> Void - perform?() + open func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } - open func showRegisterScreen() { - addInvocation(.m_showRegisterScreen) - let perform = methodPerformValue(.m_showRegisterScreen) as? () -> Void - perform?() + open func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showForgotPasswordScreen() { @@ -569,10 +569,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) { - addInvocation(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) - let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) as? (String?, Bool) -> Void - perform?(`searchQuery`, `fromStartupScreen`) + open func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) as? (String?, LogistrationSourceScreen) -> Void + perform?(`searchQuery`, `sourceScreen`) } open func presentAlert(alertTitle: String, alertMessage: String, positiveAction: String, onCloseTapped: @escaping () -> Void, okTapped: @escaping () -> Void, type: AlertViewType) { @@ -606,12 +606,12 @@ open class BaseRouterMock: BaseRouter, Mock { case m_backWithFade case m_dismiss__animated_animated(Parameter) case m_removeLastView__controllers_controllers(Parameter) - case m_showMainOrWhatsNewScreen + case m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter) case m_showStartupScreen - case m_showLoginScreen - case m_showRegisterScreen + case m_showLoginScreen__sourceScreen_sourceScreen(Parameter) + case m_showRegisterScreen__sourceScreen_sourceScreen(Parameter) case m_showForgotPasswordScreen - case m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter, Parameter) + case m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(Parameter, Parameter, Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter<() -> Void>) case m_presentView__transitionStyle_transitionStyleview_view(Parameter, Parameter) @@ -641,20 +641,29 @@ open class BaseRouterMock: BaseRouter, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsControllers, rhs: rhsControllers, with: matcher), lhsControllers, rhsControllers, "controllers")) return Matcher.ComparisonResult(results) - case (.m_showMainOrWhatsNewScreen, .m_showMainOrWhatsNewScreen): return .match + case (.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showStartupScreen, .m_showStartupScreen): return .match - case (.m_showLoginScreen, .m_showLoginScreen): return .match + case (.m_showLoginScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showLoginScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) - case (.m_showRegisterScreen, .m_showRegisterScreen): return .match + case (.m_showRegisterScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showRegisterScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showForgotPasswordScreen, .m_showForgotPasswordScreen): return .match - case (.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let lhsSearchquery, let lhsFromstartupscreen), .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let rhsSearchquery, let rhsFromstartupscreen)): + case (.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let lhsSearchquery, let lhsSourcescreen), .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let rhsSearchquery, let rhsSourcescreen)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSearchquery, rhs: rhsSearchquery, with: matcher), lhsSearchquery, rhsSearchquery, "searchQuery")) - results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFromstartupscreen, rhs: rhsFromstartupscreen, with: matcher), lhsFromstartupscreen, rhsFromstartupscreen, "fromStartupScreen")) + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) return Matcher.ComparisonResult(results) case (.m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let lhsAlerttitle, let lhsAlertmessage, let lhsPositiveaction, let lhsOnclosetapped, let lhsOktapped, let lhsType), .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let rhsAlerttitle, let rhsAlertmessage, let rhsPositiveaction, let rhsOnclosetapped, let rhsOktapped, let rhsType)): @@ -701,12 +710,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return 0 case let .m_dismiss__animated_animated(p0): return p0.intValue case let .m_removeLastView__controllers_controllers(p0): return p0.intValue - case .m_showMainOrWhatsNewScreen: return 0 + case let .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showStartupScreen: return 0 - case .m_showLoginScreen: return 0 - case .m_showRegisterScreen: return 0 + case let .m_showLoginScreen__sourceScreen_sourceScreen(p0): return p0.intValue + case let .m_showRegisterScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showForgotPasswordScreen: return 0 - case let .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(p0, p1): return p0.intValue + p1.intValue + case let .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(p0, p1): return p0.intValue + p1.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(p0, p1, p2, p3, p4, p5): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(p0, p1, p2, p3, p4, p5, p6, p7): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue + p6.intValue + p7.intValue case let .m_presentView__transitionStyle_transitionStyleview_view(p0, p1): return p0.intValue + p1.intValue @@ -720,12 +729,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return ".backWithFade()" case .m_dismiss__animated_animated: return ".dismiss(animated:)" case .m_removeLastView__controllers_controllers: return ".removeLastView(controllers:)" - case .m_showMainOrWhatsNewScreen: return ".showMainOrWhatsNewScreen()" + case .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen: return ".showMainOrWhatsNewScreen(sourceScreen:)" case .m_showStartupScreen: return ".showStartupScreen()" - case .m_showLoginScreen: return ".showLoginScreen()" - case .m_showRegisterScreen: return ".showRegisterScreen()" + case .m_showLoginScreen__sourceScreen_sourceScreen: return ".showLoginScreen(sourceScreen:)" + case .m_showRegisterScreen__sourceScreen_sourceScreen: return ".showRegisterScreen(sourceScreen:)" case .m_showForgotPasswordScreen: return ".showForgotPasswordScreen()" - case .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen: return ".showDiscoveryScreen(searchQuery:fromStartupScreen:)" + case .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen: return ".showDiscoveryScreen(searchQuery:sourceScreen:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type: return ".presentAlert(alertTitle:alertMessage:positiveAction:onCloseTapped:okTapped:type:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped: return ".presentAlert(alertTitle:alertMessage:nextSectionName:action:image:onCloseTapped:okTapped:nextSectionTapped:)" case .m_presentView__transitionStyle_transitionStyleview_view: return ".presentView(transitionStyle:view:)" @@ -753,12 +762,12 @@ open class BaseRouterMock: BaseRouter, Mock { public static func backWithFade() -> Verify { return Verify(method: .m_backWithFade)} public static func dismiss(animated: Parameter) -> Verify { return Verify(method: .m_dismiss__animated_animated(`animated`))} public static func removeLastView(controllers: Parameter) -> Verify { return Verify(method: .m_removeLastView__controllers_controllers(`controllers`))} - public static func showMainOrWhatsNewScreen() -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen)} + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showStartupScreen() -> Verify { return Verify(method: .m_showStartupScreen)} - public static func showLoginScreen() -> Verify { return Verify(method: .m_showLoginScreen)} - public static func showRegisterScreen() -> Verify { return Verify(method: .m_showRegisterScreen)} + public static func showLoginScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`))} + public static func showRegisterScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showForgotPasswordScreen() -> Verify { return Verify(method: .m_showForgotPasswordScreen)} - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`))} + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, nextSectionName: Parameter, action: Parameter, image: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, nextSectionTapped: Parameter<() -> Void>) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(`alertTitle`, `alertMessage`, `nextSectionName`, `action`, `image`, `onCloseTapped`, `okTapped`, `nextSectionTapped`))} public static func presentView(transitionStyle: Parameter, view: Parameter) -> Verify { return Verify(method: .m_presentView__transitionStyle_transitionStyleview_view(`transitionStyle`, `view`))} @@ -784,23 +793,23 @@ open class BaseRouterMock: BaseRouter, Mock { public static func removeLastView(controllers: Parameter, perform: @escaping (Int) -> Void) -> Perform { return Perform(method: .m_removeLastView__controllers_controllers(`controllers`), performs: perform) } - public static func showMainOrWhatsNewScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showMainOrWhatsNewScreen, performs: perform) + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showStartupScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showStartupScreen, performs: perform) } - public static func showLoginScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showLoginScreen, performs: perform) + public static func showLoginScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } - public static func showRegisterScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showRegisterScreen, performs: perform) + public static func showRegisterScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showForgotPasswordScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showForgotPasswordScreen, performs: perform) } - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter, perform: @escaping (String?, Bool) -> Void) -> Perform { - return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`), performs: perform) + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter, perform: @escaping (String?, LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`), performs: perform) } public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter, perform: @escaping (String, String, String, @escaping () -> Void, @escaping () -> Void, AlertViewType) -> Void) -> Perform { return Perform(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`), performs: perform) diff --git a/Discovery/Discovery.xcodeproj/project.pbxproj b/Discovery/Discovery.xcodeproj/project.pbxproj index 88b0be486..6b3a59362 100644 --- a/Discovery/Discovery.xcodeproj/project.pbxproj +++ b/Discovery/Discovery.xcodeproj/project.pbxproj @@ -86,6 +86,7 @@ CFC849442996A52A0055E497 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; CFC8494D299A66080055E497 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; CFC8494F299BE52C0055E497 /* SearchViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModelTests.swift; sourceTree = ""; }; + E0D586132B29F25A009B4BA7 /* Authorization.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Authorization.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E192F9B4A7EECED9665AB8A7 /* Pods-App-Discovery.releasedev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Discovery.releasedev.xcconfig"; path = "Target Support Files/Pods-App-Discovery/Pods-App-Discovery.releasedev.xcconfig"; sourceTree = ""; }; F340BD73D38B0DF9E4EA6482 /* Pods-App-Discovery-DiscoveryUnitTests.releaseprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Discovery-DiscoveryUnitTests.releaseprod.xcconfig"; path = "Target Support Files/Pods-App-Discovery-DiscoveryUnitTests/Pods-App-Discovery-DiscoveryUnitTests.releaseprod.xcconfig"; sourceTree = ""; }; FF565519B9BBC73E92249648 /* Pods-App-Discovery-DiscoveryUnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Discovery-DiscoveryUnitTests.release.xcconfig"; path = "Target Support Files/Pods-App-Discovery-DiscoveryUnitTests/Pods-App-Discovery-DiscoveryUnitTests.release.xcconfig"; sourceTree = ""; }; @@ -226,6 +227,7 @@ 072787AB28D34D15002E9142 /* Frameworks */ = { isa = PBXGroup; children = ( + E0D586132B29F25A009B4BA7 /* Authorization.framework */, 072787AC28D34D15002E9142 /* Core.framework */, 919E55130969D91EF03C4C0B /* Pods_App_Discovery.framework */, 780FC373E1D479E58870BD85 /* Pods_App_Discovery_DiscoveryUnitTests.framework */, diff --git a/Discovery/Discovery/Presentation/DiscoveryView.swift b/Discovery/Discovery/Presentation/DiscoveryView.swift index d7c8c8266..461a705ea 100644 --- a/Discovery/Discovery/Presentation/DiscoveryView.swift +++ b/Discovery/Discovery/Presentation/DiscoveryView.swift @@ -17,7 +17,7 @@ public struct DiscoveryView: View { @State private var searchQuery: String = "" @State private var isRefreshing: Bool = false - private var fromStartupScreen: Bool = false + private var sourceScreen: LogistrationSourceScreen @Environment (\.isHorizontal) private var isHorizontal @Environment(\.presentationMode) private var presentationMode @@ -37,12 +37,12 @@ public struct DiscoveryView: View { viewModel: DiscoveryViewModel, router: DiscoveryRouter, searchQuery: String? = nil, - fromStartupScreen: Bool = false + sourceScreen: LogistrationSourceScreen = .default ) { self._viewModel = StateObject(wrappedValue: { viewModel }()) self.router = router - self.fromStartupScreen = fromStartupScreen self._searchQuery = State(initialValue: searchQuery ?? "") + self.sourceScreen = sourceScreen } public var body: some View { @@ -136,6 +136,17 @@ public struct DiscoveryView: View { } .frameLimit() }.accessibilityAction {} + + if !viewModel.userloggedIn { + LogistrationBottomView { buttonAction in + switch buttonAction { + case .signIn: + viewModel.router.showLoginScreen(sourceScreen: .discovery) + case .register: + viewModel.router.showRegisterScreen(sourceScreen: .discovery) + } + } + } }.padding(.top, 8) // MARK: - Offline mode SnackBar @@ -161,7 +172,7 @@ public struct DiscoveryView: View { } } } - .navigationBarHidden(fromStartupScreen ? false : true) + .navigationBarHidden(sourceScreen != .startup) .onFirstAppear { if !(searchQuery.isEmpty) { router.showDiscoverySearch(searchQuery: searchQuery) @@ -169,6 +180,9 @@ public struct DiscoveryView: View { } Task { await viewModel.discovery(page: 1) + if case let .courseDetail(courseID, courseTitle) = sourceScreen { + viewModel.router.showCourseDetais(courseID: courseID, title: courseTitle) + } } viewModel.setupNotifications() } @@ -183,7 +197,8 @@ struct DiscoveryView_Previews: PreviewProvider { config: ConfigMock(), interactor: DiscoveryInteractor.mock, connectivity: Connectivity(), - analytics: DiscoveryAnalyticsMock()) + analytics: DiscoveryAnalyticsMock(), + storage: CoreStorageMock()) let router = DiscoveryRouterMock() DiscoveryView(viewModel: vm, router: router) diff --git a/Discovery/Discovery/Presentation/DiscoveryViewModel.swift b/Discovery/Discovery/Presentation/DiscoveryViewModel.swift index ec8268ae1..bcb8f1022 100644 --- a/Discovery/Discovery/Presentation/DiscoveryViewModel.swift +++ b/Discovery/Discovery/Presentation/DiscoveryViewModel.swift @@ -20,6 +20,10 @@ public class DiscoveryViewModel: ObservableObject { @Published var courses: [CourseItem] = [] @Published var showError: Bool = false + var userloggedIn: Bool { + return !(storage.user?.username?.isEmpty ?? true) + } + var errorMessage: String? { didSet { withAnimation { @@ -33,19 +37,22 @@ public class DiscoveryViewModel: ObservableObject { let connectivity: ConnectivityProtocol private let interactor: DiscoveryInteractorProtocol private let analytics: DiscoveryAnalytics + private let storage: CoreStorage public init( router: DiscoveryRouter, config: ConfigProtocol, interactor: DiscoveryInteractorProtocol, connectivity: ConnectivityProtocol, - analytics: DiscoveryAnalytics + analytics: DiscoveryAnalytics, + storage: CoreStorage ) { self.router = router self.config = config self.interactor = interactor self.connectivity = connectivity self.analytics = analytics + self.storage = storage } @MainActor diff --git a/Discovery/DiscoveryTests/DiscoveryMock.generated.swift b/Discovery/DiscoveryTests/DiscoveryMock.generated.swift index b4d088a28..72b350de5 100644 --- a/Discovery/DiscoveryTests/DiscoveryMock.generated.swift +++ b/Discovery/DiscoveryTests/DiscoveryMock.generated.swift @@ -539,10 +539,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?(`controllers`) } - open func showMainOrWhatsNewScreen() { - addInvocation(.m_showMainOrWhatsNewScreen) - let perform = methodPerformValue(.m_showMainOrWhatsNewScreen) as? () -> Void - perform?() + open func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showStartupScreen() { @@ -551,16 +551,16 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showLoginScreen() { - addInvocation(.m_showLoginScreen) - let perform = methodPerformValue(.m_showLoginScreen) as? () -> Void - perform?() + open func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } - open func showRegisterScreen() { - addInvocation(.m_showRegisterScreen) - let perform = methodPerformValue(.m_showRegisterScreen) as? () -> Void - perform?() + open func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showForgotPasswordScreen() { @@ -569,10 +569,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) { - addInvocation(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) - let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) as? (String?, Bool) -> Void - perform?(`searchQuery`, `fromStartupScreen`) + open func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) as? (String?, LogistrationSourceScreen) -> Void + perform?(`searchQuery`, `sourceScreen`) } open func presentAlert(alertTitle: String, alertMessage: String, positiveAction: String, onCloseTapped: @escaping () -> Void, okTapped: @escaping () -> Void, type: AlertViewType) { @@ -606,12 +606,12 @@ open class BaseRouterMock: BaseRouter, Mock { case m_backWithFade case m_dismiss__animated_animated(Parameter) case m_removeLastView__controllers_controllers(Parameter) - case m_showMainOrWhatsNewScreen + case m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter) case m_showStartupScreen - case m_showLoginScreen - case m_showRegisterScreen + case m_showLoginScreen__sourceScreen_sourceScreen(Parameter) + case m_showRegisterScreen__sourceScreen_sourceScreen(Parameter) case m_showForgotPasswordScreen - case m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter, Parameter) + case m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(Parameter, Parameter, Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter<() -> Void>) case m_presentView__transitionStyle_transitionStyleview_view(Parameter, Parameter) @@ -641,20 +641,29 @@ open class BaseRouterMock: BaseRouter, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsControllers, rhs: rhsControllers, with: matcher), lhsControllers, rhsControllers, "controllers")) return Matcher.ComparisonResult(results) - case (.m_showMainOrWhatsNewScreen, .m_showMainOrWhatsNewScreen): return .match + case (.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showStartupScreen, .m_showStartupScreen): return .match - case (.m_showLoginScreen, .m_showLoginScreen): return .match + case (.m_showLoginScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showLoginScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) - case (.m_showRegisterScreen, .m_showRegisterScreen): return .match + case (.m_showRegisterScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showRegisterScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showForgotPasswordScreen, .m_showForgotPasswordScreen): return .match - case (.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let lhsSearchquery, let lhsFromstartupscreen), .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let rhsSearchquery, let rhsFromstartupscreen)): + case (.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let lhsSearchquery, let lhsSourcescreen), .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let rhsSearchquery, let rhsSourcescreen)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSearchquery, rhs: rhsSearchquery, with: matcher), lhsSearchquery, rhsSearchquery, "searchQuery")) - results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFromstartupscreen, rhs: rhsFromstartupscreen, with: matcher), lhsFromstartupscreen, rhsFromstartupscreen, "fromStartupScreen")) + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) return Matcher.ComparisonResult(results) case (.m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let lhsAlerttitle, let lhsAlertmessage, let lhsPositiveaction, let lhsOnclosetapped, let lhsOktapped, let lhsType), .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let rhsAlerttitle, let rhsAlertmessage, let rhsPositiveaction, let rhsOnclosetapped, let rhsOktapped, let rhsType)): @@ -701,12 +710,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return 0 case let .m_dismiss__animated_animated(p0): return p0.intValue case let .m_removeLastView__controllers_controllers(p0): return p0.intValue - case .m_showMainOrWhatsNewScreen: return 0 + case let .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showStartupScreen: return 0 - case .m_showLoginScreen: return 0 - case .m_showRegisterScreen: return 0 + case let .m_showLoginScreen__sourceScreen_sourceScreen(p0): return p0.intValue + case let .m_showRegisterScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showForgotPasswordScreen: return 0 - case let .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(p0, p1): return p0.intValue + p1.intValue + case let .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(p0, p1): return p0.intValue + p1.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(p0, p1, p2, p3, p4, p5): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(p0, p1, p2, p3, p4, p5, p6, p7): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue + p6.intValue + p7.intValue case let .m_presentView__transitionStyle_transitionStyleview_view(p0, p1): return p0.intValue + p1.intValue @@ -720,12 +729,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return ".backWithFade()" case .m_dismiss__animated_animated: return ".dismiss(animated:)" case .m_removeLastView__controllers_controllers: return ".removeLastView(controllers:)" - case .m_showMainOrWhatsNewScreen: return ".showMainOrWhatsNewScreen()" + case .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen: return ".showMainOrWhatsNewScreen(sourceScreen:)" case .m_showStartupScreen: return ".showStartupScreen()" - case .m_showLoginScreen: return ".showLoginScreen()" - case .m_showRegisterScreen: return ".showRegisterScreen()" + case .m_showLoginScreen__sourceScreen_sourceScreen: return ".showLoginScreen(sourceScreen:)" + case .m_showRegisterScreen__sourceScreen_sourceScreen: return ".showRegisterScreen(sourceScreen:)" case .m_showForgotPasswordScreen: return ".showForgotPasswordScreen()" - case .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen: return ".showDiscoveryScreen(searchQuery:fromStartupScreen:)" + case .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen: return ".showDiscoveryScreen(searchQuery:sourceScreen:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type: return ".presentAlert(alertTitle:alertMessage:positiveAction:onCloseTapped:okTapped:type:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped: return ".presentAlert(alertTitle:alertMessage:nextSectionName:action:image:onCloseTapped:okTapped:nextSectionTapped:)" case .m_presentView__transitionStyle_transitionStyleview_view: return ".presentView(transitionStyle:view:)" @@ -753,12 +762,12 @@ open class BaseRouterMock: BaseRouter, Mock { public static func backWithFade() -> Verify { return Verify(method: .m_backWithFade)} public static func dismiss(animated: Parameter) -> Verify { return Verify(method: .m_dismiss__animated_animated(`animated`))} public static func removeLastView(controllers: Parameter) -> Verify { return Verify(method: .m_removeLastView__controllers_controllers(`controllers`))} - public static func showMainOrWhatsNewScreen() -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen)} + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showStartupScreen() -> Verify { return Verify(method: .m_showStartupScreen)} - public static func showLoginScreen() -> Verify { return Verify(method: .m_showLoginScreen)} - public static func showRegisterScreen() -> Verify { return Verify(method: .m_showRegisterScreen)} + public static func showLoginScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`))} + public static func showRegisterScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showForgotPasswordScreen() -> Verify { return Verify(method: .m_showForgotPasswordScreen)} - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`))} + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, nextSectionName: Parameter, action: Parameter, image: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, nextSectionTapped: Parameter<() -> Void>) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(`alertTitle`, `alertMessage`, `nextSectionName`, `action`, `image`, `onCloseTapped`, `okTapped`, `nextSectionTapped`))} public static func presentView(transitionStyle: Parameter, view: Parameter) -> Verify { return Verify(method: .m_presentView__transitionStyle_transitionStyleview_view(`transitionStyle`, `view`))} @@ -784,23 +793,23 @@ open class BaseRouterMock: BaseRouter, Mock { public static func removeLastView(controllers: Parameter, perform: @escaping (Int) -> Void) -> Perform { return Perform(method: .m_removeLastView__controllers_controllers(`controllers`), performs: perform) } - public static func showMainOrWhatsNewScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showMainOrWhatsNewScreen, performs: perform) + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showStartupScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showStartupScreen, performs: perform) } - public static func showLoginScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showLoginScreen, performs: perform) + public static func showLoginScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } - public static func showRegisterScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showRegisterScreen, performs: perform) + public static func showRegisterScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showForgotPasswordScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showForgotPasswordScreen, performs: perform) } - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter, perform: @escaping (String?, Bool) -> Void) -> Perform { - return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`), performs: perform) + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter, perform: @escaping (String?, LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`), performs: perform) } public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter, perform: @escaping (String, String, String, @escaping () -> Void, @escaping () -> Void, AlertViewType) -> Void) -> Perform { return Perform(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`), performs: perform) diff --git a/Discovery/DiscoveryTests/Presentation/DiscoveryViewModelTests.swift b/Discovery/DiscoveryTests/Presentation/DiscoveryViewModelTests.swift index 01ed44919..30b6b5706 100644 --- a/Discovery/DiscoveryTests/Presentation/DiscoveryViewModelTests.swift +++ b/Discovery/DiscoveryTests/Presentation/DiscoveryViewModelTests.swift @@ -26,11 +26,12 @@ final class DiscoveryViewModelTests: XCTestCase { let interactor = DiscoveryInteractorProtocolMock() let connectivity = Connectivity() let analytics = DiscoveryAnalyticsMock() - let viewModel = DiscoveryViewModel(router: DiscoveryRouterMock(), + let viewModel = DiscoveryViewModel(router: DiscoveryRouterMock(), config: ConfigMock(), interactor: interactor, connectivity: connectivity, - analytics: analytics) + analytics: analytics, + storage: CoreStorageMock()) let items = [ CourseItem(name: "Test", @@ -79,7 +80,8 @@ final class DiscoveryViewModelTests: XCTestCase { config: ConfigMock(), interactor: interactor, connectivity: connectivity, - analytics: analytics) + analytics: analytics, + storage: CoreStorageMock()) let items = [ CourseItem(name: "Test", org: "org", @@ -126,7 +128,8 @@ final class DiscoveryViewModelTests: XCTestCase { config: ConfigMock(), interactor: interactor, connectivity: connectivity, - analytics: analytics) + analytics: analytics, + storage: CoreStorageMock()) let items = [ CourseItem(name: "Test", org: "org", @@ -175,7 +178,8 @@ final class DiscoveryViewModelTests: XCTestCase { config: ConfigMock(), interactor: interactor, connectivity: connectivity, - analytics: analytics) + analytics: analytics, + storage: CoreStorageMock()) let noInternetError = AFError.sessionInvalidated(error: URLError(.notConnectedToInternet)) @@ -198,7 +202,8 @@ final class DiscoveryViewModelTests: XCTestCase { config: ConfigMock(), interactor: interactor, connectivity: connectivity, - analytics: analytics) + analytics: analytics, + storage: CoreStorageMock()) let noInternetError = AFError.sessionInvalidated(error: NSError()) diff --git a/Discussion/DiscussionTests/DiscussionMock.generated.swift b/Discussion/DiscussionTests/DiscussionMock.generated.swift index 1afce2ae3..6d998a133 100644 --- a/Discussion/DiscussionTests/DiscussionMock.generated.swift +++ b/Discussion/DiscussionTests/DiscussionMock.generated.swift @@ -539,10 +539,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?(`controllers`) } - open func showMainOrWhatsNewScreen() { - addInvocation(.m_showMainOrWhatsNewScreen) - let perform = methodPerformValue(.m_showMainOrWhatsNewScreen) as? () -> Void - perform?() + open func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showStartupScreen() { @@ -551,16 +551,16 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showLoginScreen() { - addInvocation(.m_showLoginScreen) - let perform = methodPerformValue(.m_showLoginScreen) as? () -> Void - perform?() + open func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } - open func showRegisterScreen() { - addInvocation(.m_showRegisterScreen) - let perform = methodPerformValue(.m_showRegisterScreen) as? () -> Void - perform?() + open func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showForgotPasswordScreen() { @@ -569,10 +569,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) { - addInvocation(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) - let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) as? (String?, Bool) -> Void - perform?(`searchQuery`, `fromStartupScreen`) + open func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) as? (String?, LogistrationSourceScreen) -> Void + perform?(`searchQuery`, `sourceScreen`) } open func presentAlert(alertTitle: String, alertMessage: String, positiveAction: String, onCloseTapped: @escaping () -> Void, okTapped: @escaping () -> Void, type: AlertViewType) { @@ -606,12 +606,12 @@ open class BaseRouterMock: BaseRouter, Mock { case m_backWithFade case m_dismiss__animated_animated(Parameter) case m_removeLastView__controllers_controllers(Parameter) - case m_showMainOrWhatsNewScreen + case m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter) case m_showStartupScreen - case m_showLoginScreen - case m_showRegisterScreen + case m_showLoginScreen__sourceScreen_sourceScreen(Parameter) + case m_showRegisterScreen__sourceScreen_sourceScreen(Parameter) case m_showForgotPasswordScreen - case m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter, Parameter) + case m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(Parameter, Parameter, Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter<() -> Void>) case m_presentView__transitionStyle_transitionStyleview_view(Parameter, Parameter) @@ -641,20 +641,29 @@ open class BaseRouterMock: BaseRouter, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsControllers, rhs: rhsControllers, with: matcher), lhsControllers, rhsControllers, "controllers")) return Matcher.ComparisonResult(results) - case (.m_showMainOrWhatsNewScreen, .m_showMainOrWhatsNewScreen): return .match + case (.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showStartupScreen, .m_showStartupScreen): return .match - case (.m_showLoginScreen, .m_showLoginScreen): return .match + case (.m_showLoginScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showLoginScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) - case (.m_showRegisterScreen, .m_showRegisterScreen): return .match + case (.m_showRegisterScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showRegisterScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showForgotPasswordScreen, .m_showForgotPasswordScreen): return .match - case (.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let lhsSearchquery, let lhsFromstartupscreen), .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let rhsSearchquery, let rhsFromstartupscreen)): + case (.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let lhsSearchquery, let lhsSourcescreen), .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let rhsSearchquery, let rhsSourcescreen)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSearchquery, rhs: rhsSearchquery, with: matcher), lhsSearchquery, rhsSearchquery, "searchQuery")) - results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFromstartupscreen, rhs: rhsFromstartupscreen, with: matcher), lhsFromstartupscreen, rhsFromstartupscreen, "fromStartupScreen")) + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) return Matcher.ComparisonResult(results) case (.m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let lhsAlerttitle, let lhsAlertmessage, let lhsPositiveaction, let lhsOnclosetapped, let lhsOktapped, let lhsType), .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let rhsAlerttitle, let rhsAlertmessage, let rhsPositiveaction, let rhsOnclosetapped, let rhsOktapped, let rhsType)): @@ -701,12 +710,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return 0 case let .m_dismiss__animated_animated(p0): return p0.intValue case let .m_removeLastView__controllers_controllers(p0): return p0.intValue - case .m_showMainOrWhatsNewScreen: return 0 + case let .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showStartupScreen: return 0 - case .m_showLoginScreen: return 0 - case .m_showRegisterScreen: return 0 + case let .m_showLoginScreen__sourceScreen_sourceScreen(p0): return p0.intValue + case let .m_showRegisterScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showForgotPasswordScreen: return 0 - case let .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(p0, p1): return p0.intValue + p1.intValue + case let .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(p0, p1): return p0.intValue + p1.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(p0, p1, p2, p3, p4, p5): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(p0, p1, p2, p3, p4, p5, p6, p7): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue + p6.intValue + p7.intValue case let .m_presentView__transitionStyle_transitionStyleview_view(p0, p1): return p0.intValue + p1.intValue @@ -720,12 +729,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return ".backWithFade()" case .m_dismiss__animated_animated: return ".dismiss(animated:)" case .m_removeLastView__controllers_controllers: return ".removeLastView(controllers:)" - case .m_showMainOrWhatsNewScreen: return ".showMainOrWhatsNewScreen()" + case .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen: return ".showMainOrWhatsNewScreen(sourceScreen:)" case .m_showStartupScreen: return ".showStartupScreen()" - case .m_showLoginScreen: return ".showLoginScreen()" - case .m_showRegisterScreen: return ".showRegisterScreen()" + case .m_showLoginScreen__sourceScreen_sourceScreen: return ".showLoginScreen(sourceScreen:)" + case .m_showRegisterScreen__sourceScreen_sourceScreen: return ".showRegisterScreen(sourceScreen:)" case .m_showForgotPasswordScreen: return ".showForgotPasswordScreen()" - case .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen: return ".showDiscoveryScreen(searchQuery:fromStartupScreen:)" + case .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen: return ".showDiscoveryScreen(searchQuery:sourceScreen:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type: return ".presentAlert(alertTitle:alertMessage:positiveAction:onCloseTapped:okTapped:type:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped: return ".presentAlert(alertTitle:alertMessage:nextSectionName:action:image:onCloseTapped:okTapped:nextSectionTapped:)" case .m_presentView__transitionStyle_transitionStyleview_view: return ".presentView(transitionStyle:view:)" @@ -753,12 +762,12 @@ open class BaseRouterMock: BaseRouter, Mock { public static func backWithFade() -> Verify { return Verify(method: .m_backWithFade)} public static func dismiss(animated: Parameter) -> Verify { return Verify(method: .m_dismiss__animated_animated(`animated`))} public static func removeLastView(controllers: Parameter) -> Verify { return Verify(method: .m_removeLastView__controllers_controllers(`controllers`))} - public static func showMainOrWhatsNewScreen() -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen)} + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showStartupScreen() -> Verify { return Verify(method: .m_showStartupScreen)} - public static func showLoginScreen() -> Verify { return Verify(method: .m_showLoginScreen)} - public static func showRegisterScreen() -> Verify { return Verify(method: .m_showRegisterScreen)} + public static func showLoginScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`))} + public static func showRegisterScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showForgotPasswordScreen() -> Verify { return Verify(method: .m_showForgotPasswordScreen)} - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`))} + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, nextSectionName: Parameter, action: Parameter, image: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, nextSectionTapped: Parameter<() -> Void>) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(`alertTitle`, `alertMessage`, `nextSectionName`, `action`, `image`, `onCloseTapped`, `okTapped`, `nextSectionTapped`))} public static func presentView(transitionStyle: Parameter, view: Parameter) -> Verify { return Verify(method: .m_presentView__transitionStyle_transitionStyleview_view(`transitionStyle`, `view`))} @@ -784,23 +793,23 @@ open class BaseRouterMock: BaseRouter, Mock { public static func removeLastView(controllers: Parameter, perform: @escaping (Int) -> Void) -> Perform { return Perform(method: .m_removeLastView__controllers_controllers(`controllers`), performs: perform) } - public static func showMainOrWhatsNewScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showMainOrWhatsNewScreen, performs: perform) + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showStartupScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showStartupScreen, performs: perform) } - public static func showLoginScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showLoginScreen, performs: perform) + public static func showLoginScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } - public static func showRegisterScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showRegisterScreen, performs: perform) + public static func showRegisterScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showForgotPasswordScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showForgotPasswordScreen, performs: perform) } - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter, perform: @escaping (String?, Bool) -> Void) -> Perform { - return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`), performs: perform) + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter, perform: @escaping (String?, LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`), performs: perform) } public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter, perform: @escaping (String, String, String, @escaping () -> Void, @escaping () -> Void, AlertViewType) -> Void) -> Perform { return Perform(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`), performs: perform) @@ -2116,10 +2125,10 @@ open class DiscussionRouterMock: DiscussionRouter, Mock { perform?(`controllers`) } - open func showMainOrWhatsNewScreen() { - addInvocation(.m_showMainOrWhatsNewScreen) - let perform = methodPerformValue(.m_showMainOrWhatsNewScreen) as? () -> Void - perform?() + open func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showStartupScreen() { @@ -2128,16 +2137,16 @@ open class DiscussionRouterMock: DiscussionRouter, Mock { perform?() } - open func showLoginScreen() { - addInvocation(.m_showLoginScreen) - let perform = methodPerformValue(.m_showLoginScreen) as? () -> Void - perform?() + open func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } - open func showRegisterScreen() { - addInvocation(.m_showRegisterScreen) - let perform = methodPerformValue(.m_showRegisterScreen) as? () -> Void - perform?() + open func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showForgotPasswordScreen() { @@ -2146,10 +2155,10 @@ open class DiscussionRouterMock: DiscussionRouter, Mock { perform?() } - open func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) { - addInvocation(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) - let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) as? (String?, Bool) -> Void - perform?(`searchQuery`, `fromStartupScreen`) + open func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) as? (String?, LogistrationSourceScreen) -> Void + perform?(`searchQuery`, `sourceScreen`) } open func presentAlert(alertTitle: String, alertMessage: String, positiveAction: String, onCloseTapped: @escaping () -> Void, okTapped: @escaping () -> Void, type: AlertViewType) { @@ -2189,12 +2198,12 @@ open class DiscussionRouterMock: DiscussionRouter, Mock { case m_backWithFade case m_dismiss__animated_animated(Parameter) case m_removeLastView__controllers_controllers(Parameter) - case m_showMainOrWhatsNewScreen + case m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter) case m_showStartupScreen - case m_showLoginScreen - case m_showRegisterScreen + case m_showLoginScreen__sourceScreen_sourceScreen(Parameter) + case m_showRegisterScreen__sourceScreen_sourceScreen(Parameter) case m_showForgotPasswordScreen - case m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter, Parameter) + case m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(Parameter, Parameter, Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter<() -> Void>) case m_presentView__transitionStyle_transitionStyleview_view(Parameter, Parameter) @@ -2262,20 +2271,29 @@ open class DiscussionRouterMock: DiscussionRouter, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsControllers, rhs: rhsControllers, with: matcher), lhsControllers, rhsControllers, "controllers")) return Matcher.ComparisonResult(results) - case (.m_showMainOrWhatsNewScreen, .m_showMainOrWhatsNewScreen): return .match + case (.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showStartupScreen, .m_showStartupScreen): return .match - case (.m_showLoginScreen, .m_showLoginScreen): return .match + case (.m_showLoginScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showLoginScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) - case (.m_showRegisterScreen, .m_showRegisterScreen): return .match + case (.m_showRegisterScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showRegisterScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showForgotPasswordScreen, .m_showForgotPasswordScreen): return .match - case (.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let lhsSearchquery, let lhsFromstartupscreen), .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let rhsSearchquery, let rhsFromstartupscreen)): + case (.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let lhsSearchquery, let lhsSourcescreen), .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let rhsSearchquery, let rhsSourcescreen)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSearchquery, rhs: rhsSearchquery, with: matcher), lhsSearchquery, rhsSearchquery, "searchQuery")) - results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFromstartupscreen, rhs: rhsFromstartupscreen, with: matcher), lhsFromstartupscreen, rhsFromstartupscreen, "fromStartupScreen")) + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) return Matcher.ComparisonResult(results) case (.m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let lhsAlerttitle, let lhsAlertmessage, let lhsPositiveaction, let lhsOnclosetapped, let lhsOktapped, let lhsType), .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let rhsAlerttitle, let rhsAlertmessage, let rhsPositiveaction, let rhsOnclosetapped, let rhsOktapped, let rhsType)): @@ -2328,12 +2346,12 @@ open class DiscussionRouterMock: DiscussionRouter, Mock { case .m_backWithFade: return 0 case let .m_dismiss__animated_animated(p0): return p0.intValue case let .m_removeLastView__controllers_controllers(p0): return p0.intValue - case .m_showMainOrWhatsNewScreen: return 0 + case let .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showStartupScreen: return 0 - case .m_showLoginScreen: return 0 - case .m_showRegisterScreen: return 0 + case let .m_showLoginScreen__sourceScreen_sourceScreen(p0): return p0.intValue + case let .m_showRegisterScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showForgotPasswordScreen: return 0 - case let .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(p0, p1): return p0.intValue + p1.intValue + case let .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(p0, p1): return p0.intValue + p1.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(p0, p1, p2, p3, p4, p5): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(p0, p1, p2, p3, p4, p5, p6, p7): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue + p6.intValue + p7.intValue case let .m_presentView__transitionStyle_transitionStyleview_view(p0, p1): return p0.intValue + p1.intValue @@ -2353,12 +2371,12 @@ open class DiscussionRouterMock: DiscussionRouter, Mock { case .m_backWithFade: return ".backWithFade()" case .m_dismiss__animated_animated: return ".dismiss(animated:)" case .m_removeLastView__controllers_controllers: return ".removeLastView(controllers:)" - case .m_showMainOrWhatsNewScreen: return ".showMainOrWhatsNewScreen()" + case .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen: return ".showMainOrWhatsNewScreen(sourceScreen:)" case .m_showStartupScreen: return ".showStartupScreen()" - case .m_showLoginScreen: return ".showLoginScreen()" - case .m_showRegisterScreen: return ".showRegisterScreen()" + case .m_showLoginScreen__sourceScreen_sourceScreen: return ".showLoginScreen(sourceScreen:)" + case .m_showRegisterScreen__sourceScreen_sourceScreen: return ".showRegisterScreen(sourceScreen:)" case .m_showForgotPasswordScreen: return ".showForgotPasswordScreen()" - case .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen: return ".showDiscoveryScreen(searchQuery:fromStartupScreen:)" + case .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen: return ".showDiscoveryScreen(searchQuery:sourceScreen:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type: return ".presentAlert(alertTitle:alertMessage:positiveAction:onCloseTapped:okTapped:type:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped: return ".presentAlert(alertTitle:alertMessage:nextSectionName:action:image:onCloseTapped:okTapped:nextSectionTapped:)" case .m_presentView__transitionStyle_transitionStyleview_view: return ".presentView(transitionStyle:view:)" @@ -2392,12 +2410,12 @@ open class DiscussionRouterMock: DiscussionRouter, Mock { public static func backWithFade() -> Verify { return Verify(method: .m_backWithFade)} public static func dismiss(animated: Parameter) -> Verify { return Verify(method: .m_dismiss__animated_animated(`animated`))} public static func removeLastView(controllers: Parameter) -> Verify { return Verify(method: .m_removeLastView__controllers_controllers(`controllers`))} - public static func showMainOrWhatsNewScreen() -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen)} + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showStartupScreen() -> Verify { return Verify(method: .m_showStartupScreen)} - public static func showLoginScreen() -> Verify { return Verify(method: .m_showLoginScreen)} - public static func showRegisterScreen() -> Verify { return Verify(method: .m_showRegisterScreen)} + public static func showLoginScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`))} + public static func showRegisterScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showForgotPasswordScreen() -> Verify { return Verify(method: .m_showForgotPasswordScreen)} - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`))} + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, nextSectionName: Parameter, action: Parameter, image: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, nextSectionTapped: Parameter<() -> Void>) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(`alertTitle`, `alertMessage`, `nextSectionName`, `action`, `image`, `onCloseTapped`, `okTapped`, `nextSectionTapped`))} public static func presentView(transitionStyle: Parameter, view: Parameter) -> Verify { return Verify(method: .m_presentView__transitionStyle_transitionStyleview_view(`transitionStyle`, `view`))} @@ -2441,23 +2459,23 @@ open class DiscussionRouterMock: DiscussionRouter, Mock { public static func removeLastView(controllers: Parameter, perform: @escaping (Int) -> Void) -> Perform { return Perform(method: .m_removeLastView__controllers_controllers(`controllers`), performs: perform) } - public static func showMainOrWhatsNewScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showMainOrWhatsNewScreen, performs: perform) + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showStartupScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showStartupScreen, performs: perform) } - public static func showLoginScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showLoginScreen, performs: perform) + public static func showLoginScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } - public static func showRegisterScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showRegisterScreen, performs: perform) + public static func showRegisterScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showForgotPasswordScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showForgotPasswordScreen, performs: perform) } - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter, perform: @escaping (String?, Bool) -> Void) -> Perform { - return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`), performs: perform) + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter, perform: @escaping (String?, LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`), performs: perform) } public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter, perform: @escaping (String, String, String, @escaping () -> Void, @escaping () -> Void, AlertViewType) -> Void) -> Perform { return Perform(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`), performs: perform) diff --git a/OpenEdX/DI/ScreenAssembly.swift b/OpenEdX/DI/ScreenAssembly.swift index b87fa2956..49be31f3d 100644 --- a/OpenEdX/DI/ScreenAssembly.swift +++ b/OpenEdX/DI/ScreenAssembly.swift @@ -34,40 +34,41 @@ class ScreenAssembly: Assembly { } // MARK: MainScreenView - container.register(MainScreenViewModel.self) { r in + container.register(MainScreenViewModel.self) { r, sourceScreen in MainScreenViewModel( analytics: r.resolve(MainScreenAnalytics.self)!, config: r.resolve(ConfigProtocol.self)!, - profileInteractor: r.resolve(ProfileInteractorProtocol.self)! + profileInteractor: r.resolve(ProfileInteractorProtocol.self)!, + sourceScreen: sourceScreen ) } // MARK: Startup screen container.register(StartupViewModel.self) { r in StartupViewModel( - interactor: r.resolve(AuthInteractorProtocol.self)!, - router: r.resolve(AuthorizationRouter.self)!, - analytics: r.resolve(AuthorizationAnalytics.self)! + router: r.resolve(AuthorizationRouter.self)! ) } // MARK: SignIn - container.register(SignInViewModel.self) { r in + container.register(SignInViewModel.self) { r, sourceScreen in SignInViewModel( interactor: r.resolve(AuthInteractorProtocol.self)!, router: r.resolve(AuthorizationRouter.self)!, config: r.resolve(ConfigProtocol.self)!, analytics: r.resolve(AuthorizationAnalytics.self)!, - validator: r.resolve(Validator.self)! + validator: r.resolve(Validator.self)!, + sourceScreen: sourceScreen ) } - container.register(SignUpViewModel.self) { r in + container.register(SignUpViewModel.self) { r, sourceScreen in SignUpViewModel( interactor: r.resolve(AuthInteractorProtocol.self)!, router: r.resolve(AuthorizationRouter.self)!, analytics: r.resolve(AuthorizationAnalytics.self)!, config: r.resolve(ConfigProtocol.self)!, cssInjector: r.resolve(CSSInjector.self)!, - validator: r.resolve(Validator.self)! + validator: r.resolve(Validator.self)!, + sourceScreen: sourceScreen ) } container.register(ResetPasswordViewModel.self) { r in @@ -103,7 +104,8 @@ class ScreenAssembly: Assembly { config: r.resolve(ConfigProtocol.self)!, interactor: r.resolve(DiscoveryInteractorProtocol.self)!, connectivity: r.resolve(ConnectivityProtocol.self)!, - analytics: r.resolve(DiscoveryAnalytics.self)! + analytics: r.resolve(DiscoveryAnalytics.self)!, + storage: r.resolve(CoreStorage.self)! ) } @@ -218,7 +220,8 @@ class ScreenAssembly: Assembly { analytics: r.resolve(CourseAnalytics.self)!, config: r.resolve(ConfigProtocol.self)!, cssInjector: r.resolve(CSSInjector.self)!, - connectivity: r.resolve(ConnectivityProtocol.self)! + connectivity: r.resolve(ConnectivityProtocol.self)!, + storage: r.resolve(CoreStorage.self)! ) } diff --git a/OpenEdX/RouteController.swift b/OpenEdX/RouteController.swift index d86e7bb6d..70bae693c 100644 --- a/OpenEdX/RouteController.swift +++ b/OpenEdX/RouteController.swift @@ -49,7 +49,12 @@ class RouteController: UIViewController { present(navigation, animated: false) } else { let controller = UIHostingController( - rootView: SignInView(viewModel: diContainer.resolve(SignInViewModel.self)!) + rootView: SignInView( + viewModel: diContainer.resolve( + SignInViewModel.self, + argument: LogistrationSourceScreen.default + )! + ) ) navigation.viewControllers = [controller] present(navigation, animated: false) @@ -74,7 +79,10 @@ class RouteController: UIViewController { let controller = UIHostingController(rootView: whatsNewView) navigation.viewControllers = [controller] } else { - let viewModel = Container.shared.resolve(MainScreenViewModel.self)! + let viewModel = Container.shared.resolve( + MainScreenViewModel.self, + argument: LogistrationSourceScreen.default + )! let controller = UIHostingController(rootView: MainScreenView(viewModel: viewModel)) navigation.viewControllers = [controller] } diff --git a/OpenEdX/Router.swift b/OpenEdX/Router.swift index a04b4c8fd..de07dd027 100644 --- a/OpenEdX/Router.swift +++ b/OpenEdX/Router.swift @@ -58,12 +58,12 @@ public class Router: AuthorizationRouter, navigationController.setViewControllers(viewControllers, animated: true) } - public func showMainOrWhatsNewScreen() { + public func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { showToolBar() var storage = Container.shared.resolve(WhatsNewStorage.self)! let config = Container.shared.resolve(ConfigProtocol.self)! - let viewModel = WhatsNewViewModel(storage: storage) + let viewModel = WhatsNewViewModel(storage: storage, sourceScreen: sourceScreen) let whatsNew = WhatsNewView(router: Container.shared.resolve(WhatsNewRouter.self)!, viewModel: viewModel) let shouldShowWhatsNew = viewModel.shouldShowWhatsNew() @@ -75,15 +75,25 @@ public class Router: AuthorizationRouter, navigationController.viewControllers = [controller] navigationController.setViewControllers([controller], animated: true) } else { - let viewModel = Container.shared.resolve(MainScreenViewModel.self)! + let viewModel = Container.shared.resolve( + MainScreenViewModel.self, + argument: sourceScreen + )! + + let controller = UIHostingController(rootView: MainScreenView(viewModel: viewModel)) navigationController.viewControllers = [controller] navigationController.setViewControllers([controller], animated: true) } } - public func showLoginScreen() { - let view = SignInView(viewModel: Container.shared.resolve(SignInViewModel.self)!) + public func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + guard let viewModel = Container.shared.resolve( + SignInViewModel.self, + argument: sourceScreen + ) else { return } + + let view = SignInView(viewModel: viewModel) let controller = UIHostingController(rootView: view) navigationController.pushViewController(controller, animated: true) } @@ -165,10 +175,19 @@ public class Router: AuthorizationRouter, navigationController.present(view, animated: true) } - public func showRegisterScreen() { - let view = SignUpView(viewModel: Container.shared.resolve(SignUpViewModel.self)!) + public func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + guard let viewModel = Container.shared.resolve( + SignUpViewModel.self, + argument: sourceScreen + ), let authAnalytics = Container.shared.resolve( + AuthorizationAnalytics.self + ) else { return } + + let view = SignUpView(viewModel: viewModel) let controller = UIHostingController(rootView: view) navigationController.pushViewController(controller, animated: true) + + authAnalytics.signUpClicked() } public func showForgotPasswordScreen() { @@ -195,12 +214,12 @@ public class Router: AuthorizationRouter, navigationController.pushFade(viewController: controller) } - public func showDiscoveryScreen(searchQuery: String? = nil, fromStartupScreen: Bool = false) { + public func showDiscoveryScreen(searchQuery: String? = nil, sourceScreen: LogistrationSourceScreen) { let view = DiscoveryView( viewModel: Container.shared.resolve(DiscoveryViewModel.self)!, router: Container.shared.resolve(DiscoveryRouter.self)!, searchQuery: searchQuery, - fromStartupScreen: fromStartupScreen + sourceScreen: sourceScreen ) let controller = UIHostingController(rootView: view) navigationController.pushViewController(controller, animated: true) diff --git a/OpenEdX/View/MainScreenView.swift b/OpenEdX/View/MainScreenView.swift index c7aeedba7..6f26a929e 100644 --- a/OpenEdX/View/MainScreenView.swift +++ b/OpenEdX/View/MainScreenView.swift @@ -42,8 +42,11 @@ struct MainScreenView: View { var body: some View { TabView(selection: $selection) { ZStack { - DiscoveryView(viewModel: Container.shared.resolve(DiscoveryViewModel.self)!, - router: Container.shared.resolve(DiscoveryRouter.self)!) + DiscoveryView( + viewModel: Container.shared.resolve(DiscoveryViewModel.self)!, + router: Container.shared.resolve(DiscoveryRouter.self)!, + sourceScreen: viewModel.sourceScreen + ) if updateAvaliable { UpdateNotificationView(config: viewModel.config) } diff --git a/OpenEdX/View/MainScreenViewModel.swift b/OpenEdX/View/MainScreenViewModel.swift index d45b3503c..1ee8beb7e 100644 --- a/OpenEdX/View/MainScreenViewModel.swift +++ b/OpenEdX/View/MainScreenViewModel.swift @@ -14,11 +14,17 @@ class MainScreenViewModel: ObservableObject { private let analytics: MainScreenAnalytics let config: ConfigProtocol let profileInteractor: ProfileInteractorProtocol + var sourceScreen: LogistrationSourceScreen - init(analytics: MainScreenAnalytics, config: ConfigProtocol, profileInteractor: ProfileInteractorProtocol) { + init(analytics: MainScreenAnalytics, + config: ConfigProtocol, + profileInteractor: ProfileInteractorProtocol, + sourceScreen: LogistrationSourceScreen = .default + ) { self.analytics = analytics self.config = config self.profileInteractor = profileInteractor + self.sourceScreen = sourceScreen } func trackMainDiscoveryTabClicked() { diff --git a/Profile/Profile.xcodeproj/project.pbxproj b/Profile/Profile.xcodeproj/project.pbxproj index 28dc8a604..f4ebc7e78 100644 --- a/Profile/Profile.xcodeproj/project.pbxproj +++ b/Profile/Profile.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ 02F3BFE7292539850051930C /* ProfileRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F3BFE6292539850051930C /* ProfileRouter.swift */; }; 0796C8C929B7905300444B05 /* ProfileBottomSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0796C8C829B7905300444B05 /* ProfileBottomSheet.swift */; }; 25B36FF48C1307888A3890DA /* Pods_App_Profile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BEA369C38362C1A91A012F70 /* Pods_App_Profile.framework */; }; + BAD9CA3F2B29BF5C00DE790A /* ProfileSupportInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAD9CA3E2B29BF5C00DE790A /* ProfileSupportInfoView.swift */; }; E8264C634DD8AD314ECE8905 /* Pods_App_Profile_ProfileTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C85ADF87135E03275A980E07 /* Pods_App_Profile_ProfileTests.framework */; }; /* End PBXBuildFile section */ @@ -94,6 +95,7 @@ 9D125F82E0EAC4B6C0CE280F /* Pods-App-Profile-ProfileTests.releaseprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Profile-ProfileTests.releaseprod.xcconfig"; path = "Target Support Files/Pods-App-Profile-ProfileTests/Pods-App-Profile-ProfileTests.releaseprod.xcconfig"; sourceTree = ""; }; A9F98CD65D1F657EB8F9EA59 /* Pods-App-Profile.releasedev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Profile.releasedev.xcconfig"; path = "Target Support Files/Pods-App-Profile/Pods-App-Profile.releasedev.xcconfig"; sourceTree = ""; }; B3F05DC21379BD4FE1AFCCF1 /* Pods-App-Profile.debugprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Profile.debugprod.xcconfig"; path = "Target Support Files/Pods-App-Profile/Pods-App-Profile.debugprod.xcconfig"; sourceTree = ""; }; + BAD9CA3E2B29BF5C00DE790A /* ProfileSupportInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileSupportInfoView.swift; sourceTree = ""; }; BEA369C38362C1A91A012F70 /* Pods_App_Profile.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App_Profile.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C85ADF87135E03275A980E07 /* Pods_App_Profile_ProfileTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App_Profile_ProfileTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F52EFE7DC07BE68B9A302DAF /* Pods-App-Profile.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Profile.debug.xcconfig"; path = "Target Support Files/Pods-App-Profile/Pods-App-Profile.debug.xcconfig"; sourceTree = ""; }; @@ -135,6 +137,7 @@ 0203DC3D29AE79F80017BD05 /* Profile */ = { isa = PBXGroup; children = ( + BAD9CA402B29D6CD00DE790A /* Subviews */, 02D0FD072AD695E10020D752 /* UserProfile */, 021D924528DC634300ACC565 /* ProfileView.swift */, 021D925128DC918D00ACC565 /* ProfileViewModel.swift */, @@ -342,6 +345,14 @@ path = ../Pods; sourceTree = ""; }; + BAD9CA402B29D6CD00DE790A /* Subviews */ = { + isa = PBXGroup; + children = ( + BAD9CA3E2B29BF5C00DE790A /* ProfileSupportInfoView.swift */, + ); + path = Subviews; + sourceTree = ""; + }; C456081FB065DCEDAB8119E4 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -563,6 +574,7 @@ 021D924E28DC88BB00ACC565 /* ProfileRepository.swift in Sources */, 0796C8C929B7905300444B05 /* ProfileBottomSheet.swift in Sources */, 021D924C28DC884A00ACC565 /* ProfileEndpoint.swift in Sources */, + BAD9CA3F2B29BF5C00DE790A /* ProfileSupportInfoView.swift in Sources */, 020306C82932B13F000949EA /* EditProfileView.swift in Sources */, 0262149229AE57A1008BD75A /* DeleteAccountView.swift in Sources */, 02D0FD092AD698380020D752 /* UserProfileView.swift in Sources */, diff --git a/Profile/Profile/Presentation/DeleteAccount/DeleteAccountViewModel.swift b/Profile/Profile/Presentation/DeleteAccount/DeleteAccountViewModel.swift index c5f464d6d..2cece2de0 100644 --- a/Profile/Profile/Presentation/DeleteAccount/DeleteAccountViewModel.swift +++ b/Profile/Profile/Presentation/DeleteAccount/DeleteAccountViewModel.swift @@ -40,7 +40,7 @@ public class DeleteAccountViewModel: ObservableObject { do { if try await interactor.deleteAccount(password: password) { isShowProgress = false - router.showLoginScreen() + router.showLoginScreen(sourceScreen: .default) } else { isShowProgress = false incorrectPassword = true diff --git a/Profile/Profile/Presentation/Profile/ProfileView.swift b/Profile/Profile/Presentation/Profile/ProfileView.swift index 431a94e12..0450da9c8 100644 --- a/Profile/Profile/Presentation/Profile/ProfileView.swift +++ b/Profile/Profile/Presentation/Profile/ProfileView.swift @@ -11,10 +11,10 @@ import Kingfisher import Theme public struct ProfileView: View { - + @StateObject private var viewModel: ProfileViewModel @Binding var settingsTapped: Bool - + public init(viewModel: ProfileViewModel, settingsTapped: Binding) { self._viewModel = StateObject(wrappedValue: { viewModel }()) self._settingsTapped = settingsTapped @@ -23,280 +23,53 @@ public struct ProfileView: View { public var body: some View { ZStack(alignment: .top) { // MARK: - Page Body - RefreshableScrollViewCompat(action: { - await viewModel.getMyProfile(withProgress: false) - }) { - VStack { - if viewModel.isShowProgress { - ProgressBar(size: 40, lineWidth: 8) - .padding(.top, 200) - .padding(.horizontal) - } else { - UserAvatar(url: viewModel.userModel?.avatarUrl ?? "", image: $viewModel.updatedAvatar) - .padding(.top, 30) - Text(viewModel.userModel?.name ?? "") - .font(Theme.Fonts.headlineSmall) - .padding(.top, 20) - - Text("@\(viewModel.userModel?.username ?? "")") - .font(Theme.Fonts.labelLarge) - .padding(.top, 4) - .foregroundColor(Theme.Colors.textSecondary) - .padding(.bottom, 10) - - // MARK: - Profile Info - if viewModel.userModel?.yearOfBirth != 0 || viewModel.userModel?.shortBiography != "" { - VStack(alignment: .leading, spacing: 14) { - Text(ProfileLocalization.info) - .padding(.horizontal, 24) - .font(Theme.Fonts.labelLarge) - - VStack(alignment: .leading, spacing: 16) { - if viewModel.userModel?.yearOfBirth != 0 { - HStack { - Text(ProfileLocalization.Edit.Fields.yearOfBirth) - .foregroundColor(Theme.Colors.textSecondary) - Text(String(viewModel.userModel?.yearOfBirth ?? 0)) - } - } - if let bio = viewModel.userModel?.shortBiography, bio != "" { - HStack(alignment: .top) { - Text(ProfileLocalization.bio + " ") - .foregroundColor(Theme.Colors.textSecondary) - + Text(bio) - } - } - } - .accessibilityElement(children: .ignore) - .accessibilityLabel( - (viewModel.userModel?.yearOfBirth != 0 ? - ProfileLocalization.Edit.Fields.yearOfBirth + String(viewModel.userModel?.yearOfBirth ?? 0) : - "") + - (viewModel.userModel?.shortBiography != nil ? - ProfileLocalization.bio + (viewModel.userModel?.shortBiography ?? "") : - "") - ) - .cardStyle( - bgColor: Theme.Colors.textInputUnfocusedBackground, - strokeColor: .clear - ) - }.padding(.bottom, 16) + RefreshableScrollViewCompat( + action: { + await viewModel.getMyProfile(withProgress: false) + }, + content: content + ) + .accessibilityAction {} + .frameLimit(sizePortrait: 420) + .padding(.top, 8) + .onChange(of: settingsTapped, perform: { _ in + let userModel = viewModel.userModel ?? UserProfile() + viewModel.trackProfileEditClicked() + viewModel.router.showEditProfile( + userModel: userModel, + avatar: viewModel.updatedAvatar, + profileDidEdit: { updatedProfile, updatedImage in + if let updatedProfile { + self.viewModel.userModel = updatedProfile } - - VStack(alignment: .leading, spacing: 14) { - // MARK: - Settings - Text(ProfileLocalization.settings) - .padding(.horizontal, 24) - .font(Theme.Fonts.labelLarge) - VStack(alignment: .leading, spacing: 27) { - Button(action: { - viewModel.trackProfileVideoSettingsClicked() - viewModel.router.showSettings() - }, label: { - HStack { - Text(ProfileLocalization.settingsVideo) - Spacer() - Image(systemName: "chevron.right") - } - }) - - } - .accessibilityElement(children: .ignore) - .accessibilityLabel(ProfileLocalization.settingsVideo) - .cardStyle( - bgColor: Theme.Colors.textInputUnfocusedBackground, - strokeColor: .clear - ) - - // MARK: - Support info - Text(ProfileLocalization.supportInfo) - .padding(.horizontal, 24) - .font(Theme.Fonts.labelLarge) - VStack(alignment: .leading, spacing: 24) { - if let support = viewModel.contactSupport() { - Button(action: { - viewModel.trackEmailSupportClicked() - UIApplication.shared.open(support) - }, label: { - HStack { - Text(ProfileLocalization.contact) - Spacer() - Image(systemName: "chevron.right") - } - }) - .buttonStyle(PlainButtonStyle()) - .foregroundColor(.primary) - .accessibilityElement(children: .ignore) - .accessibilityLabel(ProfileLocalization.supportInfo) - Rectangle() - .frame(height: 1) - .foregroundColor(Theme.Colors.textSecondary) - } - - if let tos = viewModel.config.agreement.tosURL { - Button(action: { - viewModel.trackCookiePolicyClicked() - UIApplication.shared.open(tos) - }, label: { - HStack { - Text(ProfileLocalization.terms) - Spacer() - Image(systemName: "chevron.right") - } - }) - .buttonStyle(PlainButtonStyle()) - .foregroundColor(.primary) - .accessibilityElement(children: .ignore) - .accessibilityLabel(ProfileLocalization.terms) - Rectangle() - .frame(height: 1) - .foregroundColor(Theme.Colors.textSecondary) - } - - if let privacy = viewModel.config.agreement.privacyPolicyURL { - Button(action: { - viewModel.trackPrivacyPolicyClicked() - UIApplication.shared.open(privacy) - }, label: { - HStack { - Text(ProfileLocalization.privacy) - Spacer() - Image(systemName: "chevron.right") - } - }) - .buttonStyle(PlainButtonStyle()) - .foregroundColor(.primary) - .accessibilityElement(children: .ignore) - .accessibilityLabel(ProfileLocalization.privacy) - } - - // MARK: Version - Rectangle() - .frame(height: 1) - .foregroundColor(Theme.Colors.textSecondary) - Button(action: { - viewModel.openAppStore() - }, label: { - HStack { - VStack(alignment: .leading, spacing: 0) { - HStack { - if viewModel.versionState == .updateRequired { - CoreAssets.warningFilled.swiftUIImage - .resizable() - .frame(width: 24, height: 24) - } - Text("\(ProfileLocalization.Settings.version) \(viewModel.currentVersion)") - } - switch viewModel.versionState { - case .actual: - HStack { - CoreAssets.checkmark.swiftUIImage - .renderingMode(.template) - .foregroundColor(.green) - Text(ProfileLocalization.Settings.upToDate) - .font(Theme.Fonts.labelMedium) - .foregroundStyle(Theme.Colors.textSecondary) - } - case .updateNeeded: - Text("\(ProfileLocalization.Settings.tapToUpdate) \(viewModel.latestVersion)") - .font(Theme.Fonts.labelMedium) - .foregroundStyle(Theme.Colors.accentColor) - case .updateRequired: - Text(ProfileLocalization.Settings.tapToInstall) - .font(Theme.Fonts.labelMedium) - .foregroundStyle(Theme.Colors.accentColor) - } - } - Spacer() - if viewModel.versionState != .actual { - Image(systemName: "arrow.up.circle") - .resizable() - .frame(width: 24, height: 24) - .foregroundStyle(Theme.Colors.accentColor) - } - - } - }).disabled(viewModel.versionState == .actual) - - }.cardStyle( - bgColor: Theme.Colors.textInputUnfocusedBackground, - strokeColor: .clear - ) - - // MARK: - Log out - VStack { - Button(action: { - viewModel.router.presentView(transitionStyle: .crossDissolve) { - AlertView( - alertTitle: ProfileLocalization.LogoutAlert.title, - alertMessage: ProfileLocalization.LogoutAlert.text, - positiveAction: CoreLocalization.Alert.accept, - onCloseTapped: { - viewModel.router.dismiss(animated: true) - }, - okTapped: { - viewModel.router.dismiss(animated: true) - Task { - await viewModel.logOut() - } - }, type: .logOut - ) - } - }, label: { - HStack { - Text(ProfileLocalization.logout) - Spacer() - Image(systemName: "rectangle.portrait.and.arrow.right") - } - }) - .accessibilityElement(children: .ignore) - .accessibilityLabel(ProfileLocalization.logout) - } - .foregroundColor(Theme.Colors.alert) - .cardStyle(bgColor: Theme.Colors.textInputUnfocusedBackground, - strokeColor: .clear) - .padding(.top, 24) - .padding(.bottom, 60) + if let updatedImage { + self.viewModel.updatedAvatar = updatedImage } - Spacer() } - } - }.accessibilityAction {} - .frameLimit(sizePortrait: 420) - .padding(.top, 8) - .onChange(of: settingsTapped, perform: { _ in - let userModel = viewModel.userModel ?? UserProfile() - viewModel.trackProfileEditClicked() - viewModel.router.showEditProfile( - userModel: userModel, - avatar: viewModel.updatedAvatar, - profileDidEdit: { updatedProfile, updatedImage in - if let updatedProfile { - self.viewModel.userModel = updatedProfile - } - if let updatedImage { - self.viewModel.updatedAvatar = updatedImage - } - } - ) - }) - .navigationBarHidden(false) - .navigationBarBackButtonHidden(false) - - // MARK: - Offline mode SnackBar - OfflineSnackBarView(connectivity: viewModel.connectivity, - reloadAction: { - await viewModel.getMyProfile(withProgress: false) + ) }) - + .navigationBarHidden(false) + .navigationBarBackButtonHidden(false) + + // MARK: - Offline mode SnackBar + OfflineSnackBarView( + connectivity: viewModel.connectivity, + reloadAction: { + await viewModel.getMyProfile(withProgress: false) + } + ) + // MARK: - Error Alert if viewModel.showError { VStack { Spacer() SnackBarView(message: viewModel.errorMessage) } - .padding(.bottom, viewModel.connectivity.isInternetAvaliable - ? 0 : OfflineSnackBarView.height) + .padding( + .bottom, + viewModel.connectivity.isInternetAvaliable + ? 0 : OfflineSnackBarView.height + ) .transition(.move(edge: .bottom)) .onAppear { doAfter(Theme.Timeout.snackbarMessageLongTimeout) { @@ -315,6 +88,149 @@ public struct ProfileView: View { .ignoresSafeArea() ) } + + private var progressBar: some View { + ProgressBar(size: 40, lineWidth: 8) + .padding(.top, 200) + .padding(.horizontal) + } + + private func content() -> some View { + VStack { + if viewModel.isShowProgress { + ProgressBar(size: 40, lineWidth: 8) + .padding(.top, 200) + .padding(.horizontal) + } else { + UserAvatar(url: viewModel.userModel?.avatarUrl ?? "", image: $viewModel.updatedAvatar) + .padding(.top, 30) + Text(viewModel.userModel?.name ?? "") + .font(Theme.Fonts.headlineSmall) + .padding(.top, 20) + Text("@\(viewModel.userModel?.username ?? "")") + .font(Theme.Fonts.labelLarge) + .padding(.top, 4) + .foregroundColor(Theme.Colors.textSecondary) + .padding(.bottom, 10) + profileInfo + VStack(alignment: .leading, spacing: 14) { + settings + ProfileSupportInfoView(viewModel: viewModel) + logOutButton + } + Spacer() + } + } + } + + // MARK: - Profile Info + + @ViewBuilder + private var profileInfo: some View { + if viewModel.userModel?.yearOfBirth != 0 || viewModel.userModel?.shortBiography != "" { + VStack(alignment: .leading, spacing: 14) { + Text(ProfileLocalization.info) + .padding(.horizontal, 24) + .font(Theme.Fonts.labelLarge) + + VStack(alignment: .leading, spacing: 16) { + if viewModel.userModel?.yearOfBirth != 0 { + HStack { + Text(ProfileLocalization.Edit.Fields.yearOfBirth) + .foregroundColor(Theme.Colors.textSecondary) + Text(String(viewModel.userModel?.yearOfBirth ?? 0)) + } + } + if let bio = viewModel.userModel?.shortBiography, bio != "" { + HStack(alignment: .top) { + Text(ProfileLocalization.bio + " ") + .foregroundColor(Theme.Colors.textSecondary) + + Text(bio) + } + } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel( + (viewModel.userModel?.yearOfBirth != 0 ? + ProfileLocalization.Edit.Fields.yearOfBirth + String(viewModel.userModel?.yearOfBirth ?? 0) : + "") + + (viewModel.userModel?.shortBiography != nil ? + ProfileLocalization.bio + (viewModel.userModel?.shortBiography ?? "") : + "") + ) + .cardStyle( + bgColor: Theme.Colors.textInputUnfocusedBackground, + strokeColor: .clear + ) + }.padding(.bottom, 16) + } + } + + // MARK: - Settings + + @ViewBuilder + private var settings: some View { + Text(ProfileLocalization.settings) + .padding(.horizontal, 24) + .font(Theme.Fonts.labelLarge) + VStack(alignment: .leading, spacing: 27) { + Button(action: { + viewModel.trackProfileVideoSettingsClicked() + viewModel.router.showSettings() + }, label: { + HStack { + Text(ProfileLocalization.settingsVideo) + Spacer() + Image(systemName: "chevron.right") + } + }) + + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(ProfileLocalization.settingsVideo) + .cardStyle( + bgColor: Theme.Colors.textInputUnfocusedBackground, + strokeColor: .clear + ) + } + + // MARK: - Log out + + private var logOutButton: some View { + VStack { + Button(action: { + viewModel.router.presentView(transitionStyle: .crossDissolve) { + AlertView( + alertTitle: ProfileLocalization.LogoutAlert.title, + alertMessage: ProfileLocalization.LogoutAlert.text, + positiveAction: CoreLocalization.Alert.accept, + onCloseTapped: { + viewModel.router.dismiss(animated: true) + }, + okTapped: { + viewModel.router.dismiss(animated: true) + Task { + await viewModel.logOut() + } + }, type: .logOut + ) + } + }, label: { + HStack { + Text(ProfileLocalization.logout) + Spacer() + Image(systemName: "rectangle.portrait.and.arrow.right") + } + }) + .accessibilityElement(children: .ignore) + .accessibilityLabel(ProfileLocalization.logout) + } + .foregroundColor(Theme.Colors.alert) + .cardStyle(bgColor: Theme.Colors.textInputUnfocusedBackground, + strokeColor: .clear) + .padding(.top, 24) + .padding(.bottom, 60) + } } #if DEBUG @@ -326,12 +242,12 @@ struct ProfileView_Previews: PreviewProvider { analytics: ProfileAnalyticsMock(), config: ConfigMock(), connectivity: Connectivity()) - + ProfileView(viewModel: vm, settingsTapped: .constant(false)) .preferredColorScheme(.light) .previewDisplayName("DiscoveryView Light") .loadFonts() - + ProfileView(viewModel: vm, settingsTapped: .constant(false)) .preferredColorScheme(.dark) .previewDisplayName("DiscoveryView Dark") @@ -341,10 +257,10 @@ struct ProfileView_Previews: PreviewProvider { #endif struct UserAvatar: View { - + private var url: URL? @Binding private var image: UIImage? - + init(url: String, image: Binding) { if let rightUrl = URL(string: url) { self.url = rightUrl @@ -353,7 +269,7 @@ struct UserAvatar: View { } self._image = image } - + var body: some View { ZStack { Circle() diff --git a/Profile/Profile/Presentation/Profile/Subviews/ProfileSupportInfoView.swift b/Profile/Profile/Presentation/Profile/Subviews/ProfileSupportInfoView.swift new file mode 100644 index 000000000..39485ab72 --- /dev/null +++ b/Profile/Profile/Presentation/Profile/Subviews/ProfileSupportInfoView.swift @@ -0,0 +1,195 @@ +// +// ProfileSupportInfo.swift +// Profile +// +// Created by Eugene Yatsenko on 13.12.2023. +// + +import SwiftUI +import Theme +import Core + +struct ProfileSupportInfoView: View { + + struct LinkViewModel { + let url: URL + let title: String + } + + @ObservedObject var viewModel: ProfileViewModel + + var body: some View { + Text(ProfileLocalization.supportInfo) + .padding(.horizontal, 24) + .font(Theme.Fonts.labelLarge) + VStack(alignment: .leading, spacing: 24) { + viewModel.contactSupport().map(supportInfo) + viewModel.config.agreement.tosURL.map(terms) + viewModel.config.agreement.privacyPolicyURL.map(privacy) + viewModel.config.agreement.cookiePolicyURL.map(cookiePolicy) + viewModel.config.agreement.dataSellContentURL.map(dataSellContent) + viewModel.config.faq.map(faq) + version + } + .cardStyle( + bgColor: Theme.Colors.textInputUnfocusedBackground, + strokeColor: .clear + ) + } + + private func supportInfo(url: URL) -> some View { + button( + linkViewModel: .init( + url: url, + title: ProfileLocalization.contact + ), + isEmailSupport: true + ) + + } + + private func terms(url: URL) -> some View { + navigationLink( + viewModel: .init( + url: url, + title: ProfileLocalization.terms + ) + ) + } + + private func privacy(url: URL) -> some View { + navigationLink( + viewModel: .init( + url: url, + title: ProfileLocalization.privacy + ) + ) + } + + private func cookiePolicy(url: URL) -> some View { + navigationLink( + viewModel: .init( + url: url, + title: ProfileLocalization.cookiePolicy + ) + ) + } + + private func dataSellContent(url: URL) -> some View { + navigationLink( + viewModel: .init( + url: url, + title: ProfileLocalization.doNotSellInformation + ) + ) + } + + private func faq(url: URL) -> some View { + button( + linkViewModel: .init( + url: url, + title: ProfileLocalization.faq + ) + ) + } + + @ViewBuilder + private func navigationLink(viewModel: LinkViewModel) -> some View { + NavigationLink { + WebBrowser( + url: viewModel.url.absoluteString, + pageTitle: viewModel.title, + showProgress: true + ) + } label: { + HStack { + Text(viewModel.title) + .multilineTextAlignment(.leading) + Spacer() + Image(systemName: "chevron.right") + } + } + .foregroundColor(.primary) + .accessibilityElement(children: .ignore) + .accessibilityLabel(viewModel.title) + Rectangle() + .frame(height: 1) + .foregroundColor(Theme.Colors.textSecondary) + } + + @ViewBuilder + private func button(linkViewModel: LinkViewModel, isEmailSupport: Bool = false) -> some View { + Button { + guard UIApplication.shared.canOpenURL(linkViewModel.url) else { + viewModel.errorMessage = isEmailSupport ? + ProfileLocalization.Error.cannotSendEmail : + CoreLocalization.Error.unknownError + return + } + if isEmailSupport { + viewModel.trackEmailSupportClicked() + } + UIApplication.shared.open(linkViewModel.url) + } label: { + HStack { + Text(linkViewModel.title) + Spacer() + Image(systemName: "chevron.right") + } + } + .foregroundColor(.primary) + .accessibilityElement(children: .ignore) + .accessibilityLabel(linkViewModel.title) + Rectangle() + .frame(height: 1) + .foregroundColor(Theme.Colors.textSecondary) + } + + @ViewBuilder + private var version: some View { + Button(action: { + viewModel.openAppStore() + }, label: { + HStack { + VStack(alignment: .leading, spacing: 0) { + HStack { + if viewModel.versionState == .updateRequired { + CoreAssets.warningFilled.swiftUIImage + .resizable() + .frame(width: 24, height: 24) + } + Text("\(ProfileLocalization.Settings.version) \(viewModel.currentVersion)") + } + switch viewModel.versionState { + case .actual: + HStack { + CoreAssets.checkmark.swiftUIImage + .renderingMode(.template) + .foregroundColor(.green) + Text(ProfileLocalization.Settings.upToDate) + .font(Theme.Fonts.labelMedium) + .foregroundStyle(Theme.Colors.textSecondary) + } + case .updateNeeded: + Text("\(ProfileLocalization.Settings.tapToUpdate) \(viewModel.latestVersion)") + .font(Theme.Fonts.labelMedium) + .foregroundStyle(Theme.Colors.accentColor) + case .updateRequired: + Text(ProfileLocalization.Settings.tapToInstall) + .font(Theme.Fonts.labelMedium) + .foregroundStyle(Theme.Colors.accentColor) + } + } + Spacer() + if viewModel.versionState != .actual { + Image(systemName: "arrow.up.circle") + .resizable() + .frame(width: 24, height: 24) + .foregroundStyle(Theme.Colors.accentColor) + } + + } + }).disabled(viewModel.versionState == .actual) + } + +} diff --git a/Profile/Profile/SwiftGen/Strings.swift b/Profile/Profile/SwiftGen/Strings.swift index 8ff79c726..52019109a 100644 --- a/Profile/Profile/SwiftGen/Strings.swift +++ b/Profile/Profile/SwiftGen/Strings.swift @@ -14,8 +14,14 @@ public enum ProfileLocalization { public static let bio = ProfileLocalization.tr("Localizable", "BIO", fallback: "Bio:") /// Contact support public static let contact = ProfileLocalization.tr("Localizable", "CONTACT", fallback: "Contact support") + /// Cookie policy + public static let cookiePolicy = ProfileLocalization.tr("Localizable", "COOKIE_POLICY", fallback: "Cookie policy") + /// Do not sell my personal information + public static let doNotSellInformation = ProfileLocalization.tr("Localizable", "DO_NOT_SELL_INFORMATION", fallback: "Do not sell my personal information") /// Edit profile public static let editProfile = ProfileLocalization.tr("Localizable", "EDIT_PROFILE", fallback: "Edit profile") + /// FAQ + public static let faq = ProfileLocalization.tr("Localizable", "FAQ", fallback: "FAQ") /// full profile public static let fullProfile = ProfileLocalization.tr("Localizable", "FULL_PROFILE", fallback: "full profile") /// Profile info @@ -24,8 +30,8 @@ public enum ProfileLocalization { public static let limitedProfile = ProfileLocalization.tr("Localizable", "LIMITED_PROFILE", fallback: "limited profile") /// Log out public static let logout = ProfileLocalization.tr("Localizable", "LOGOUT", fallback: "Log out") - /// Privacy and policy - public static let privacy = ProfileLocalization.tr("Localizable", "PRIVACY", fallback: "Privacy and policy") + /// Privacy policy + public static let privacy = ProfileLocalization.tr("Localizable", "PRIVACY", fallback: "Privacy policy") /// Settings public static let settings = ProfileLocalization.tr("Localizable", "SETTINGS", fallback: "Settings") /// Video settings @@ -97,6 +103,10 @@ public enum ProfileLocalization { public static let yearOfBirth = ProfileLocalization.tr("Localizable", "EDIT.FIELDS.YEAR_OF_BIRTH", fallback: "Year of birth") } } + public enum Error { + /// Cannot send email. It seems your email client is not set up. + public static let cannotSendEmail = ProfileLocalization.tr("Localizable", "ERROR.CANNOT_SEND_EMAIL", fallback: "Cannot send email. It seems your email client is not set up.") + } public enum LogoutAlert { /// Are you sure you want to log out? public static let text = ProfileLocalization.tr("Localizable", "LOGOUT_ALERT.TEXT", fallback: "Are you sure you want to log out?") diff --git a/Profile/Profile/en.lproj/Localizable.strings b/Profile/Profile/en.lproj/Localizable.strings index c626255de..80feaed87 100644 --- a/Profile/Profile/en.lproj/Localizable.strings +++ b/Profile/Profile/en.lproj/Localizable.strings @@ -16,7 +16,11 @@ "SUPPORT_INFO" = "Support info"; "CONTACT" = "Contact support"; "TERMS" = "Terms of use"; -"PRIVACY" = "Privacy and policy"; +"PRIVACY" = "Privacy policy"; +"COOKIE_POLICY" = "Cookie policy"; +"DO_NOT_SELL_INFORMATION" = "Do not sell my personal information"; +"FAQ" = "FAQ"; + "LOGOUT" = "Log out"; "SWITCH_TO" = "Switch to"; "FULL_PROFILE" = "full profile"; @@ -73,3 +77,5 @@ "SETTINGS.UP_TO_DATE" = "Up-to-date"; "SETTINGS.TAP_TO_UPDATE" = "Tap to update to version"; "SETTINGS.TAP_TO_INSTALL" = "Tap to install required app update"; + +"ERROR.CANNOT_SEND_EMAIL" = "Cannot send email. It seems your email client is not set up."; diff --git a/Profile/Profile/uk.lproj/Localizable.strings b/Profile/Profile/uk.lproj/Localizable.strings index 8b5df15fd..b3f91c924 100644 --- a/Profile/Profile/uk.lproj/Localizable.strings +++ b/Profile/Profile/uk.lproj/Localizable.strings @@ -17,6 +17,9 @@ "CONTACT" = "Cлужби підтримки"; "TERMS" = "Умови використання"; "PRIVACY" = "Політика конфіденційності"; +"COOKIE_POLICY" = "Cookie policy"; +"DO_NOT_SELL_INFORMATION" = "Do not sell my personal information"; +"FAQ" = "FAQ"; "LOGOUT" = "Вийти"; "SWITCH_TO" = "Переключити на"; "FULL_PROFILE" = "повний профіль"; @@ -73,3 +76,5 @@ "SETTINGS.UP_TO_DATE" = "Оновлено"; "SETTINGS.TAP_TO_UPDATE" = "Клацніть, щоб оновити до версії"; "SETTINGS.TAP_TO_INSTALL" = "Клацніть, щоб встановити обов'язкове оновлення програми"; + +"ERROR.CANNOT_SEND_EMAIL" = "Cannot send email. It seems your email client is not set up."; diff --git a/Profile/ProfileTests/Presentation/DeleteAccount/DeleteAccountViewModelTests.swift b/Profile/ProfileTests/Presentation/DeleteAccount/DeleteAccountViewModelTests.swift index 8b4576950..ca284bdf8 100644 --- a/Profile/ProfileTests/Presentation/DeleteAccount/DeleteAccountViewModelTests.swift +++ b/Profile/ProfileTests/Presentation/DeleteAccount/DeleteAccountViewModelTests.swift @@ -25,7 +25,7 @@ final class DeleteAccountViewModelTests: XCTestCase { try await viewModel.deleteAccount(password: "123") Verify(interactor, 1, .deleteAccount(password: .any)) - Verify(router, .showLoginScreen()) + Verify(router, .showLoginScreen(sourceScreen: .any)) } func testDeletingAccountWrongPassword() async throws { @@ -39,7 +39,7 @@ final class DeleteAccountViewModelTests: XCTestCase { try await viewModel.deleteAccount(password: "123") Verify(interactor, 1, .deleteAccount(password: .any)) - Verify(router, 0, .showLoginScreen()) + Verify(router, 0, .showLoginScreen(sourceScreen: .any)) XCTAssertTrue(viewModel.incorrectPassword) } @@ -60,7 +60,7 @@ final class DeleteAccountViewModelTests: XCTestCase { try await viewModel.deleteAccount(password: "123") Verify(interactor, 1, .deleteAccount(password: .any)) - Verify(router, 0, .showLoginScreen()) + Verify(router, 0, .showLoginScreen(sourceScreen: .any)) XCTAssertFalse(viewModel.incorrectPassword) XCTAssertTrue(viewModel.showError) @@ -78,7 +78,7 @@ final class DeleteAccountViewModelTests: XCTestCase { try await viewModel.deleteAccount(password: "123") Verify(interactor, 1, .deleteAccount(password: .any)) - Verify(router, 0, .showLoginScreen()) + Verify(router, 0, .showLoginScreen(sourceScreen: .any)) XCTAssertFalse(viewModel.incorrectPassword) XCTAssertTrue(viewModel.showError) @@ -98,7 +98,7 @@ final class DeleteAccountViewModelTests: XCTestCase { try await viewModel.deleteAccount(password: "123") Verify(interactor, 1, .deleteAccount(password: .any)) - Verify(router, 0, .showLoginScreen()) + Verify(router, 0, .showLoginScreen(sourceScreen: .any)) XCTAssertFalse(viewModel.incorrectPassword) XCTAssertTrue(viewModel.showError) diff --git a/Profile/ProfileTests/ProfileMock.generated.swift b/Profile/ProfileTests/ProfileMock.generated.swift index 69aff547e..5b85e5b1a 100644 --- a/Profile/ProfileTests/ProfileMock.generated.swift +++ b/Profile/ProfileTests/ProfileMock.generated.swift @@ -539,10 +539,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?(`controllers`) } - open func showMainOrWhatsNewScreen() { - addInvocation(.m_showMainOrWhatsNewScreen) - let perform = methodPerformValue(.m_showMainOrWhatsNewScreen) as? () -> Void - perform?() + open func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showStartupScreen() { @@ -551,16 +551,16 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showLoginScreen() { - addInvocation(.m_showLoginScreen) - let perform = methodPerformValue(.m_showLoginScreen) as? () -> Void - perform?() + open func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } - open func showRegisterScreen() { - addInvocation(.m_showRegisterScreen) - let perform = methodPerformValue(.m_showRegisterScreen) as? () -> Void - perform?() + open func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showForgotPasswordScreen() { @@ -569,10 +569,10 @@ open class BaseRouterMock: BaseRouter, Mock { perform?() } - open func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) { - addInvocation(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) - let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) as? (String?, Bool) -> Void - perform?(`searchQuery`, `fromStartupScreen`) + open func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) as? (String?, LogistrationSourceScreen) -> Void + perform?(`searchQuery`, `sourceScreen`) } open func presentAlert(alertTitle: String, alertMessage: String, positiveAction: String, onCloseTapped: @escaping () -> Void, okTapped: @escaping () -> Void, type: AlertViewType) { @@ -606,12 +606,12 @@ open class BaseRouterMock: BaseRouter, Mock { case m_backWithFade case m_dismiss__animated_animated(Parameter) case m_removeLastView__controllers_controllers(Parameter) - case m_showMainOrWhatsNewScreen + case m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter) case m_showStartupScreen - case m_showLoginScreen - case m_showRegisterScreen + case m_showLoginScreen__sourceScreen_sourceScreen(Parameter) + case m_showRegisterScreen__sourceScreen_sourceScreen(Parameter) case m_showForgotPasswordScreen - case m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter, Parameter) + case m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(Parameter, Parameter, Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter<() -> Void>) case m_presentView__transitionStyle_transitionStyleview_view(Parameter, Parameter) @@ -641,20 +641,29 @@ open class BaseRouterMock: BaseRouter, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsControllers, rhs: rhsControllers, with: matcher), lhsControllers, rhsControllers, "controllers")) return Matcher.ComparisonResult(results) - case (.m_showMainOrWhatsNewScreen, .m_showMainOrWhatsNewScreen): return .match + case (.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showStartupScreen, .m_showStartupScreen): return .match - case (.m_showLoginScreen, .m_showLoginScreen): return .match + case (.m_showLoginScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showLoginScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) - case (.m_showRegisterScreen, .m_showRegisterScreen): return .match + case (.m_showRegisterScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showRegisterScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showForgotPasswordScreen, .m_showForgotPasswordScreen): return .match - case (.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let lhsSearchquery, let lhsFromstartupscreen), .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let rhsSearchquery, let rhsFromstartupscreen)): + case (.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let lhsSearchquery, let lhsSourcescreen), .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let rhsSearchquery, let rhsSourcescreen)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSearchquery, rhs: rhsSearchquery, with: matcher), lhsSearchquery, rhsSearchquery, "searchQuery")) - results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFromstartupscreen, rhs: rhsFromstartupscreen, with: matcher), lhsFromstartupscreen, rhsFromstartupscreen, "fromStartupScreen")) + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) return Matcher.ComparisonResult(results) case (.m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let lhsAlerttitle, let lhsAlertmessage, let lhsPositiveaction, let lhsOnclosetapped, let lhsOktapped, let lhsType), .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let rhsAlerttitle, let rhsAlertmessage, let rhsPositiveaction, let rhsOnclosetapped, let rhsOktapped, let rhsType)): @@ -701,12 +710,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return 0 case let .m_dismiss__animated_animated(p0): return p0.intValue case let .m_removeLastView__controllers_controllers(p0): return p0.intValue - case .m_showMainOrWhatsNewScreen: return 0 + case let .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showStartupScreen: return 0 - case .m_showLoginScreen: return 0 - case .m_showRegisterScreen: return 0 + case let .m_showLoginScreen__sourceScreen_sourceScreen(p0): return p0.intValue + case let .m_showRegisterScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showForgotPasswordScreen: return 0 - case let .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(p0, p1): return p0.intValue + p1.intValue + case let .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(p0, p1): return p0.intValue + p1.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(p0, p1, p2, p3, p4, p5): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(p0, p1, p2, p3, p4, p5, p6, p7): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue + p6.intValue + p7.intValue case let .m_presentView__transitionStyle_transitionStyleview_view(p0, p1): return p0.intValue + p1.intValue @@ -720,12 +729,12 @@ open class BaseRouterMock: BaseRouter, Mock { case .m_backWithFade: return ".backWithFade()" case .m_dismiss__animated_animated: return ".dismiss(animated:)" case .m_removeLastView__controllers_controllers: return ".removeLastView(controllers:)" - case .m_showMainOrWhatsNewScreen: return ".showMainOrWhatsNewScreen()" + case .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen: return ".showMainOrWhatsNewScreen(sourceScreen:)" case .m_showStartupScreen: return ".showStartupScreen()" - case .m_showLoginScreen: return ".showLoginScreen()" - case .m_showRegisterScreen: return ".showRegisterScreen()" + case .m_showLoginScreen__sourceScreen_sourceScreen: return ".showLoginScreen(sourceScreen:)" + case .m_showRegisterScreen__sourceScreen_sourceScreen: return ".showRegisterScreen(sourceScreen:)" case .m_showForgotPasswordScreen: return ".showForgotPasswordScreen()" - case .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen: return ".showDiscoveryScreen(searchQuery:fromStartupScreen:)" + case .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen: return ".showDiscoveryScreen(searchQuery:sourceScreen:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type: return ".presentAlert(alertTitle:alertMessage:positiveAction:onCloseTapped:okTapped:type:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped: return ".presentAlert(alertTitle:alertMessage:nextSectionName:action:image:onCloseTapped:okTapped:nextSectionTapped:)" case .m_presentView__transitionStyle_transitionStyleview_view: return ".presentView(transitionStyle:view:)" @@ -753,12 +762,12 @@ open class BaseRouterMock: BaseRouter, Mock { public static func backWithFade() -> Verify { return Verify(method: .m_backWithFade)} public static func dismiss(animated: Parameter) -> Verify { return Verify(method: .m_dismiss__animated_animated(`animated`))} public static func removeLastView(controllers: Parameter) -> Verify { return Verify(method: .m_removeLastView__controllers_controllers(`controllers`))} - public static func showMainOrWhatsNewScreen() -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen)} + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showStartupScreen() -> Verify { return Verify(method: .m_showStartupScreen)} - public static func showLoginScreen() -> Verify { return Verify(method: .m_showLoginScreen)} - public static func showRegisterScreen() -> Verify { return Verify(method: .m_showRegisterScreen)} + public static func showLoginScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`))} + public static func showRegisterScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showForgotPasswordScreen() -> Verify { return Verify(method: .m_showForgotPasswordScreen)} - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`))} + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, nextSectionName: Parameter, action: Parameter, image: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, nextSectionTapped: Parameter<() -> Void>) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(`alertTitle`, `alertMessage`, `nextSectionName`, `action`, `image`, `onCloseTapped`, `okTapped`, `nextSectionTapped`))} public static func presentView(transitionStyle: Parameter, view: Parameter) -> Verify { return Verify(method: .m_presentView__transitionStyle_transitionStyleview_view(`transitionStyle`, `view`))} @@ -784,23 +793,23 @@ open class BaseRouterMock: BaseRouter, Mock { public static func removeLastView(controllers: Parameter, perform: @escaping (Int) -> Void) -> Perform { return Perform(method: .m_removeLastView__controllers_controllers(`controllers`), performs: perform) } - public static func showMainOrWhatsNewScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showMainOrWhatsNewScreen, performs: perform) + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showStartupScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showStartupScreen, performs: perform) } - public static func showLoginScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showLoginScreen, performs: perform) + public static func showLoginScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } - public static func showRegisterScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showRegisterScreen, performs: perform) + public static func showRegisterScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showForgotPasswordScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showForgotPasswordScreen, performs: perform) } - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter, perform: @escaping (String?, Bool) -> Void) -> Perform { - return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`), performs: perform) + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter, perform: @escaping (String?, LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`), performs: perform) } public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter, perform: @escaping (String, String, String, @escaping () -> Void, @escaping () -> Void, AlertViewType) -> Void) -> Perform { return Perform(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`), performs: perform) @@ -2447,10 +2456,10 @@ open class ProfileRouterMock: ProfileRouter, Mock { perform?(`controllers`) } - open func showMainOrWhatsNewScreen() { - addInvocation(.m_showMainOrWhatsNewScreen) - let perform = methodPerformValue(.m_showMainOrWhatsNewScreen) as? () -> Void - perform?() + open func showMainOrWhatsNewScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showStartupScreen() { @@ -2459,16 +2468,16 @@ open class ProfileRouterMock: ProfileRouter, Mock { perform?() } - open func showLoginScreen() { - addInvocation(.m_showLoginScreen) - let perform = methodPerformValue(.m_showLoginScreen) as? () -> Void - perform?() + open func showLoginScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showLoginScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } - open func showRegisterScreen() { - addInvocation(.m_showRegisterScreen) - let perform = methodPerformValue(.m_showRegisterScreen) as? () -> Void - perform?() + open func showRegisterScreen(sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showRegisterScreen__sourceScreen_sourceScreen(Parameter.value(`sourceScreen`))) as? (LogistrationSourceScreen) -> Void + perform?(`sourceScreen`) } open func showForgotPasswordScreen() { @@ -2477,10 +2486,10 @@ open class ProfileRouterMock: ProfileRouter, Mock { perform?() } - open func showDiscoveryScreen(searchQuery: String?, fromStartupScreen: Bool) { - addInvocation(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) - let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter.value(`searchQuery`), Parameter.value(`fromStartupScreen`))) as? (String?, Bool) -> Void - perform?(`searchQuery`, `fromStartupScreen`) + open func showDiscoveryScreen(searchQuery: String?, sourceScreen: LogistrationSourceScreen) { + addInvocation(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) + let perform = methodPerformValue(.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter.value(`searchQuery`), Parameter.value(`sourceScreen`))) as? (String?, LogistrationSourceScreen) -> Void + perform?(`searchQuery`, `sourceScreen`) } open func presentAlert(alertTitle: String, alertMessage: String, positiveAction: String, onCloseTapped: @escaping () -> Void, okTapped: @escaping () -> Void, type: AlertViewType) { @@ -2518,12 +2527,12 @@ open class ProfileRouterMock: ProfileRouter, Mock { case m_backWithFade case m_dismiss__animated_animated(Parameter) case m_removeLastView__controllers_controllers(Parameter) - case m_showMainOrWhatsNewScreen + case m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(Parameter) case m_showStartupScreen - case m_showLoginScreen - case m_showRegisterScreen + case m_showLoginScreen__sourceScreen_sourceScreen(Parameter) + case m_showRegisterScreen__sourceScreen_sourceScreen(Parameter) case m_showForgotPasswordScreen - case m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(Parameter, Parameter) + case m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(Parameter, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter) case m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(Parameter, Parameter, Parameter, Parameter, Parameter, Parameter<() -> Void>, Parameter<() -> Void>, Parameter<() -> Void>) case m_presentView__transitionStyle_transitionStyleview_view(Parameter, Parameter) @@ -2569,20 +2578,29 @@ open class ProfileRouterMock: ProfileRouter, Mock { results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsControllers, rhs: rhsControllers, with: matcher), lhsControllers, rhsControllers, "controllers")) return Matcher.ComparisonResult(results) - case (.m_showMainOrWhatsNewScreen, .m_showMainOrWhatsNewScreen): return .match + case (.m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showStartupScreen, .m_showStartupScreen): return .match - case (.m_showLoginScreen, .m_showLoginScreen): return .match + case (.m_showLoginScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showLoginScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) - case (.m_showRegisterScreen, .m_showRegisterScreen): return .match + case (.m_showRegisterScreen__sourceScreen_sourceScreen(let lhsSourcescreen), .m_showRegisterScreen__sourceScreen_sourceScreen(let rhsSourcescreen)): + var results: [Matcher.ParameterComparisonResult] = [] + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) + return Matcher.ComparisonResult(results) case (.m_showForgotPasswordScreen, .m_showForgotPasswordScreen): return .match - case (.m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let lhsSearchquery, let lhsFromstartupscreen), .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(let rhsSearchquery, let rhsFromstartupscreen)): + case (.m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let lhsSearchquery, let lhsSourcescreen), .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(let rhsSearchquery, let rhsSourcescreen)): var results: [Matcher.ParameterComparisonResult] = [] results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSearchquery, rhs: rhsSearchquery, with: matcher), lhsSearchquery, rhsSearchquery, "searchQuery")) - results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsFromstartupscreen, rhs: rhsFromstartupscreen, with: matcher), lhsFromstartupscreen, rhsFromstartupscreen, "fromStartupScreen")) + results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsSourcescreen, rhs: rhsSourcescreen, with: matcher), lhsSourcescreen, rhsSourcescreen, "sourceScreen")) return Matcher.ComparisonResult(results) case (.m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let lhsAlerttitle, let lhsAlertmessage, let lhsPositiveaction, let lhsOnclosetapped, let lhsOktapped, let lhsType), .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(let rhsAlerttitle, let rhsAlertmessage, let rhsPositiveaction, let rhsOnclosetapped, let rhsOktapped, let rhsType)): @@ -2633,12 +2651,12 @@ open class ProfileRouterMock: ProfileRouter, Mock { case .m_backWithFade: return 0 case let .m_dismiss__animated_animated(p0): return p0.intValue case let .m_removeLastView__controllers_controllers(p0): return p0.intValue - case .m_showMainOrWhatsNewScreen: return 0 + case let .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showStartupScreen: return 0 - case .m_showLoginScreen: return 0 - case .m_showRegisterScreen: return 0 + case let .m_showLoginScreen__sourceScreen_sourceScreen(p0): return p0.intValue + case let .m_showRegisterScreen__sourceScreen_sourceScreen(p0): return p0.intValue case .m_showForgotPasswordScreen: return 0 - case let .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(p0, p1): return p0.intValue + p1.intValue + case let .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(p0, p1): return p0.intValue + p1.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(p0, p1, p2, p3, p4, p5): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue case let .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(p0, p1, p2, p3, p4, p5, p6, p7): return p0.intValue + p1.intValue + p2.intValue + p3.intValue + p4.intValue + p5.intValue + p6.intValue + p7.intValue case let .m_presentView__transitionStyle_transitionStyleview_view(p0, p1): return p0.intValue + p1.intValue @@ -2656,12 +2674,12 @@ open class ProfileRouterMock: ProfileRouter, Mock { case .m_backWithFade: return ".backWithFade()" case .m_dismiss__animated_animated: return ".dismiss(animated:)" case .m_removeLastView__controllers_controllers: return ".removeLastView(controllers:)" - case .m_showMainOrWhatsNewScreen: return ".showMainOrWhatsNewScreen()" + case .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen: return ".showMainOrWhatsNewScreen(sourceScreen:)" case .m_showStartupScreen: return ".showStartupScreen()" - case .m_showLoginScreen: return ".showLoginScreen()" - case .m_showRegisterScreen: return ".showRegisterScreen()" + case .m_showLoginScreen__sourceScreen_sourceScreen: return ".showLoginScreen(sourceScreen:)" + case .m_showRegisterScreen__sourceScreen_sourceScreen: return ".showRegisterScreen(sourceScreen:)" case .m_showForgotPasswordScreen: return ".showForgotPasswordScreen()" - case .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen: return ".showDiscoveryScreen(searchQuery:fromStartupScreen:)" + case .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen: return ".showDiscoveryScreen(searchQuery:sourceScreen:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type: return ".presentAlert(alertTitle:alertMessage:positiveAction:onCloseTapped:okTapped:type:)" case .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped: return ".presentAlert(alertTitle:alertMessage:nextSectionName:action:image:onCloseTapped:okTapped:nextSectionTapped:)" case .m_presentView__transitionStyle_transitionStyleview_view: return ".presentView(transitionStyle:view:)" @@ -2693,12 +2711,12 @@ open class ProfileRouterMock: ProfileRouter, Mock { public static func backWithFade() -> Verify { return Verify(method: .m_backWithFade)} public static func dismiss(animated: Parameter) -> Verify { return Verify(method: .m_dismiss__animated_animated(`animated`))} public static func removeLastView(controllers: Parameter) -> Verify { return Verify(method: .m_removeLastView__controllers_controllers(`controllers`))} - public static func showMainOrWhatsNewScreen() -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen)} + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showStartupScreen() -> Verify { return Verify(method: .m_showStartupScreen)} - public static func showLoginScreen() -> Verify { return Verify(method: .m_showLoginScreen)} - public static func showRegisterScreen() -> Verify { return Verify(method: .m_showRegisterScreen)} + public static func showLoginScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`))} + public static func showRegisterScreen(sourceScreen: Parameter) -> Verify { return Verify(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`))} public static func showForgotPasswordScreen() -> Verify { return Verify(method: .m_showForgotPasswordScreen)} - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`))} + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter) -> Verify { return Verify(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`))} public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, nextSectionName: Parameter, action: Parameter, image: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, nextSectionTapped: Parameter<() -> Void>) -> Verify { return Verify(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagenextSectionName_nextSectionNameaction_actionimage_imageonCloseTapped_onCloseTappedokTapped_okTappednextSectionTapped_nextSectionTapped(`alertTitle`, `alertMessage`, `nextSectionName`, `action`, `image`, `onCloseTapped`, `okTapped`, `nextSectionTapped`))} public static func presentView(transitionStyle: Parameter, view: Parameter) -> Verify { return Verify(method: .m_presentView__transitionStyle_transitionStyleview_view(`transitionStyle`, `view`))} @@ -2736,23 +2754,23 @@ open class ProfileRouterMock: ProfileRouter, Mock { public static func removeLastView(controllers: Parameter, perform: @escaping (Int) -> Void) -> Perform { return Perform(method: .m_removeLastView__controllers_controllers(`controllers`), performs: perform) } - public static func showMainOrWhatsNewScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showMainOrWhatsNewScreen, performs: perform) + public static func showMainOrWhatsNewScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showMainOrWhatsNewScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showStartupScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showStartupScreen, performs: perform) } - public static func showLoginScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showLoginScreen, performs: perform) + public static func showLoginScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showLoginScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } - public static func showRegisterScreen(perform: @escaping () -> Void) -> Perform { - return Perform(method: .m_showRegisterScreen, performs: perform) + public static func showRegisterScreen(sourceScreen: Parameter, perform: @escaping (LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showRegisterScreen__sourceScreen_sourceScreen(`sourceScreen`), performs: perform) } public static func showForgotPasswordScreen(perform: @escaping () -> Void) -> Perform { return Perform(method: .m_showForgotPasswordScreen, performs: perform) } - public static func showDiscoveryScreen(searchQuery: Parameter, fromStartupScreen: Parameter, perform: @escaping (String?, Bool) -> Void) -> Perform { - return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQueryfromStartupScreen_fromStartupScreen(`searchQuery`, `fromStartupScreen`), performs: perform) + public static func showDiscoveryScreen(searchQuery: Parameter, sourceScreen: Parameter, perform: @escaping (String?, LogistrationSourceScreen) -> Void) -> Perform { + return Perform(method: .m_showDiscoveryScreen__searchQuery_searchQuerysourceScreen_sourceScreen(`searchQuery`, `sourceScreen`), performs: perform) } public static func presentAlert(alertTitle: Parameter, alertMessage: Parameter, positiveAction: Parameter, onCloseTapped: Parameter<() -> Void>, okTapped: Parameter<() -> Void>, type: Parameter, perform: @escaping (String, String, String, @escaping () -> Void, @escaping () -> Void, AlertViewType) -> Void) -> Perform { return Perform(method: .m_presentAlert__alertTitle_alertTitlealertMessage_alertMessagepositiveAction_positiveActiononCloseTapped_onCloseTappedokTapped_okTappedtype_type(`alertTitle`, `alertMessage`, `positiveAction`, `onCloseTapped`, `okTapped`, `type`), performs: perform) diff --git a/WhatsNew/WhatsNew/Presentation/WhatsNewView.swift b/WhatsNew/WhatsNew/Presentation/WhatsNewView.swift index 19eab380b..cbc1cb42f 100644 --- a/WhatsNew/WhatsNew/Presentation/WhatsNewView.swift +++ b/WhatsNew/WhatsNew/Presentation/WhatsNewView.swift @@ -105,7 +105,7 @@ public struct WhatsNewView: View { index += 1 } } else { - router.showMainOrWhatsNewScreen() + router.showMainOrWhatsNewScreen(sourceScreen: viewModel.sourceScreen) } } ) @@ -135,7 +135,7 @@ public struct WhatsNewView: View { .toolbar { ToolbarItem(placement: .navigationBarTrailing, content: { Button(action: { - router.showMainOrWhatsNewScreen() + router.showMainOrWhatsNewScreen(sourceScreen: viewModel.sourceScreen) }, label: { Image(systemName: "xmark") .foregroundColor(Theme.Colors.accentColor) diff --git a/WhatsNew/WhatsNew/Presentation/WhatsNewViewModel.swift b/WhatsNew/WhatsNew/Presentation/WhatsNewViewModel.swift index 170472088..12eb34b78 100644 --- a/WhatsNew/WhatsNew/Presentation/WhatsNewViewModel.swift +++ b/WhatsNew/WhatsNew/Presentation/WhatsNewViewModel.swift @@ -13,9 +13,11 @@ public class WhatsNewViewModel: ObservableObject { @Published var index: Int = 0 @Published var newItems: [WhatsNewPage] = [] private let storage: WhatsNewStorage + var sourceScreen: LogistrationSourceScreen - public init(storage: WhatsNewStorage) { + public init(storage: WhatsNewStorage, sourceScreen: LogistrationSourceScreen = .default) { self.storage = storage + self.sourceScreen = sourceScreen newItems = loadWhatsNew() }