Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] 코스 등록 + 일정 등록 (Enroll) 뷰 앰플리튜드 트래킹 이벤트 코드 심기 #265

Merged
merged 9 commits into from
Sep 17, 2024
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class CourseDetailContract {
) : UiState

sealed interface CourseDetailSideEffect : UiSideEffect {
data class NavigateToEnroll(val enrollType: EnrollType, val id: Int?) : CourseDetailSideEffect
data class NavigateToEnroll(val enrollType: EnrollType, val viewPath: String, val id: Int?) : CourseDetailSideEffect
data object PopBackStack : CourseDetailSideEffect
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailBasi
import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailBottomBar
import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailUnopenedDetail
import org.sopt.dateroad.presentation.ui.coursedetail.component.courseDetailOpenedDetail
import org.sopt.dateroad.presentation.util.ViewPath.COURSE_DETAIL
import org.sopt.dateroad.presentation.util.WebViewUrl.REPORT_URL
import org.sopt.dateroad.presentation.util.view.LoadState
import org.sopt.dateroad.ui.theme.DATEROADTheme
Expand All @@ -54,7 +55,7 @@ import org.sopt.dateroad.ui.theme.DateRoadTheme
fun CourseDetailRoute(
viewModel: CourseDetailViewModel = hiltViewModel(),
popBackStack: () -> Unit,
navigateToEnroll: (EnrollType, Int?) -> Unit,
navigateToEnroll: (EnrollType, String, Int?) -> Unit,
courseId: Int
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
Expand All @@ -64,7 +65,7 @@ fun CourseDetailRoute(
viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle)
.collect { courseDetailSideEffect ->
when (courseDetailSideEffect) {
is CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll -> navigateToEnroll(courseDetailSideEffect.enrollType, courseDetailSideEffect.id)
is CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll -> navigateToEnroll(courseDetailSideEffect.enrollType, courseDetailSideEffect.viewPath, courseDetailSideEffect.id)
is CourseDetailContract.CourseDetailSideEffect.PopBackStack -> popBackStack()
}
}
Expand All @@ -85,7 +86,7 @@ fun CourseDetailRoute(
onDialogPointLack = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDialogPointLack) },
onDialogPointLackConfirm = {
viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissDialogPointLack)
viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll(EnrollType.COURSE, null))
viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll(enrollType = EnrollType.COURSE, viewPath = COURSE_DETAIL, id = null))
},
dismissDialogPointLack = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissDialogPointLack) },
onDialogLookedForFree = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDialogLookedForFree) },
Expand All @@ -109,7 +110,7 @@ fun CourseDetailRoute(
dismissDeleteCourseBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissDeleteCourseBottomSheet) },
onReportCourseBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnReportCourseBottomSheet) },
dismissReportCourseBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissReportCourseBottomSheet) },
enrollSchedule = { viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll(EnrollType.TIMELINE, courseId)) },
enrollSchedule = { viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll(enrollType = EnrollType.TIMELINE, viewPath = COURSE_DETAIL, id = courseId)) },
onTopBarIconClicked = { viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.PopBackStack) },
openCourseDetail = { viewModel.postUsePoint(courseId = courseId) },
onReportButtonClicked = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ fun NavController.navigationCourseDetail(courseId: Int) {

fun NavGraphBuilder.courseDetailGraph(
popBackStack: () -> Unit,
navigateToEnroll: (EnrollType, Int?) -> Unit
navigateToEnroll: (EnrollType, String, Int?) -> Unit
) {
composable(
route = CourseDetailRoute.ROUTE_WITH_ARGUMENT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,38 @@ import org.sopt.dateroad.presentation.ui.component.view.DateRoadErrorView
import org.sopt.dateroad.presentation.ui.component.view.DateRoadLoadingView
import org.sopt.dateroad.presentation.ui.enroll.component.EnrollPhotos
import org.sopt.dateroad.presentation.util.DatePicker
import org.sopt.dateroad.presentation.util.EnrollAmplitude.CLICK_BRING_COURSE
import org.sopt.dateroad.presentation.util.EnrollAmplitude.CLICK_COURSE1_BACK
import org.sopt.dateroad.presentation.util.EnrollAmplitude.CLICK_COURSE2_BACK
import org.sopt.dateroad.presentation.util.EnrollAmplitude.CLICK_COURSE3_BACK
import org.sopt.dateroad.presentation.util.EnrollAmplitude.CLICK_SCHEDULE1_BACK
import org.sopt.dateroad.presentation.util.EnrollAmplitude.CLICK_SCHEDULE2_BACK
import org.sopt.dateroad.presentation.util.EnrollAmplitude.COURSE_CONTENT_BOOL
import org.sopt.dateroad.presentation.util.EnrollAmplitude.COURSE_CONTENT_NUM
import org.sopt.dateroad.presentation.util.EnrollAmplitude.COURSE_COST
import org.sopt.dateroad.presentation.util.EnrollAmplitude.COURSE_DATE
import org.sopt.dateroad.presentation.util.EnrollAmplitude.COURSE_IMAGE
import org.sopt.dateroad.presentation.util.EnrollAmplitude.COURSE_LOCATION
import org.sopt.dateroad.presentation.util.EnrollAmplitude.COURSE_START_TIME
import org.sopt.dateroad.presentation.util.EnrollAmplitude.COURSE_TAGS
import org.sopt.dateroad.presentation.util.EnrollAmplitude.COURSE_TITLE
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_AREA
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_COURSE_NUM
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_DATE
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_DETAIL_LOCATION
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_DETAIL_TIME
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_LOCATION
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_SPEND_TIME
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_TAG_NUM
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_TIME
import org.sopt.dateroad.presentation.util.EnrollAmplitude.DATE_TITLE
import org.sopt.dateroad.presentation.util.EnrollAmplitude.LOCATION_NUM
import org.sopt.dateroad.presentation.util.EnrollAmplitude.VIEW_ADD_BRING_COURSE
import org.sopt.dateroad.presentation.util.EnrollAmplitude.VIEW_ADD_BRING_COURSE2
import org.sopt.dateroad.presentation.util.EnrollAmplitude.VIEW_ADD_SCHEDULE
import org.sopt.dateroad.presentation.util.EnrollAmplitude.VIEW_ADD_SCHEDULE2
import org.sopt.dateroad.presentation.util.EnrollAmplitude.VIEW_COURSE1
import org.sopt.dateroad.presentation.util.EnrollAmplitude.VIEW_PATH
import org.sopt.dateroad.presentation.util.EnrollScreen.MAX_ITEMS
import org.sopt.dateroad.presentation.util.EnrollScreen.TITLE_MIN_LENGTH
import org.sopt.dateroad.presentation.util.TimePicker
Expand All @@ -69,7 +101,8 @@ fun EnrollRoute(
popBackStack: () -> Unit,
navigateToMyCourse: (MyCourseType) -> Unit,
enrollType: EnrollType,
id: Int?
viewPath: String,
timelineId: Int?
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val lifecycleOwner = LocalLifecycleOwner.current
Expand All @@ -88,17 +121,15 @@ fun EnrollRoute(

LaunchedEffect(Unit) {
viewModel.setEvent(EnrollContract.EnrollEvent.FetchEnrollCourseType(enrollType = enrollType))
}

LaunchedEffect(uiState.enrollType) {
if (id != null) {
if (timelineId != null) {
when (enrollType) {
EnrollType.COURSE -> {
viewModel.fetchTimelineDetail(timelineId = id)
viewModel.fetchTimelineDetail(timelineId = timelineId)
}

EnrollType.TIMELINE -> {
viewModel.fetchCourseDetail(courseId = id)
viewModel.fetchCourseDetail(courseId = timelineId)
}
}
}
Expand Down Expand Up @@ -138,6 +169,28 @@ fun EnrollRoute(
)
}

LaunchedEffect(uiState.page) {
when (enrollType) {
EnrollType.COURSE -> {
when (uiState.page) {
EnrollScreenType.FIRST -> AmplitudeUtils.trackEventWithProperty(eventName = VIEW_COURSE1, propertyName = VIEW_PATH, propertyValue = viewPath)
EnrollScreenType.SECOND -> Unit
EnrollScreenType.THIRD -> Unit
Comment on lines +177 to +178
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

else 보다 이게 낫나?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개인적으로 when문 선호합니둥 ㅋㅋ

}
}

EnrollType.TIMELINE -> {
(timelineId != null).let { isBringCourse ->
when (uiState.page) {
EnrollScreenType.FIRST -> AmplitudeUtils.trackEventWithProperty(eventName = if (isBringCourse) VIEW_ADD_BRING_COURSE else VIEW_ADD_SCHEDULE, propertyName = VIEW_PATH, propertyValue = viewPath)
EnrollScreenType.SECOND -> AmplitudeUtils.trackEvent(eventName = if (isBringCourse) VIEW_ADD_BRING_COURSE2 else VIEW_ADD_SCHEDULE2)
EnrollScreenType.THIRD -> Unit
}
}
}
}
}

LaunchedEffect(uiState.loadState) {
if (uiState.loadState == LoadState.Success) {
when (uiState.enrollType) {
Expand All @@ -150,8 +203,50 @@ fun EnrollRoute(
EnrollScreen(
padding = padding,
enrollUiState = uiState,
onTopBarBackButtonClick = { viewModel.setEvent(EnrollContract.EnrollEvent.OnTopBarBackButtonClick) },
onTopBarLoadButtonClick = { viewModel.setSideEffect(EnrollContract.EnrollSideEffect.NavigateToMyCourseRead) },
onTopBarBackButtonClick = {
viewModel.setEvent(EnrollContract.EnrollEvent.OnTopBarBackButtonClick)

when (enrollType) {
EnrollType.COURSE -> {
when (uiState.page) {
EnrollScreenType.FIRST -> AmplitudeUtils.trackEventWithProperties(
eventName = CLICK_COURSE1_BACK,
properties = with(uiState.enroll) { mapOf(COURSE_IMAGE to images.isNotEmpty(), COURSE_TITLE to title.isNotEmpty(), COURSE_DATE to date.isNotEmpty(), COURSE_START_TIME to startAt.isNotEmpty(), COURSE_TAGS to tags.isNotEmpty(), COURSE_LOCATION to (city != null)) }
)

EnrollScreenType.SECOND -> AmplitudeUtils.trackEventWithProperties(
eventName = CLICK_COURSE2_BACK,
properties = with(uiState.place) { mapOf(DATE_LOCATION to title.isNotEmpty(), DATE_SPEND_TIME to duration.isNotEmpty(), LOCATION_NUM to uiState.enroll.places.size) }
)

EnrollScreenType.THIRD -> AmplitudeUtils.trackEventWithProperties(
eventName = CLICK_COURSE3_BACK,
properties = with(uiState.enroll) { mapOf(COURSE_CONTENT_BOOL to description.isNotEmpty(), COURSE_CONTENT_NUM to description.length, COURSE_COST to cost.isNotEmpty()) }
)
}
}

EnrollType.TIMELINE -> {
when (uiState.page) {
EnrollScreenType.FIRST -> AmplitudeUtils.trackEventWithProperties(
eventName = CLICK_SCHEDULE1_BACK,
properties = with(uiState.enroll) { mapOf(DATE_TITLE to title.isNotEmpty(), DATE_DATE to date.isNotEmpty(), DATE_TIME to startAt.isNotEmpty(), DATE_TAG_NUM to tags.size, DATE_AREA to (city != null)) }
)

EnrollScreenType.SECOND -> AmplitudeUtils.trackEventWithProperties(
eventName = CLICK_SCHEDULE2_BACK,
properties = with(uiState.place) { mapOf(DATE_DETAIL_LOCATION to title.isNotEmpty(), DATE_DETAIL_TIME to duration.isNotEmpty(), DATE_COURSE_NUM to uiState.enroll.places.size) }
)

EnrollScreenType.THIRD -> Unit
}
}
}
},
onTopBarLoadButtonClick = {
viewModel.setSideEffect(EnrollContract.EnrollSideEffect.NavigateToMyCourseRead)
AmplitudeUtils.trackEvent(eventName = CLICK_BRING_COURSE)
},
onEnrollButtonClick = { viewModel.setEvent(EnrollContract.EnrollEvent.OnEnrollButtonClick) },
onDateTextFieldClick = { viewModel.setEvent(EnrollContract.EnrollEvent.OnDateTextFieldClick) },
onTimeTextFieldClick = { viewModel.setEvent(EnrollContract.EnrollEvent.OnTimeTextFieldClick) },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import org.sopt.dateroad.presentation.type.MyCourseType
import org.sopt.dateroad.presentation.ui.enroll.EnrollRoute
import org.sopt.dateroad.presentation.ui.mycourse.navigation.MyCourseRoute

fun NavController.navigationEnroll(enrollType: EnrollType, courseId: Int? = null) {
fun NavController.navigationEnroll(enrollType: EnrollType, viewPath: String, courseId: Int? = null) {
navigate(
route = EnrollRoute.route(enrollType = enrollType, courseId = courseId)
route = EnrollRoute.route(enrollType = enrollType, viewPath = viewPath, courseId = courseId)
) {
popUpTo(MyCourseRoute.route(MyCourseType.READ)) { inclusive = true }
launchSingleTop = true
Expand All @@ -31,7 +31,10 @@ fun NavGraphBuilder.enrollNavGraph(
navArgument(EnrollRoute.ENROLL_TYPE) {
type = NavType.StringType
},
navArgument(EnrollRoute.COURSE_ID) {
navArgument(EnrollRoute.VIEW_PATH) {
type = NavType.StringType
},
navArgument(EnrollRoute.TIMELINE_ID) {
type = NavType.StringType
nullable = true
}
Expand All @@ -40,15 +43,20 @@ fun NavGraphBuilder.enrollNavGraph(
val enrollType = backStackEntry.arguments?.getString(EnrollRoute.ENROLL_TYPE)?.let {
EnrollType.valueOf(it)
} ?: EnrollType.COURSE
val courseId = backStackEntry.arguments?.getString(EnrollRoute.COURSE_ID)?.toIntOrNull()
EnrollRoute(padding = padding, popBackStack = popBackStack, navigateToMyCourse = navigationToMyCourse, enrollType = enrollType, id = courseId)

val viewPath = backStackEntry.arguments?.getString(EnrollRoute.VIEW_PATH).orEmpty()

val timelineId = backStackEntry.arguments?.getString(EnrollRoute.TIMELINE_ID)?.toIntOrNull()

EnrollRoute(padding = padding, popBackStack = popBackStack, navigateToMyCourse = navigationToMyCourse, enrollType = enrollType, viewPath = viewPath, timelineId = timelineId)
}
}

object EnrollRoute {
const val ROUTE = "enroll"
const val ENROLL_TYPE = "enrollType"
const val COURSE_ID = "courseId"
const val ROUTE_WITH_ARGUMENT = "$ROUTE/{$ENROLL_TYPE}/{$COURSE_ID}"
fun route(enrollType: EnrollType, courseId: Int?) = "$ROUTE/${enrollType.name}/$courseId"
const val VIEW_PATH = "viewPath"
const val TIMELINE_ID = "timelineId"
const val ROUTE_WITH_ARGUMENT = "$ROUTE/{$ENROLL_TYPE}/{$VIEW_PATH}/{$TIMELINE_ID}"
fun route(enrollType: EnrollType, viewPath: String, courseId: Int?) = "$ROUTE/${enrollType.name}/$viewPath/$courseId"
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class HomeContract {
data object NavigateToPointHistory : HomeSideEffect
data object NavigateToLook : HomeSideEffect
data class NavigateToTimelineDetail(val timelineType: TimelineType, val timelineId: Int) : HomeSideEffect
data class NavigateToEnroll(val enrollType: EnrollType, val id: Int?) : HomeSideEffect
data class NavigateToEnroll(val enrollType: EnrollType, val viewPath: String, val id: Int?) : HomeSideEffect
data class NavigateToAdvertisementDetail(val advertisementId: Int) : HomeSideEffect
data class NavigateToCourseDetail(val courseId: Int) : HomeSideEffect
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import org.sopt.dateroad.presentation.ui.home.component.DateRoadHomeTopBar
import org.sopt.dateroad.presentation.ui.home.component.HomeAdvertisement
import org.sopt.dateroad.presentation.ui.home.component.HomeHotCourseCard
import org.sopt.dateroad.presentation.ui.home.component.HomeTimeLineCard
import org.sopt.dateroad.presentation.util.ViewPath.HOME
import org.sopt.dateroad.presentation.util.view.LoadState
import org.sopt.dateroad.ui.theme.DateRoadTheme

Expand All @@ -66,7 +67,7 @@ fun HomeRoute(
navigateToPointHistory: () -> Unit,
navigateToLook: (MainNavigationBarItemType) -> Unit,
navigateToTimelineDetail: (TimelineType, Int) -> Unit,
navigateToEnroll: (EnrollType, Int?) -> Unit,
navigateToEnroll: (EnrollType, String, Int?) -> Unit,
navigateToAdvertisementDetail: (Int) -> Unit,
navigateToCourseDetail: (Int) -> Unit
) {
Expand Down Expand Up @@ -100,7 +101,7 @@ fun HomeRoute(
is HomeContract.HomeSideEffect.NavigateToPointHistory -> navigateToPointHistory()
is HomeContract.HomeSideEffect.NavigateToLook -> navigateToLook(MainNavigationBarItemType.LOOK)
is HomeContract.HomeSideEffect.NavigateToTimelineDetail -> navigateToTimelineDetail(homeSideEffect.timelineType, homeSideEffect.timelineId)
is HomeContract.HomeSideEffect.NavigateToEnroll -> navigateToEnroll(homeSideEffect.enrollType, homeSideEffect.id)
is HomeContract.HomeSideEffect.NavigateToEnroll -> navigateToEnroll(homeSideEffect.enrollType, homeSideEffect.viewPath, homeSideEffect.id)
is HomeContract.HomeSideEffect.NavigateToAdvertisementDetail -> navigateToAdvertisementDetail(homeSideEffect.advertisementId)
is HomeContract.HomeSideEffect.NavigateToCourseDetail -> navigateToCourseDetail(homeSideEffect.courseId)
}
Expand All @@ -117,11 +118,11 @@ fun HomeRoute(
padding = padding,
uiState = uiState,
pagerState = pagerState,
navigateToEnroll = { viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToEnroll(EnrollType.TIMELINE, null)) },
navigateToEnroll = { viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToEnroll(enrollType = EnrollType.TIMELINE, viewPath = HOME, id = null)) },
navigateToPointHistory = { viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToPointHistory) },
navigateToLook = { viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToLook) },
navigateToTimelineDetail = { timelineType, timelineId -> viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToTimelineDetail(timelineType = timelineType, timelineId = timelineId)) },
onFabClick = { viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToEnroll(EnrollType.COURSE, null)) },
onFabClick = { viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToEnroll(enrollType = EnrollType.COURSE, viewPath = HOME, id = null)) },
navigateToAdvertisementDetail = { advertisementId: Int -> viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToAdvertisementDetail(advertisementId = advertisementId)) },
navigateToCourseDetail = { courseId: Int -> viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToCourseDetail(courseId = courseId)) }
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ fun NavGraphBuilder.homeNavGraph(
navigateToPointHistory: () -> Unit,
navigateToLook: (MainNavigationBarItemType) -> Unit,
navigateToTimelineDetail: (TimelineType, Int) -> Unit,
navigateToEnroll: (EnrollType, Int?) -> Unit,
navigateToEnroll: (EnrollType, String, Int?) -> Unit,
navigateToAdvertisement: (Int) -> Unit,
navigateToCourseDetail: (Int) -> Unit
) {
Expand Down
Loading
Loading