From 1f899c7ec3dd2c088c81179a4e60af5eaf5ba959 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Wed, 27 Sep 2023 18:11:07 +0400 Subject: [PATCH] Log analytic event on click open full screen code editor --- .../StepQuizCode/StepQuizCodeViewModel.swift | 12 ++++++-- .../StepQuizCode/Views/StepQuizCodeView.swift | 4 +-- .../StepQuizPyCharm/StepQuizPyCharmView.swift | 4 +-- .../StepQuizSQL/Views/StepQuizSQLView.swift | 4 +-- .../hyperskill/HyperskillAnalyticPart.kt | 3 +- .../hyperskill/HyperskillAnalyticTarget.kt | 3 +- ...ScreenCodeEditorHyperskillAnalyticEvent.kt | 30 +++++++++++++++++++ .../step_quiz/presentation/StepQuizFeature.kt | 2 ++ .../step_quiz/presentation/StepQuizReducer.kt | 9 ++++++ 9 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/StepQuizClickedOpenFullScreenCodeEditorHyperskillAnalyticEvent.kt diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizCode/StepQuizCodeViewModel.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizCode/StepQuizCodeViewModel.swift index cb72f518e9..cd469f9d80 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizCode/StepQuizCodeViewModel.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizCode/StepQuizCodeViewModel.swift @@ -44,8 +44,12 @@ class StepQuizCodeViewModel: ObservableObject { provideModuleInputCallback(self) } - func logClickedCodeDetailsEvent() { - moduleOutput?.handleChildQuizAnalyticEventMessage(StepQuizFeatureMessageClickedCodeDetailsEventMessage()) + func doFullScreenCodeEditorPresentation() { + navigationState.presentingFullScreen = true + + moduleOutput?.handleChildQuizAnalyticEventMessage( + StepQuizFeatureMessageClickedOpenFullScreenCodeEditorEventMessage() + ) } func handleCodeDidChange(_ newCode: String?) { @@ -55,6 +59,10 @@ class StepQuizCodeViewModel: ObservableObject { self.syncReply(code: newCode) } } + + func logClickedCodeDetailsEvent() { + moduleOutput?.handleChildQuizAnalyticEventMessage(StepQuizFeatureMessageClickedCodeDetailsEventMessage()) + } } // MARK: - StepQuizCodeViewModel: StepQuizChildQuizInputProtocol - diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizCode/Views/StepQuizCodeView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizCode/Views/StepQuizCodeView.swift index 15977fe420..b778406529 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizCode/Views/StepQuizCodeView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizCode/Views/StepQuizCodeView.swift @@ -21,9 +21,7 @@ struct StepQuizCodeView: View { ), codeTemplate: viewData.codeTemplate, language: viewData.language, - onExpandButtonTap: { - viewModel.navigationState.presentingFullScreen = true - } + onExpandButtonTap: viewModel.doFullScreenCodeEditorPresentation ) .padding(.horizontal, -LayoutInsets.defaultInset) } diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizPyCharm/StepQuizPyCharmView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizPyCharm/StepQuizPyCharmView.swift index e7284f72cb..cb0b8fab7d 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizPyCharm/StepQuizPyCharmView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizPyCharm/StepQuizPyCharmView.swift @@ -16,9 +16,7 @@ struct StepQuizPyCharmView: View { ), codeTemplate: viewData.codeTemplate, language: viewData.language, - onExpandButtonTap: { - viewModel.navigationState.presentingFullScreen = true - } + onExpandButtonTap: viewModel.doFullScreenCodeEditorPresentation ) .padding(.horizontal, -LayoutInsets.defaultInset) } diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizSQL/Views/StepQuizSQLView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizSQL/Views/StepQuizSQLView.swift index 9f6002e45b..2d1b783d6f 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizSQL/Views/StepQuizSQLView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizSQL/Views/StepQuizSQLView.swift @@ -16,9 +16,7 @@ struct StepQuizSQLView: View { ), codeTemplate: viewData.codeTemplate, language: viewData.language, - onExpandButtonTap: { - viewModel.navigationState.presentingFullScreen = true - } + onExpandButtonTap: viewModel.doFullScreenCodeEditorPresentation ) .padding(.horizontal, -LayoutInsets.defaultInset) } diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticPart.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticPart.kt index dc8cddf4d9..7f98e48db5 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticPart.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticPart.kt @@ -33,5 +33,6 @@ enum class HyperskillAnalyticPart(val partName: String) { STAGE_COMPLETED_MODAL("stage_completed_modal"), PROJECT_COMPLETED_MODAL("project_completed_modal"), NEXT_LEARNING_ACTIVITY_WIDGET("next_learning_activity_widget"), - FULL_SCREEN_CODE_EDITOR("full_screen_code_editor") + FULL_SCREEN_CODE_EDITOR("full_screen_code_editor"), + CODE_EDITOR("code_editor") } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticTarget.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticTarget.kt index 7c8bf09fca..ace6048556 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticTarget.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticTarget.kt @@ -92,5 +92,6 @@ enum class HyperskillAnalyticTarget(val targetName: String) { BADGE_MODAL("badge_modal"), EARNED_BADGE_MODAL("earned_badge_modal"), ALLOW_NOTIFICATIONS("allow_notifications"), - REMIND_ME_LATER("remind_me_later") + REMIND_ME_LATER("remind_me_later"), + FULL_SCREEN_CODE_EDITOR("full_screen_code_editor") } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/StepQuizClickedOpenFullScreenCodeEditorHyperskillAnalyticEvent.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/StepQuizClickedOpenFullScreenCodeEditorHyperskillAnalyticEvent.kt new file mode 100644 index 0000000000..e451bf5b12 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/StepQuizClickedOpenFullScreenCodeEditorHyperskillAnalyticEvent.kt @@ -0,0 +1,30 @@ +package org.hyperskill.app.step_quiz.domain.analytic + +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticAction +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticEvent +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticPart +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticRoute +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticTarget + +/** + * Represents click on the button that triggers navigation to the full screen code editor analytic event. + * + * JSON payload: + * ``` + * { + * "route": "/learn/step/1", + * "action": "click", + * "part": "code_editor", + * "target": "full_screen_code_editor" + * } + * ``` + * @see HyperskillAnalyticEvent + */ +class StepQuizClickedOpenFullScreenCodeEditorHyperskillAnalyticEvent( + route: HyperskillAnalyticRoute +) : HyperskillAnalyticEvent( + route, + HyperskillAnalyticAction.CLICK, + HyperskillAnalyticPart.CODE_EDITOR, + HyperskillAnalyticTarget.FULL_SCREEN_CODE_EDITOR +) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizFeature.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizFeature.kt index fb8ad33c8f..3fb18c9ec0 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizFeature.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizFeature.kt @@ -106,6 +106,8 @@ interface StepQuizFeature { object ClickedStepTextDetailsEventMessage : Message object FullScreenCodeEditorClickedStepTextDetailsEventMessage : Message + object ClickedOpenFullScreenCodeEditorEventMessage : Message + object ClickedRetryEventMessage : Message object ProblemsLimitReachedModalShownEventMessage : Message diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt index 3e81e30c42..7e834831f8 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt @@ -9,6 +9,7 @@ import org.hyperskill.app.step_quiz.domain.analytic.ProblemsLimitReachedModalCli import org.hyperskill.app.step_quiz.domain.analytic.ProblemsLimitReachedModalHiddenHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.ProblemsLimitReachedModalShownHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.StepQuizClickedCodeDetailsHyperskillAnalyticEvent +import org.hyperskill.app.step_quiz.domain.analytic.StepQuizClickedOpenFullScreenCodeEditorHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.StepQuizClickedRetryHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.StepQuizClickedRunHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.StepQuizClickedSendHyperskillAnalyticEvent @@ -237,6 +238,14 @@ class StepQuizReducer( null } } + is Message.ClickedOpenFullScreenCodeEditorEventMessage -> { + if (state.stepQuizState is StepQuizState.AttemptLoaded) { + val event = StepQuizClickedOpenFullScreenCodeEditorHyperskillAnalyticEvent(stepRoute.analyticRoute) + state to setOf(Action.LogAnalyticEvent(event)) + } else { + null + } + } is Message.TheoryToolbarItemClicked -> handleTheoryToolbarItemClicked(state) is Message.ClickedRetryEventMessage ->