From 79afbd30d45db08df21d8037964aca413d5cdfbf Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Mon, 16 Sep 2024 13:49:05 +0900 Subject: [PATCH 1/3] Add feature flag --- .../org/hyperskill/app/profile/domain/model/FeatureKeys.kt | 1 + .../org/hyperskill/app/profile/domain/model/FeaturesMap.kt | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/profile/domain/model/FeatureKeys.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/profile/domain/model/FeatureKeys.kt index b12ff24082..61f09905b6 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/profile/domain/model/FeatureKeys.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/profile/domain/model/FeatureKeys.kt @@ -11,4 +11,5 @@ internal object FeatureKeys { const val MOBILE_ONLY_SUBSCRIPTION = "mobile.mobile_only_subscription" const val MOBILE_USERS_INTERVIEW_WIDGET = "mobile.users_interview_widget" const val MOBILE_CONTENT_TRIAL = "mobile.content_trial" + const val MOBILE_PYTHON_ADOPTED_COURSE = "mobile.python_adopted_course" } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/profile/domain/model/FeaturesMap.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/profile/domain/model/FeaturesMap.kt index 2009058866..e06709f594 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/profile/domain/model/FeaturesMap.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/profile/domain/model/FeaturesMap.kt @@ -39,4 +39,7 @@ val FeaturesMap.isMobileUsersInterviewWidgetEnabled: Boolean get() = get(FeatureKeys.MOBILE_USERS_INTERVIEW_WIDGET) ?: false val FeaturesMap.isMobileContentTrialEnabled: Boolean - get() = get(FeatureKeys.MOBILE_CONTENT_TRIAL) ?: false \ No newline at end of file + get() = get(FeatureKeys.MOBILE_CONTENT_TRIAL) ?: false + +val FeaturesMap.isMobilePythonAdoptedCourseEnabled: Boolean + get() = get(FeatureKeys.MOBILE_PYTHON_ADOPTED_COURSE) ?: false \ No newline at end of file From adc667ac611d71483d4ea0dceadc104a75f05621 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Mon, 16 Sep 2024 14:12:42 +0900 Subject: [PATCH 2/3] Select 139 track on iOS when feature enabled --- .../WelcomeOnboardingTrackDetailsComponentImpl.kt | 4 +++- ...WelcomeOnboardingTrackDetailsFeatureBuilder.kt | 15 +++++++++++++-- .../WelcomeOnboardingTrackDetailsFeature.kt | 11 ++++++++--- .../WelcomeOnboardingTrackDetailsReducer.kt | 10 ++++++---- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/injection/WelcomeOnboardingTrackDetailsComponentImpl.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/injection/WelcomeOnboardingTrackDetailsComponentImpl.kt index a42c5d5042..2f451d7efb 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/injection/WelcomeOnboardingTrackDetailsComponentImpl.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/injection/WelcomeOnboardingTrackDetailsComponentImpl.kt @@ -17,8 +17,10 @@ internal class WelcomeOnboardingTrackDetailsComponentImpl( currentProfileStateRepository = appGraph.profileDataComponent.currentProfileStateRepository, profileRepository = appGraph.profileDataComponent.profileRepository, analyticInteractor = appGraph.analyticComponent.analyticInteractor, + featuresDataSource = appGraph.profileDataComponent.featuresDataSource, logger = appGraph.loggerComponent.logger, buildVariant = appGraph.commonComponent.buildKonfig.buildVariant, - resourceProvider = appGraph.commonComponent.resourceProvider + resourceProvider = appGraph.commonComponent.resourceProvider, + platformType = appGraph.commonComponent.platform.platformType ) } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/injection/WelcomeOnboardingTrackDetailsFeatureBuilder.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/injection/WelcomeOnboardingTrackDetailsFeatureBuilder.kt index 0ec5712f3f..334f8bf3c2 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/injection/WelcomeOnboardingTrackDetailsFeatureBuilder.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/injection/WelcomeOnboardingTrackDetailsFeatureBuilder.kt @@ -4,10 +4,13 @@ import co.touchlab.kermit.Logger import org.hyperskill.app.analytic.domain.interactor.AnalyticInteractor import org.hyperskill.app.analytic.presentation.wrapWithAnalyticLogger import org.hyperskill.app.core.domain.BuildVariant +import org.hyperskill.app.core.domain.platform.PlatformType import org.hyperskill.app.core.presentation.ActionDispatcherOptions import org.hyperskill.app.core.presentation.transformState import org.hyperskill.app.core.view.mapper.ResourceProvider +import org.hyperskill.app.features.data.source.FeaturesDataSource import org.hyperskill.app.logging.presentation.wrapWithLogger +import org.hyperskill.app.profile.domain.model.isMobilePythonAdoptedCourseEnabled import org.hyperskill.app.profile.domain.repository.CurrentProfileStateRepository import org.hyperskill.app.profile.domain.repository.ProfileRepository import org.hyperskill.app.welcome_onboarding.model.WelcomeOnboardingTrack @@ -31,10 +34,15 @@ internal object WelcomeOnboardingTrackDetailsFeatureBuilder { currentProfileStateRepository: CurrentProfileStateRepository, profileRepository: ProfileRepository, analyticInteractor: AnalyticInteractor, + featuresDataSource: FeaturesDataSource, resourceProvider: ResourceProvider, logger: Logger, - buildVariant: BuildVariant + buildVariant: BuildVariant, + platformType: PlatformType ): Feature { + val isMobilePythonAdoptedCourseEnabled = platformType == PlatformType.IOS && + featuresDataSource.getFeaturesMap().isMobilePythonAdoptedCourseEnabled + val welcomeOnboardingTrackDetailsReducer = WelcomeOnboardingTrackDetailsReducer() .wrapWithLogger(buildVariant, logger, LOG_TAG) @@ -49,7 +57,10 @@ internal object WelcomeOnboardingTrackDetailsFeatureBuilder { val viewStateMapper = WelcomeOnboardingTrackDetailsViewStateMapper(resourceProvider) return ReduxFeature( - initialState = WelcomeOnboardingTrackDetailsFeature.initialState(track), + initialState = WelcomeOnboardingTrackDetailsFeature.initialState( + track = track, + isMobilePythonAdoptedCourseEnabled = isMobilePythonAdoptedCourseEnabled + ), reducer = welcomeOnboardingTrackDetailsReducer ) .wrapWithActionDispatcher(welcomeOnboardingTrackDetailsActionDispatcher) diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/presentation/WelcomeOnboardingTrackDetailsFeature.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/presentation/WelcomeOnboardingTrackDetailsFeature.kt index 6b58a3e510..f6d7d3d47e 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/presentation/WelcomeOnboardingTrackDetailsFeature.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/presentation/WelcomeOnboardingTrackDetailsFeature.kt @@ -6,13 +6,18 @@ import org.hyperskill.app.welcome_onboarding.model.WelcomeOnboardingTrack object WelcomeOnboardingTrackDetailsFeature { internal data class State( val track: WelcomeOnboardingTrack, - val isLoadingShowed: Boolean + val isLoadingShowed: Boolean, + val isMobilePythonAdoptedCourseEnabled: Boolean ) - internal fun initialState(track: WelcomeOnboardingTrack) = + internal fun initialState( + track: WelcomeOnboardingTrack, + isMobilePythonAdoptedCourseEnabled: Boolean + ) = State( track = track, - isLoadingShowed = false + isLoadingShowed = false, + isMobilePythonAdoptedCourseEnabled = isMobilePythonAdoptedCourseEnabled ) /** diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/presentation/WelcomeOnboardingTrackDetailsReducer.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/presentation/WelcomeOnboardingTrackDetailsReducer.kt index 9355802a5c..d069c81e26 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/presentation/WelcomeOnboardingTrackDetailsReducer.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/track_details/presentation/WelcomeOnboardingTrackDetailsReducer.kt @@ -20,6 +20,7 @@ internal class WelcomeOnboardingTrackDetailsReducer : StateReducer JAVA_TRACK_ID WelcomeOnboardingTrack.JAVA_SCRIPT -> JS_TRACK_ID WelcomeOnboardingTrack.KOTLIN -> KOTLIN_TRACK_ID - WelcomeOnboardingTrack.PYTHON -> PYTHON_TRACK_ID + WelcomeOnboardingTrack.PYTHON -> + if (state.isMobilePythonAdoptedCourseEnabled) PYTHON_TRACK_MOBILE_ADOPTED_ID else PYTHON_TRACK_ID WelcomeOnboardingTrack.SQL -> SQL_TRACK_ID } } \ No newline at end of file From 489c4b2059db93aeaefdcf7ccbcbd7102486473e Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Mon, 16 Sep 2024 14:15:29 +0900 Subject: [PATCH 3/3] Redirect to Python track after welcome questionnaire --- .../root/presentation/WelcomeOnboardingReducer.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/root/presentation/WelcomeOnboardingReducer.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/root/presentation/WelcomeOnboardingReducer.kt index 2fe4aadbd3..ecd772243a 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/root/presentation/WelcomeOnboardingReducer.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/welcome_onboarding/root/presentation/WelcomeOnboardingReducer.kt @@ -83,7 +83,9 @@ internal class WelcomeOnboardingReducer : StateReducer { WelcomeQuestionnaireType.LEARNING_REASON -> NavigateTo.WelcomeOnboardingQuestionnaire(WelcomeQuestionnaireType.CODING_EXPERIENCE) WelcomeQuestionnaireType.CODING_EXPERIENCE -> - NavigateTo.ChooseProgrammingLanguage + // NavigateTo.ChooseProgrammingLanguage + // ALTAPPS-1356: Redirect to Python track directly + NavigateTo.TrackDetails(WelcomeOnboardingTrack.PYTHON) } )