Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,9 @@ class NavigatorProviderIntent @Inject constructor(
notificationId
)

override fun getAdjustSentenceActivityIntent(): Intent = AdjustSentenceActivity.getIntent(
context
override fun getAdjustSentenceActivityIntent(userStatus: UserStatus): Intent = AdjustSentenceActivity.getIntent(
context,
AdjustSentenceActivity.StartArgs(userStatus = userStatus.name),
)

override fun getPokeActivityIntent(userStatus: UserStatus): Intent {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ enum class DeepLinkType(
},
MY_PAGE_SOPTAMP("mypage/soptamp") {
override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) =
userStatus.setIntent(navigator.getAdjustSentenceActivityIntent())
userStatus.setIntent(navigator.getAdjustSentenceActivityIntent(userStatus))
},
ATTENDANCE("home/attendance") {
override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ interface NavigatorProvider {
fun getAuthActivityIntent(): Intent
fun getNotificationActivityIntent(): Intent
fun getNotificationDetailActivityIntent(notificationId: String): Intent
fun getAdjustSentenceActivityIntent(): Intent
fun getAdjustSentenceActivityIntent(userStatus: UserStatus): Intent
fun getAttendanceActivityIntent(): Intent
fun getSoptampActivityIntent(): Intent
fun getAppjamtampActivityIntent(): Intent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ fun MainScreen(
)

myPageNavGraph(
userStatus = userStatus,
navigateToSoptLog = {
navigator.navController.navigate(SoptLog)
},
Expand All @@ -370,6 +371,7 @@ fun MainScreen(
}
) {
soptLogNavGraph(
userStatus = userStatus,
soptLogNavigation = object : SoptLogNavigation {
override fun navigateToDeepLink(url: String) {
if (userStatus == UserStatus.UNAUTHENTICATED) isOpenDialog = true
Expand Down
1 change: 1 addition & 0 deletions feature/mypage/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ dependencies {
implementation(projects.core.model)
implementation(projects.core.navigation)
implementation(projects.core.webview)
implementation(projects.core.analytics)

implementation(platform(libs.firebase))
implementation(libs.bundles.firebase)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ package org.sopt.official.feature.mypage
import android.content.Intent
import android.provider.Settings
import androidx.compose.foundation.background
import org.sopt.official.webview.view.WebViewActivity
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -50,6 +49,9 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import org.sopt.official.analytics.Tracker
import org.sopt.official.analytics.compose.LocalTracker
import org.sopt.official.analytics.trackViewType
import org.sopt.official.designsystem.SoptTheme
import org.sopt.official.feature.mypage.component.MyPageDialog
import org.sopt.official.feature.mypage.component.MyPageNavigatorButton
Expand All @@ -63,16 +65,21 @@ import org.sopt.official.feature.mypage.signout.SignOutActivity
import org.sopt.official.feature.mypage.soptamp.ui.AdjustSentenceActivity
import org.sopt.official.feature.mypage.web.WebUrlConstant
import org.sopt.official.model.UserStatus
import org.sopt.official.model.toViewType
import org.sopt.official.webview.view.WebViewActivity

@Composable
internal fun MyPageRoute(
navigateToSoptLog: () -> Unit,
navigateToPlayGroundProfile: () -> Unit,
onRestartApp: () -> Unit,
userStatus: UserStatus,
viewModel: MyPageViewModel = hiltViewModel(),
) {
val context = LocalContext.current
val tracker = LocalTracker.current
val urlHandler = LocalUriHandler.current
val viewType = userStatus.toViewType()
val state by viewModel.state.collectAsStateWithLifecycle()
val isAppjamMode by viewModel.isAppjamMode.collectAsStateWithLifecycle()

Expand All @@ -84,6 +91,10 @@ internal fun MyPageRoute(
}
}

LaunchedEffect(Unit) {
tracker.trackViewType(MypageAnalyticsEvent.VIEW_MYPAGE_MAIN, viewType)
}

val serviceSectionItems = remember {
persistentListOf(
MyPageUiModel.Header(title = "서비스 이용 방침"),
Expand All @@ -107,7 +118,10 @@ internal fun MyPageRoute(
),
MyPageUiModel.MyPageItem(
title = "의견 보내기",
onItemClick = { urlHandler.openUri(WebUrlConstant.OPINION_KAKAO_CHAT) }
onItemClick = {
urlHandler.openUri(WebUrlConstant.OPINION_KAKAO_CHAT)
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_FEEDBACK, viewType)
}
)
)
}
Expand All @@ -123,6 +137,7 @@ internal fun MyPageRoute(
putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
}
context.startActivity(intent)
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_NOTIFICATION, viewType)
}
)
)
Expand All @@ -133,11 +148,22 @@ internal fun MyPageRoute(
MyPageUiModel.Header(title = "솝탬프 설정"),
MyPageUiModel.MyPageItem(
title = "한 마디 편집",
onItemClick = { context.startActivity(AdjustSentenceActivity.getIntent(context)) }
onItemClick = {
context.startActivity(
AdjustSentenceActivity.getIntent(
context,
AdjustSentenceActivity.StartArgs(userStatus = userStatus.name),
)
)
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_EDIT_STATUSMESSAGE, viewType)
}
),
MyPageUiModel.MyPageItem(
title = "스탬프 초기화",
onItemClick = { viewModel.onAction(MyPageAction.ClearSoptamp) }
onItemClick = {
viewModel.onAction(MyPageAction.ClearSoptamp)
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_RESET_STAMP, viewType)
}
)
)
}
Expand All @@ -147,11 +173,16 @@ internal fun MyPageRoute(
MyPageUiModel.Header(title = "기타"),
MyPageUiModel.MyPageItem(
title = "로그아웃",
onItemClick = { viewModel.onAction(MyPageAction.RequestLogout) }
onItemClick = {
viewModel.onAction(MyPageAction.RequestLogout)
}
),
MyPageUiModel.MyPageItem(
title = "탈퇴하기",
onItemClick = { context.startActivity(SignOutActivity.getIntent(context)) }
onItemClick = {
context.startActivity(SignOutActivity.getIntent(context))
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_QUIT, viewType)
}
)
)
}
Expand All @@ -177,6 +208,8 @@ internal fun MyPageRoute(
onAction = viewModel::onAction,
navigateToSoptLog = navigateToSoptLog,
navigateToPlayGroundProfile = navigateToPlayGroundProfile,
tracker = tracker,
viewType = viewType
)
}

Expand All @@ -192,6 +225,8 @@ internal fun MyPageScreen(
onAction: (MyPageAction) -> Unit,
navigateToSoptLog: () -> Unit,
navigateToPlayGroundProfile: () -> Unit,
tracker:Tracker,
viewType:String
) {
val scrollState = rememberScrollState()

Expand Down Expand Up @@ -227,7 +262,10 @@ internal fun MyPageScreen(
text = "프로필 수정",
modifier = Modifier
.padding(horizontal = 20.dp),
onClick = navigateToPlayGroundProfile
onClick = {
navigateToPlayGroundProfile()
tracker.trackViewType(MypageAnalyticsEvent.CLICK_PROFILE_EDIT_BUTTON, viewType )
}
)

Spacer(modifier = Modifier.height(12.dp))
Expand All @@ -248,7 +286,10 @@ internal fun MyPageScreen(
shape = RoundedCornerShape(999.dp),
modifier = Modifier
.padding(horizontal = 20.dp),
onClick = navigateToSoptLog
onClick = {
navigateToSoptLog()
tracker.trackViewType(MypageAnalyticsEvent.CLICK_MYPAGE_SOPTLOG, viewType )
}
)

Spacer(modifier = Modifier.height(12.dp))
Expand Down Expand Up @@ -283,7 +324,10 @@ internal fun MyPageScreen(
dialogState = state.dialogState,
onDismissRequest = { onAction(MyPageAction.CloseDialog) },
onClearSoptampClick = { onAction(MyPageAction.ResetSoptamp) },
onLogoutClick = { onAction(MyPageAction.ConfirmLogout) },
onLogoutClick = {
onAction(MyPageAction.ConfirmLogout)
tracker.trackViewType(MypageAnalyticsEvent.CLICK_DONE_LOGOUT, viewType)
},
)
}
}
Expand Down Expand Up @@ -327,6 +371,8 @@ private fun ShowMyPageDialog(
@Composable
private fun MyPageScreenPreview() {
SoptTheme {
val track = LocalTracker.current

MyPageScreen(
state = MyPageState(
userStatus = UserStatus.ACTIVE,
Expand Down Expand Up @@ -360,6 +406,8 @@ private fun MyPageScreenPreview() {
onAction = {},
navigateToSoptLog = {},
navigateToPlayGroundProfile = {},
tracker = track,
viewType = "",
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.sopt.official.feature.mypage

import org.sopt.official.analytics.AnalyticsEvent
import org.sopt.official.analytics.EventType

enum class MypageAnalyticsEvent(
override val type : EventType,
override val eventName : String
):AnalyticsEvent {
VIEW_MYPAGE_MAIN(EventType.VIEW,"mypage_main"),
CLICK_PROFILE_EDIT_BUTTON(EventType.CLICK,"profile_edit_button"),
CLICK_MYPAGE_SOPTLOG(EventType.CLICK,"mypage_soptlog"),
CLICK_MYPAGE_FEEDBACK(EventType.CLICK,"mypage_feedback"),
CLICK_MYPAGE_NOTIFICATION(EventType.CLICK,"mypage_notification"),
CLICK_MYPAGE_EDIT_STATUSMESSAGE(EventType.CLICK,"mypage_edit_statusmessage"),
CLICK_DONE_EDIT_STATUSMESSAGE(EventType.CLICK,"done_edit_statusmessage"),
CLICK_MYPAGE_RESET_STAMP(EventType.CLICK,"mypage_reset_stamp"),
CLICK_DONE_LOGOUT(EventType.CLICK,"done_logout"),
CLICK_MYPAGE_QUIT(EventType.CLICK,"mypage_quit"),
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import kotlinx.serialization.Serializable
import org.sopt.official.core.navigation.MainTabRoute
import org.sopt.official.core.navigation.Route
import org.sopt.official.feature.mypage.MyPageRoute
import org.sopt.official.model.UserStatus

@Serializable
data object MyPageGraph : MainTabRoute
Expand All @@ -45,6 +46,7 @@ fun NavController.navigateToMyPage(navOptions: NavOptions? = null) {
}

fun NavGraphBuilder.myPageNavGraph(
userStatus: UserStatus,
navigateToSoptLog: () -> Unit,
navigateToAuthActivity: () -> Unit,
navigateToPlayGroundProfile: () -> Unit,
Expand All @@ -56,6 +58,7 @@ fun NavGraphBuilder.myPageNavGraph(
navigateToSoptLog = navigateToSoptLog,
navigateToPlayGroundProfile = navigateToPlayGroundProfile,
onRestartApp = navigateToAuthActivity,
userStatus = userStatus
)
}
builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,23 +43,38 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import dagger.hilt.android.AndroidEntryPoint
import java.io.Serializable
import org.sopt.official.analytics.compose.LocalTracker
import org.sopt.official.analytics.trackViewType
import org.sopt.official.common.util.serializableExtra
import org.sopt.official.common.view.toast
import org.sopt.official.designsystem.SoptTheme
import org.sopt.official.feature.mypage.MypageAnalyticsEvent
import org.sopt.official.feature.mypage.R
import org.sopt.official.feature.mypage.component.MyPageButton
import org.sopt.official.feature.mypage.component.MyPageTextField
import org.sopt.official.feature.mypage.component.MyPageTopBar
import org.sopt.official.feature.mypage.di.userRepository
import org.sopt.official.feature.mypage.soptamp.state.rememberModifyProfileState
import org.sopt.official.model.UserStatus
import org.sopt.official.model.toViewType

@AndroidEntryPoint
class AdjustSentenceActivity : AppCompatActivity() {

private val args by serializableExtra(StartArgs(UserStatus.UNAUTHENTICATED.name))

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val userStatus = args?.userStatus?.let { UserStatus.of(it) } ?: UserStatus.UNAUTHENTICATED

setContent {
SoptTheme {
val context = LocalContext.current
val tracker = LocalTracker.current
val viewType = userStatus.toViewType()

val uiState = rememberModifyProfileState(
userRepository = userRepository,
onShowToast = { context.toast(it) }
Expand Down Expand Up @@ -94,7 +109,10 @@ class AdjustSentenceActivity : AppCompatActivity() {
modifier = Modifier
.padding(20.dp)
.fillMaxWidth(),
onClick = uiState.onUpdate,
onClick = {
uiState.onUpdate()
tracker.trackViewType(MypageAnalyticsEvent.CLICK_DONE_EDIT_STATUSMESSAGE, viewType)
},
isEnabled = uiState.isConfirmed
) {
Text(
Expand All @@ -108,8 +126,14 @@ class AdjustSentenceActivity : AppCompatActivity() {
}
}

data class StartArgs(
val userStatus: String,
) : Serializable

companion object {
@JvmStatic
fun getIntent(context: Context) = Intent(context, AdjustSentenceActivity::class.java)
fun getIntent(context: Context, args: StartArgs) = Intent(context, AdjustSentenceActivity::class.java).apply {
putExtra("args", args)
}
}
}
}
1 change: 1 addition & 0 deletions feature/soptlog/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ dependencies {
implementation(projects.core.localstorage)
implementation(projects.core.navigation)
implementation(projects.core.analytics)
implementation(projects.core.model)

// domain
implementation(projects.domain.appjamtamp)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import kotlinx.collections.immutable.toImmutableList
import org.sopt.official.analytics.EventType
import org.sopt.official.analytics.compose.LocalTracker
import org.sopt.official.analytics.trackViewType
import org.sopt.official.common.util.throttledNoRippleClickable
import org.sopt.official.designsystem.SoptTheme
import org.sopt.official.designsystem.component.dialog.NetworkErrorDialog
Expand All @@ -65,10 +66,13 @@ import org.sopt.official.feature.soptlog.model.MySoptLogItemType
import org.sopt.official.feature.soptlog.model.SoptLogCategory
import org.sopt.official.feature.soptlog.navigation.SoptLogNavigation
import org.sopt.official.feature.soptlog.state.SoptLogNavigationEvent
import org.sopt.official.model.UserStatus
import org.sopt.official.model.toViewType

@Composable
internal fun SoptLogRoute(
soptLogNavigation: SoptLogNavigation,
userStatus: UserStatus,
navigateToFortune: () -> Unit = {},
navigateUp: () -> Unit = {},
viewModel: SoptLogViewModel = hiltViewModel()
Expand Down Expand Up @@ -102,6 +106,11 @@ internal fun SoptLogRoute(
val isAppjamMode by viewModel.isAppjamMode.collectAsStateWithLifecycle()
val todayFortuneText by viewModel.todayFortuneText.collectAsStateWithLifecycle("")
val tracker = LocalTracker.current
val viewType = userStatus.toViewType()

LaunchedEffect(Unit) {
tracker.trackViewType(SoptlogAnalyticsEvent.VIEW_SOPTLOG_MAIN, viewType)
}

when {
soptLogState.isLoading -> LoadingIndicator()
Expand Down
Loading
Loading