From d5966bf32fa9629bfeaf986c6ad6da1878eedc16 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Sat, 2 Aug 2025 23:15:20 +0900 Subject: [PATCH 1/4] refactor: home character recomposition --- .../feature/home/presentation/HomeScreen.kt | 10 +- .../home/presentation/HomeViewModel.kt | 333 +++++++++--------- .../component/HomeCharacterItem.kt | 275 ++++++++------- .../feature/main/navigation/MainNavigator.kt | 2 +- 4 files changed, 314 insertions(+), 306 deletions(-) diff --git a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt index 64d38211..012475c8 100644 --- a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt +++ b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt @@ -45,9 +45,11 @@ import com.teamoffroad.characterchat.presentation.model.CharacterChatLastUnreadU import com.teamoffroad.core.designsystem.component.OrbDialog import com.teamoffroad.core.designsystem.component.actionBarPadding import com.teamoffroad.feature.home.domain.model.UserQuests +import com.teamoffroad.feature.home.presentation.component.CharacterImage +import com.teamoffroad.feature.home.presentation.component.CharacterNameText import com.teamoffroad.feature.home.presentation.component.CloseCompleteRequest import com.teamoffroad.feature.home.presentation.component.CompleteQuestDialog -import com.teamoffroad.feature.home.presentation.component.HomeCharacterItem +import com.teamoffroad.feature.home.presentation.component.EmblemNameText import com.teamoffroad.feature.home.presentation.component.HomeIcons import com.teamoffroad.feature.home.presentation.component.NicknameText import com.teamoffroad.feature.home.presentation.component.RecentQuest @@ -253,7 +255,7 @@ private fun UsersAdventuresInformation( Column { NicknameText(adventuresInformationData?.nickname ?: "") - HomeCharacterItem().CharacterNameText(adventuresInformationData?.characterName ?: "") + CharacterNameText(adventuresInformationData?.characterName ?: "") } Box( @@ -262,11 +264,11 @@ private fun UsersAdventuresInformation( Modifier .align(Alignment.BottomCenter), ) { - HomeCharacterItem().CharacterImage(homeViewModel, context) + CharacterImage(homeViewModel, context) } } Spacer(modifier = Modifier.padding(10.dp)) - HomeCharacterItem().EmblemNameText(context, Modifier) + EmblemNameText(context, Modifier) } @Composable diff --git a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeViewModel.kt b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeViewModel.kt index 096c0ce2..4c44c4e8 100644 --- a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeViewModel.kt +++ b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeViewModel.kt @@ -30,222 +30,227 @@ import javax.inject.Inject @HiltViewModel class HomeViewModel - @Inject - constructor( - private val userRepository: UserRepository, - private val setAutoSignInUseCase: SetAutoSignInUseCase, - private val deviceTokenRepository: TokenRepository, - private val fcmTokenUseCase: PostFcmTokenUseCase, - private val characterChatRepository: CharacterChatRepository, - private val diarySettingUseCase: PostDiarySettingUseCase, - private val getDiaryCheckLatestUseCase: GetDiaryCheckLatestUseCase, - private val getCompleteQuestListUseCase: GetCompleteQuestListUseCase, - private val getRecentVisitedCategoryUseCase: GetRecentVisitedCategoryUseCase, - ) : ViewModel() { - private val _getUsersAdventuresInformationState = - MutableStateFlow>( - UiState.Loading, - ) - val getUsersAdventuresInformationState = _getUsersAdventuresInformationState.asStateFlow() +@Inject +constructor( + private val userRepository: UserRepository, + private val setAutoSignInUseCase: SetAutoSignInUseCase, + private val deviceTokenRepository: TokenRepository, + private val fcmTokenUseCase: PostFcmTokenUseCase, + private val characterChatRepository: CharacterChatRepository, + private val diarySettingUseCase: PostDiarySettingUseCase, + private val getDiaryCheckLatestUseCase: GetDiaryCheckLatestUseCase, + private val getCompleteQuestListUseCase: GetCompleteQuestListUseCase, + private val getRecentVisitedCategoryUseCase: GetRecentVisitedCategoryUseCase, +) : ViewModel() { + private val _getUsersAdventuresInformationState = + MutableStateFlow>( + UiState.Loading, + ) + val getUsersAdventuresInformationState = _getUsersAdventuresInformationState.asStateFlow() - private val _selectedEmblem = MutableStateFlow("") - val selectedEmblem = _selectedEmblem.asStateFlow() + private val _selectedEmblem = MutableStateFlow("") + val selectedEmblem = _selectedEmblem.asStateFlow() - private val _baseCharacterImage = MutableStateFlow("") - val baseCharacterImage = _baseCharacterImage.asStateFlow() + private val _baseCharacterImage = MutableStateFlow("") + val baseCharacterImage = _baseCharacterImage.asStateFlow() - private val _motionCharacterUrl: MutableStateFlow = MutableStateFlow(null) - val motionCharacterUrl = _motionCharacterUrl.asStateFlow() + private val _motionCharacterUrl: MutableStateFlow = MutableStateFlow(null) + val motionCharacterUrl = _motionCharacterUrl.asStateFlow() - private val _category = MutableStateFlow(PlaceCategory.NONE) - val category = _category.asStateFlow() + private val _category = MutableStateFlow(PlaceCategory.NONE) + val category = _category.asStateFlow() - private val _getEmblemsState = MutableStateFlow>>(UiState.Loading) - val getEmblemsState = _getEmblemsState.asStateFlow() + private val _getEmblemsState = MutableStateFlow>>(UiState.Loading) + val getEmblemsState = _getEmblemsState.asStateFlow() - private val _patchEmblemState = MutableStateFlow>(UiState.Loading) - val patchEmblemState = _patchEmblemState.asStateFlow() + private val _patchEmblemState = MutableStateFlow>(UiState.Loading) + val patchEmblemState = _patchEmblemState.asStateFlow() - private val _getUserQuestsState = MutableStateFlow>(UiState.Loading) - val getUserQuestsState = _getUserQuestsState.asStateFlow() + private val _getUserQuestsState = MutableStateFlow>(UiState.Loading) + val getUserQuestsState = _getUserQuestsState.asStateFlow() - private val _circleProgressBar = MutableStateFlow(0f) - val circleProgressBar = _circleProgressBar.asStateFlow() + private val _circleProgressBar = MutableStateFlow(0f) + val circleProgressBar = _circleProgressBar.asStateFlow() - private val _linearProgressBar = MutableStateFlow(0f) - val linearProgressBar = _linearProgressBar.asStateFlow() + private val _linearProgressBar = MutableStateFlow(0f) + val linearProgressBar = _linearProgressBar.asStateFlow() - private val _characterName = MutableStateFlow("") - val characterName = _characterName.asStateFlow() + private val _characterName = MutableStateFlow("") + val characterName = _characterName.asStateFlow() - private val _newDiaryExist = MutableStateFlow(true) - val newDiaryExist = _newDiaryExist.asStateFlow() + private val _newDiaryExist = MutableStateFlow(true) + val newDiaryExist = _newDiaryExist.asStateFlow() - private val _diaryCreateState = MutableStateFlow(false) - val diaryCreateState = _diaryCreateState.asStateFlow() + private val _diaryCreateState = MutableStateFlow(false) + val diaryCreateState = _diaryCreateState.asStateFlow() - private val _completeQuests = MutableStateFlow>(emptyList()) - val completeQuests = _completeQuests.asStateFlow() + private val _completeQuests = MutableStateFlow>(emptyList()) + val completeQuests = _completeQuests.asStateFlow() - init { - EventBus.getDefault().register(this) - } + init { + EventBus.getDefault().register(this) + } - override fun onCleared() { - super.onCleared() - EventBus.getDefault().unregister(this) - } + override fun onCleared() { + super.onCleared() + EventBus.getDefault().unregister(this) + } - @Subscribe(threadMode = ThreadMode.MAIN) - fun onNotificationEvent(event: DiaryCreateNotificationEvent) { - viewModelScope.launch { - getDiaryCheckLatest() - _diaryCreateState.emit(event.state) - } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onNotificationEvent(event: DiaryCreateNotificationEvent) { + viewModelScope.launch { + getDiaryCheckLatest() + _diaryCreateState.emit(event.state) } + } - private fun getUsersAdventuresInformation(category: PlaceCategory) { - viewModelScope.launch { - runCatching { - userRepository.getUsersAdventuresInformation(category.name) - }.onSuccess { state -> - _getUsersAdventuresInformationState.emit(UiState.Success(state)) - _characterName.value = state.characterName - updateSelectedEmblem(state.emblemName) - updateCharacterImage(state.baseImageUrl) - updateMotionImageUrl(state.motionImageUrl) - }.onFailure { t -> - val errorMessage = getErrorMessage(t) - _getUsersAdventuresInformationState.emit(UiState.Failure(errorMessage)) - } + private fun getUsersAdventuresInformation(category: PlaceCategory) { + viewModelScope.launch { + runCatching { + userRepository.getUsersAdventuresInformation(category.name) + }.onSuccess { state -> + _getUsersAdventuresInformationState.emit(UiState.Success(state)) + _characterName.value = state.characterName + updateSelectedEmblem(state.emblemName) + updateCharacterImage(state.baseImageUrl) + updateMotionImageUrl(state.motionImageUrl) + }.onFailure { t -> + val errorMessage = getErrorMessage(t) + _getUsersAdventuresInformationState.emit(UiState.Failure(errorMessage)) } } + } - private fun updateSelectedEmblem(emblemName: String) { - _selectedEmblem.value = emblemName - } + private fun updateSelectedEmblem(emblemName: String) { + _selectedEmblem.value = emblemName + } - private fun updateCharacterImage(imageUrl: String) { - _baseCharacterImage.value = imageUrl - } + private fun updateCharacterImage(imageUrl: String) { + _baseCharacterImage.value = imageUrl + } - private fun updateMotionImageUrl(motionImageUrl: String?) { + private fun updateMotionImageUrl(motionImageUrl: String?) { + val currentUrl = _motionCharacterUrl.value + val actualPath = motionImageUrl?.substringBefore("?") ?: motionImageUrl + val currentPath = currentUrl?.substringBefore("?") ?: currentUrl + if (currentPath != actualPath) { _motionCharacterUrl.value = motionImageUrl } + } - fun updateCategory() { - viewModelScope.launch { - runCatching { - getRecentVisitedCategoryUseCase() - }.onSuccess { - _category.value = it - getUsersAdventuresInformation(it) - } + fun updateCategory() { + viewModelScope.launch { + runCatching { + getRecentVisitedCategoryUseCase() + }.onSuccess { + _category.value = it + getUsersAdventuresInformation(it) } } + } - fun updateCircleProgressBar( - amount: Float, - total: Float, - ) { - _circleProgressBar.value = if (total == 0f) 0f else amount / total - } + fun updateCircleProgressBar( + amount: Float, + total: Float, + ) { + _circleProgressBar.value = if (total == 0f) 0f else amount / total + } - fun updateLinearProgressBar( - amount: Float, - total: Float, - ) { - _linearProgressBar.value = if (total == 0f) 0f else amount / total - } + fun updateLinearProgressBar( + amount: Float, + total: Float, + ) { + _linearProgressBar.value = if (total == 0f) 0f else amount / total + } - fun getEmblems() { - viewModelScope.launch { - runCatching { - userRepository.getEmblems() - }.onSuccess { state -> - _getEmblemsState.emit(UiState.Success(state)) - }.onFailure { t -> - val errorMessage = getErrorMessage(t) - _getEmblemsState.emit(UiState.Failure(errorMessage)) - } + fun getEmblems() { + viewModelScope.launch { + runCatching { + userRepository.getEmblems() + }.onSuccess { state -> + _getEmblemsState.emit(UiState.Success(state)) + }.onFailure { t -> + val errorMessage = getErrorMessage(t) + _getEmblemsState.emit(UiState.Failure(errorMessage)) } } + } - fun patchEmblem(emblem: Emblem) { - viewModelScope.launch { - runCatching { - userRepository.patchEmblem(emblem.emblemCode) - }.onSuccess { state -> - _patchEmblemState.emit(UiState.Success(state)) - updateSelectedEmblem(emblem.emblemName) - }.onFailure { t -> - val errorMessage = getErrorMessage(t) - _patchEmblemState.emit(UiState.Failure(errorMessage)) - } + fun patchEmblem(emblem: Emblem) { + viewModelScope.launch { + runCatching { + userRepository.patchEmblem(emblem.emblemCode) + }.onSuccess { state -> + _patchEmblemState.emit(UiState.Success(state)) + updateSelectedEmblem(emblem.emblemName) + }.onFailure { t -> + val errorMessage = getErrorMessage(t) + _patchEmblemState.emit(UiState.Failure(errorMessage)) } } + } - fun getUserQuests() { - viewModelScope.launch { - runCatching { - userRepository.getUserQuests() - }.onSuccess { state -> - _getUserQuestsState.emit(UiState.Success(state)) - }.onFailure { t -> - val errorMessage = getErrorMessage(t) - _getUserQuestsState.emit(UiState.Failure(errorMessage)) - } + fun getUserQuests() { + viewModelScope.launch { + runCatching { + userRepository.getUserQuests() + }.onSuccess { state -> + _getUserQuestsState.emit(UiState.Success(state)) + }.onFailure { t -> + val errorMessage = getErrorMessage(t) + _getUserQuestsState.emit(UiState.Failure(errorMessage)) } } + } - fun updateAutoSignIn() { - viewModelScope.launch { - setAutoSignInUseCase.invoke(true) - } + fun updateAutoSignIn() { + viewModelScope.launch { + setAutoSignInUseCase.invoke(true) } + } - fun updateFcmToken() { - viewModelScope.launch { - val deviceToken = deviceTokenRepository.getDeviceToken().first() - if (deviceToken.isBlank()) return@launch - runCatching { - fcmTokenUseCase.invoke(deviceToken) - }.onSuccess { } - .onFailure {} - } + fun updateFcmToken() { + viewModelScope.launch { + val deviceToken = deviceTokenRepository.getDeviceToken().first() + if (deviceToken.isBlank()) return@launch + runCatching { + fcmTokenUseCase.invoke(deviceToken) + }.onSuccess { } + .onFailure {} } + } - fun getDiaryCheckLatest() { - viewModelScope.launch { - getDiaryCheckLatestUseCase.invoke().onSuccess { - if (it != null) { - _newDiaryExist.emit(it) - } + fun getDiaryCheckLatest() { + viewModelScope.launch { + getDiaryCheckLatestUseCase.invoke().onSuccess { + if (it != null) { + _newDiaryExist.emit(it) } } } + } - fun initUserDiarySetting() { - viewModelScope.launch { runCatching { diarySettingUseCase.invoke() } } - } + fun initUserDiarySetting() { + viewModelScope.launch { runCatching { diarySettingUseCase.invoke() } } + } - fun updateDiaryCreateDialogUnShown() { - viewModelScope.launch { - _diaryCreateState.emit(false) - } + fun updateDiaryCreateDialogUnShown() { + viewModelScope.launch { + _diaryCreateState.emit(false) } + } - fun loadCompleteQuests() { - viewModelScope.launch { - runCatching { - getCompleteQuestListUseCase() - }.onSuccess { quests -> - _completeQuests.value = quests - } + fun loadCompleteQuests() { + viewModelScope.launch { + runCatching { + getCompleteQuestListUseCase() + }.onSuccess { quests -> + _completeQuests.value = quests } } + } - companion object { - const val MIN_SHOWN_EMBLEM_DIALOG = 6 - } + companion object { + const val MIN_SHOWN_EMBLEM_DIALOG = 6 } +} diff --git a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeCharacterItem.kt b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeCharacterItem.kt index 6c49215b..c661f9ea 100644 --- a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeCharacterItem.kt +++ b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeCharacterItem.kt @@ -45,164 +45,165 @@ import com.teamoffroad.feature.home.presentation.HomeViewModel import com.teamoffroad.feature.home.presentation.model.HomeUserChangeEmblemDialogStateModel import com.teamoffroad.offroad.feature.home.R -class HomeCharacterItem { +@Composable +fun CharacterImage( + viewModel: HomeViewModel, + context: Context, +) { + val baseCharacterImage = viewModel.baseCharacterImage.collectAsState().value + val motionCharacterUrl = viewModel.motionCharacterUrl.collectAsState().value + val normalizedUrl = remember(motionCharacterUrl) { + motionCharacterUrl?.substringBefore("?") + } - @Composable - fun CharacterImage( - viewModel: HomeViewModel, - context: Context, + Box( + modifier = Modifier + .aspectRatio(280f / 280f), + contentAlignment = Alignment.Center ) { - val baseCharacterImage = viewModel.baseCharacterImage.collectAsState().value - val motionCharacterUrl = viewModel.motionCharacterUrl.collectAsState().value - - Box( - modifier = Modifier - .aspectRatio(280f / 280f), - contentAlignment = Alignment.Center - ) { - if (motionCharacterUrl == null) { - Box( + if (motionCharacterUrl == null) { + Box( + modifier = Modifier + .padding(top = 120.dp) + .fillMaxHeight() + .align(Alignment.BottomCenter) + ) { + AsyncImage( + model = ImageRequest.Builder(context) + .data(baseCharacterImage) + .decoderFactory(SvgDecoder.Factory()) + .build(), + contentDescription = "explorer", modifier = Modifier - .padding(top = 120.dp) - .fillMaxHeight() - .align(Alignment.BottomCenter) - ) { - AsyncImage( - model = ImageRequest.Builder(context) - .data(baseCharacterImage) - .decoderFactory(SvgDecoder.Factory()) - .build(), - contentDescription = "explorer", - modifier = Modifier - .aspectRatio(210f / 210f) - .fillMaxSize() - .align(Alignment.BottomCenter), - ) - } - } else { - val composition by rememberLottieComposition( - spec = LottieCompositionSpec.Url(motionCharacterUrl) + .aspectRatio(210f / 210f) + .fillMaxSize() + .align(Alignment.BottomCenter), ) + } + } else { + val composition by rememberLottieComposition( + spec = LottieCompositionSpec.Url(motionCharacterUrl), + cacheKey = normalizedUrl + ) - val progress by animateLottieCompositionAsState( - composition = composition, - iterations = 60 - ) + val progress by animateLottieCompositionAsState( + composition = composition, + iterations = 60 + ) - val lottieAnimatable = rememberLottieAnimatable() + val lottieAnimatable = rememberLottieAnimatable() - LaunchedEffect(composition) { - lottieAnimatable.animate( - composition = composition, - initialProgress = 0f - ) - } + LaunchedEffect(composition) { + lottieAnimatable.animate( + composition = composition, + initialProgress = 0f + ) + } - Box( + Box( + modifier = Modifier + .fillMaxSize() + .padding(top = 140.dp) + .aspectRatio(210f / 210f) + ) { + LottieAnimation( + composition = composition, + progress = progress, modifier = Modifier .fillMaxSize() - .padding(top = 140.dp) - .aspectRatio(210f / 210f) - ) { - LottieAnimation( - composition = composition, - progress = progress, - modifier = Modifier - .fillMaxSize() - .padding(30.dp) - .align(Alignment.BottomCenter) - ) - } + .padding(30.dp) + .align(Alignment.BottomCenter) + ) } } } +} - @Composable - fun CharacterNameText( - name: String, - backgroundColor: Color = Sub55, - borderColor: Color = Sub, - ) { - Text( - style = OffroadTheme.typography.subtitle2Semibold, - text = name, - modifier = Modifier - .padding(start = 24.dp, top = 12.dp) - .background( - color = backgroundColor, - shape = RoundedCornerShape(20.dp) - ) - .border( - width = 1.dp, - shape = RoundedCornerShape(20.dp), - color = borderColor - ) - .padding(horizontal = 16.dp) - .padding(vertical = 6.dp), - color = White - ) - } - - @SuppressLint("UnrememberedMutableState") - @Composable - fun EmblemNameText( - context: Context, - modifier: Modifier = Modifier, - ) { - val viewModel: HomeViewModel = hiltViewModel() - val emblemState = viewModel.patchEmblemState.collectAsState(initial = UiState.Loading).value - val userEmblem = viewModel.selectedEmblem.collectAsState().value - val homeUserChangeEmblemDialogStateModel = - remember { mutableStateOf(null) } - val interactionSource: MutableInteractionSource = remember { MutableInteractionSource() } +@Composable +fun CharacterNameText( + name: String, + backgroundColor: Color = Sub55, + borderColor: Color = Sub, +) { + Text( + style = OffroadTheme.typography.subtitle2Semibold, + text = name, + modifier = Modifier + .padding(start = 24.dp, top = 12.dp) + .background( + color = backgroundColor, + shape = RoundedCornerShape(20.dp) + ) + .border( + width = 1.dp, + shape = RoundedCornerShape(20.dp), + color = borderColor + ) + .padding(horizontal = 16.dp) + .padding(vertical = 6.dp), + color = White + ) +} - val isChangeEmblemDialogShown = remember { mutableStateOf(false) } +@SuppressLint("UnrememberedMutableState") +@Composable +fun EmblemNameText( + context: Context, + modifier: Modifier = Modifier, +) { + val viewModel: HomeViewModel = hiltViewModel() + val emblemState = viewModel.patchEmblemState.collectAsState(initial = UiState.Loading).value + val userEmblem = viewModel.selectedEmblem.collectAsState().value + val homeUserChangeEmblemDialogStateModel = + remember { mutableStateOf(null) } + val interactionSource: MutableInteractionSource = remember { MutableInteractionSource() } - when (emblemState) { - is UiState.Success -> null - is UiState.Failure -> { - Toast.makeText(context, emblemState.errorMessage, Toast.LENGTH_SHORT).show() - null - } + val isChangeEmblemDialogShown = remember { mutableStateOf(false) } - else -> null + when (emblemState) { + is UiState.Success -> null + is UiState.Failure -> { + Toast.makeText(context, emblemState.errorMessage, Toast.LENGTH_SHORT).show() + null } - Box( - modifier = modifier - .padding(horizontal = 24.dp) - .fillMaxWidth(), - contentAlignment = Alignment.CenterEnd - ) { - OffroadTagItem(text = userEmblem) - Image( - painter = painterResource(id = R.drawable.ic_home_change_title), - contentDescription = "change title", - modifier = Modifier - .padding(top = 8.dp, bottom = 8.dp, end = 20.dp) - .clickableWithoutRipple( - interactionSource = interactionSource - ) { - isChangeEmblemDialogShown.value = true - } - ) + else -> null + } + + Box( + modifier = modifier + .padding(horizontal = 24.dp) + .fillMaxWidth(), + contentAlignment = Alignment.CenterEnd + ) { + OffroadTagItem(text = userEmblem) + Image( + painter = painterResource(id = R.drawable.ic_home_change_title), + contentDescription = "change title", + modifier = Modifier + .padding(top = 8.dp, bottom = 8.dp, end = 20.dp) + .clickableWithoutRipple( + interactionSource = interactionSource + ) { + isChangeEmblemDialogShown.value = true + } + ) - if (isChangeEmblemDialogShown.value) { - ChangeEmblemDialog( - showDialog = isChangeEmblemDialogShown, - homeUserChangeEmblemDialogStateModel = homeUserChangeEmblemDialogStateModel, - originEmblem = userEmblem, - onClickCancel = { - isChangeEmblemDialogShown.value = false - homeUserChangeEmblemDialogStateModel.value?.onClickCancel - }, - onCharacterChange = { emblem -> - if (emblem != null) { - viewModel.patchEmblem(emblem) - } + if (isChangeEmblemDialogShown.value) { + ChangeEmblemDialog( + showDialog = isChangeEmblemDialogShown, + homeUserChangeEmblemDialogStateModel = homeUserChangeEmblemDialogStateModel, + originEmblem = userEmblem, + onClickCancel = { + isChangeEmblemDialogShown.value = false + homeUserChangeEmblemDialogStateModel.value?.onClickCancel + }, + onCharacterChange = { emblem -> + if (emblem != null) { + viewModel.patchEmblem(emblem) } - ) - } + } + ) } } } \ No newline at end of file diff --git a/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt b/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt index d39fcfd5..a69ff4fd 100644 --- a/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt +++ b/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt @@ -65,7 +65,7 @@ internal class MainNavigator( saveState = true } launchSingleTop = true - restoreState = false + restoreState = true } } From ac26285f3c15a705fa8ee50d91b0902489a307b2 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Sat, 2 Aug 2025 23:24:03 +0900 Subject: [PATCH 2/4] refactor: diary top bar text --- .../teamoffroad/core/navigation/RouteModel.kt | 1 + .../diary/navigation/DiaryNavigation.kt | 6 +++-- .../feature/diary/presentation/DiaryScreen.kt | 3 ++- feature/diary/src/main/res/values/string.xml | 1 + .../feature/home/navigation/HomeNavigation.kt | 2 +- .../feature/home/presentation/HomeScreen.kt | 6 ++--- .../home/presentation/component/HomeIcons.kt | 27 ++++++++++--------- .../feature/main/navigation/MainNavigator.kt | 2 ++ .../mypage/navigation/MyPageNavigation.kt | 2 +- .../mypage/presentation/MyPageScreen.kt | 12 ++++++--- 10 files changed, 38 insertions(+), 24 deletions(-) diff --git a/core/navigation/src/main/java/com/teamoffroad/core/navigation/RouteModel.kt b/core/navigation/src/main/java/com/teamoffroad/core/navigation/RouteModel.kt index 67783ef4..54a666c9 100644 --- a/core/navigation/src/main/java/com/teamoffroad/core/navigation/RouteModel.kt +++ b/core/navigation/src/main/java/com/teamoffroad/core/navigation/RouteModel.kt @@ -136,6 +136,7 @@ sealed interface DiaryRoute : Route { @Serializable data class Diary( val newDiaryExist: Boolean, + val beforeNavigateRoute: String, val characterName: String, ) : DiaryRoute } diff --git a/feature/diary/src/main/java/com/teamoffroad/feature/diary/navigation/DiaryNavigation.kt b/feature/diary/src/main/java/com/teamoffroad/feature/diary/navigation/DiaryNavigation.kt index 03a03c74..cfb6043d 100644 --- a/feature/diary/src/main/java/com/teamoffroad/feature/diary/navigation/DiaryNavigation.kt +++ b/feature/diary/src/main/java/com/teamoffroad/feature/diary/navigation/DiaryNavigation.kt @@ -8,8 +8,8 @@ import com.teamoffroad.core.navigation.DiaryRoute import com.teamoffroad.core.navigation.RecommendPlaceRoute import com.teamoffroad.feature.diary.presentation.DiaryScreen -fun NavController.navigateToDiary(newDiaryExist: Boolean, characterName: String) { - navigate(DiaryRoute.Diary(newDiaryExist, characterName)) +fun NavController.navigateToDiary(newDiaryExist: Boolean, beforeNavigateRoute: String, characterName: String) { + navigate(DiaryRoute.Diary(newDiaryExist, beforeNavigateRoute, characterName)) } fun NavGraphBuilder.diaryNavGraph( @@ -19,9 +19,11 @@ fun NavGraphBuilder.diaryNavGraph( ) { composable { backStackEntry -> val newDiaryExist = backStackEntry.toRoute().newDiaryExist + val beforeNavigateRoute = backStackEntry.toRoute().beforeNavigateRoute val characterName = backStackEntry.toRoute().characterName DiaryScreen( newDiaryExist = newDiaryExist, + beforeNavigateRoute= beforeNavigateRoute, characterName = characterName, navigateToBack = navigateToBack, navigateToCharacterChat = navigateToCharacterChat, diff --git a/feature/diary/src/main/java/com/teamoffroad/feature/diary/presentation/DiaryScreen.kt b/feature/diary/src/main/java/com/teamoffroad/feature/diary/presentation/DiaryScreen.kt index 4ab57c8d..4577c813 100644 --- a/feature/diary/src/main/java/com/teamoffroad/feature/diary/presentation/DiaryScreen.kt +++ b/feature/diary/src/main/java/com/teamoffroad/feature/diary/presentation/DiaryScreen.kt @@ -40,6 +40,7 @@ import kotlinx.coroutines.flow.collectLatest @Composable fun DiaryScreen( newDiaryExist: Boolean, + beforeNavigateRoute: String, characterName: String, navigateToBack: () -> Unit, navigateToCharacterChat: (String) -> Unit, @@ -94,7 +95,7 @@ fun DiaryScreen( ), ) { NavigateBackAppBar( - text = stringResource(id = R.string.diary_back_home), + text = stringResource(id = if (beforeNavigateRoute == "home") R.string.diary_back_home else R.string.diary_back_mypage), modifier = Modifier.padding(top = 20.dp) ) { viewModel.updateNavigationBackState() diff --git a/feature/diary/src/main/res/values/string.xml b/feature/diary/src/main/res/values/string.xml index 30b8ea56..9a762ff2 100644 --- a/feature/diary/src/main/res/values/string.xml +++ b/feature/diary/src/main/res/values/string.xml @@ -3,6 +3,7 @@ 만들어진 일기가 없어요\n\n오브가 아직 어색한가 봐요\n조금 더 대화를 나눠보세요. 채팅하러 가기 + 마이페이지 기억빛 diff --git a/feature/home/src/main/java/com/teamoffroad/feature/home/navigation/HomeNavigation.kt b/feature/home/src/main/java/com/teamoffroad/feature/home/navigation/HomeNavigation.kt index b3c40625..e53353cb 100644 --- a/feature/home/src/main/java/com/teamoffroad/feature/home/navigation/HomeNavigation.kt +++ b/feature/home/src/main/java/com/teamoffroad/feature/home/navigation/HomeNavigation.kt @@ -18,7 +18,7 @@ fun NavGraphBuilder.homeNavGraph( navigateToBack: () -> Unit, navigateToGainedCharacter: () -> Unit, navigateToCharacterChatScreen: (String) -> Unit, - navigateToDiary: (Boolean, String) -> Unit, + navigateToDiary: (Boolean,String, String) -> Unit, navigateToRecommendPlace: (Boolean, String, String) -> Unit, ) { composable { diff --git a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt index 012475c8..3987b352 100644 --- a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt +++ b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt @@ -62,7 +62,7 @@ import com.teamoffroad.offroad.feature.home.R fun HomeScreen( navigateToGainedCharacter: () -> Unit = {}, navigateToCharacterChatScreen: (String) -> Unit, - navigateToDiary: (Boolean, String) -> Unit, + navigateToDiary: (Boolean, String, String) -> Unit, navigateToRecommendPlace: (Boolean, String, String) -> Unit, ) { val context = LocalContext.current @@ -164,7 +164,7 @@ fun HomeScreen( cancelButtonText = stringResource(id = R.string.home_diary_create_cancel), nextButtonText = stringResource(id = R.string.home_confirm), onClick = { - if (!newDiaryExist.value) navigateToDiary(true, characterName.value) + if (!newDiaryExist.value) navigateToDiary(true, "home", characterName.value) homeViewModel.updateDiaryCreateDialogUnShown() }, onCancelClick = { @@ -209,7 +209,7 @@ private fun UsersAdventuresInformation( updateCharacterChatExist: (Boolean) -> Unit, updateCharacterName: (String) -> Unit, updateLastUnreadChatDosAllRead: (Boolean) -> Unit, - navigateToDiary: (Boolean, String) -> Unit, + navigateToDiary: (Boolean, String, String) -> Unit, navigateToRecommendPlace: (Boolean, String, String) -> Unit, ) { val adventuresInformationState = diff --git a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeIcons.kt b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeIcons.kt index 381eae7c..cd4e69a1 100644 --- a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeIcons.kt +++ b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeIcons.kt @@ -1,15 +1,10 @@ package com.teamoffroad.feature.home.presentation.component -import android.Manifest import android.content.Context -import android.content.pm.PackageManager import android.os.Build -import androidx.activity.compose.rememberLauncherForActivityResult -import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.RequiresApi import androidx.compose.foundation.Canvas import androidx.compose.foundation.Image -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -19,19 +14,15 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.runtime.Composable import androidx.compose.runtime.State -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.drawscope.Fill import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import androidx.core.content.ContextCompat import com.teamoffroad.characterchat.presentation.model.CharacterChatLastUnreadUiState import com.teamoffroad.core.designsystem.component.clickableWithoutRipple import com.teamoffroad.core.designsystem.theme.ErrorNew import com.teamoffroad.offroad.feature.home.R -import kotlinx.coroutines.launch @RequiresApi(Build.VERSION_CODES.TIRAMISU) @Composable @@ -46,7 +37,7 @@ fun HomeIcons( updateCharacterChatExist: (Boolean) -> Unit, updateCharacterName: (String) -> Unit, updateLastUnreadChatDosAllRead: (Boolean) -> Unit, - navigateToDiary: (Boolean, String) -> Unit, + navigateToDiary: (Boolean, String, String) -> Unit, navigateToRecommendPlace: (Boolean, String, String) -> Unit, ) { Box(modifier = Modifier.fillMaxSize()) { @@ -76,7 +67,13 @@ fun HomeIcons( } Box( - modifier = Modifier.clickableWithoutRipple { navigateToRecommendPlace(false, characterName, "") } + modifier = Modifier.clickableWithoutRipple { + navigateToRecommendPlace( + false, + characterName, + "" + ) + } ) { Image( painter = painterResource(id = R.drawable.ic_home_recommend_place), @@ -91,7 +88,13 @@ fun HomeIcons( ) Box( - modifier = Modifier.clickableWithoutRipple { navigateToDiary(!newDiaryExist, characterName) } + modifier = Modifier.clickableWithoutRipple { + navigateToDiary( + !newDiaryExist, + "home", + characterName + ) + } ) { Image( painter = painterResource(id = R.drawable.ic_home_diary_empty), diff --git a/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt b/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt index a69ff4fd..2b3f197f 100644 --- a/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt +++ b/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt @@ -216,10 +216,12 @@ internal class MainNavigator( fun navigateToDiary( newDiaryExist: Boolean, + beforeNavigateRoute: String, characterName: String, ) { navController.navigateToDiary( newDiaryExist = newDiaryExist, + beforeNavigateRoute = beforeNavigateRoute, characterName = characterName, ) } diff --git a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/navigation/MyPageNavigation.kt b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/navigation/MyPageNavigation.kt index e514adcd..798e4dde 100644 --- a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/navigation/MyPageNavigation.kt +++ b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/navigation/MyPageNavigation.kt @@ -108,7 +108,7 @@ fun NavGraphBuilder.myPageNavGraph( navigateToCharacterChat: (Int, String) -> Unit, navigateToAnnouncementDeleteStack: () -> Unit, navigateToSupport: () -> Unit, - navigateToDiary: (Boolean, String) -> Unit, + navigateToDiary: (Boolean, String, String) -> Unit, navigateToDiaryTime: () -> Unit ) { composable { diff --git a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/MyPageScreen.kt b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/MyPageScreen.kt index 558787e5..4121e737 100644 --- a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/MyPageScreen.kt +++ b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/MyPageScreen.kt @@ -18,13 +18,11 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.teamoffroad.core.designsystem.component.actionBarPadding import com.teamoffroad.core.designsystem.theme.ListBg -import com.teamoffroad.core.designsystem.theme.OffroadTheme import com.teamoffroad.feature.mypage.presentation.component.AcquireCharacter import com.teamoffroad.feature.mypage.presentation.component.AcquireCoupon import com.teamoffroad.feature.mypage.presentation.component.AcquireEmblem @@ -39,7 +37,7 @@ internal fun MyPageScreen( navigateToGainedCoupon: () -> Unit, navigateToGainedEmblems: () -> Unit, navigateToSetting: () -> Unit, - navigateToDiary: (Boolean, String) -> Unit, + navigateToDiary: (Boolean, String, String) -> Unit, myPageViewModel: MyPageViewModel = hiltViewModel(), ) { @@ -83,7 +81,13 @@ internal fun MyPageScreen( ) UserDiary( modifier = Modifier.padding(top = 8.dp), - navigateToUserDiary = { navigateToDiary(!newDiaryExist, myPageViewModel.characterName.value) } + navigateToUserDiary = { + navigateToDiary( + !newDiaryExist, + "mypage", + myPageViewModel.characterName.value + ) + } ) Row( modifier = Modifier From 4fbbbeef33d019452e6b10acf99361f9295f3f0d Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:26:54 +0900 Subject: [PATCH 3/4] refactor: memory light guide dialog scroll --- .../com/teamoffroad/feature/diary/component/DiaryHintDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/diary/src/main/java/com/teamoffroad/feature/diary/component/DiaryHintDialog.kt b/feature/diary/src/main/java/com/teamoffroad/feature/diary/component/DiaryHintDialog.kt index 5eea3647..22066d6f 100644 --- a/feature/diary/src/main/java/com/teamoffroad/feature/diary/component/DiaryHintDialog.kt +++ b/feature/diary/src/main/java/com/teamoffroad/feature/diary/component/DiaryHintDialog.kt @@ -85,7 +85,7 @@ fun DiaryHintDialog( HorizontalPager( verticalAlignment = Alignment.Top, state = pagerState, - userScrollEnabled = false, + userScrollEnabled = true, modifier = Modifier.weight(1f), ) { page -> when (page) { From f8f9d46edbeb942166999b3f0b8ea6f4f0c78141 Mon Sep 17 00:00:00 2001 From: leeseokchan00 <112953135+leeseokchan00@users.noreply.github.com> Date: Sun, 24 Aug 2025 21:55:38 +0900 Subject: [PATCH 4/4] refactor: Edit gained character back stack --- .../teamoffroad/core/navigation/RouteModel.kt | 4 +++- .../feature/home/navigation/HomeNavigation.kt | 2 +- .../feature/home/presentation/HomeScreen.kt | 4 ++-- .../home/presentation/component/HomeIcons.kt | 4 ++-- .../feature/main/navigation/MainNavHost.kt | 10 ++++------ .../feature/main/navigation/MainNavigator.kt | 6 ++++-- .../mypage/navigation/MyPageNavigation.kt | 20 ++++++++++++------- .../presentation/GainedCharacterScreen.kt | 3 ++- .../mypage/presentation/MyPageScreen.kt | 4 ++-- .../mypage/src/main/res/values/strings.xml | 1 + 10 files changed, 34 insertions(+), 24 deletions(-) diff --git a/core/navigation/src/main/java/com/teamoffroad/core/navigation/RouteModel.kt b/core/navigation/src/main/java/com/teamoffroad/core/navigation/RouteModel.kt index 54a666c9..9fd34103 100644 --- a/core/navigation/src/main/java/com/teamoffroad/core/navigation/RouteModel.kt +++ b/core/navigation/src/main/java/com/teamoffroad/core/navigation/RouteModel.kt @@ -75,7 +75,9 @@ sealed interface MyPageRoute : Route { ) : MyPageRoute @Serializable - data object GainedCharacter : MyPageRoute + data class GainedCharacter( + val beforeNavigateRoute: String, + ) : MyPageRoute @Serializable data object GainedEmblems : MyPageRoute diff --git a/feature/home/src/main/java/com/teamoffroad/feature/home/navigation/HomeNavigation.kt b/feature/home/src/main/java/com/teamoffroad/feature/home/navigation/HomeNavigation.kt index e53353cb..0e4bf811 100644 --- a/feature/home/src/main/java/com/teamoffroad/feature/home/navigation/HomeNavigation.kt +++ b/feature/home/src/main/java/com/teamoffroad/feature/home/navigation/HomeNavigation.kt @@ -16,7 +16,7 @@ fun NavController.navigateToHome(navOptions: NavOptions) { @RequiresApi(Build.VERSION_CODES.TIRAMISU) fun NavGraphBuilder.homeNavGraph( navigateToBack: () -> Unit, - navigateToGainedCharacter: () -> Unit, + navigateToGainedCharacter: (String) -> Unit, navigateToCharacterChatScreen: (String) -> Unit, navigateToDiary: (Boolean,String, String) -> Unit, navigateToRecommendPlace: (Boolean, String, String) -> Unit, diff --git a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt index 3987b352..8a309115 100644 --- a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt +++ b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/HomeScreen.kt @@ -60,7 +60,7 @@ import com.teamoffroad.offroad.feature.home.R @RequiresApi(Build.VERSION_CODES.TIRAMISU) @Composable fun HomeScreen( - navigateToGainedCharacter: () -> Unit = {}, + navigateToGainedCharacter: (String) -> Unit = {}, navigateToCharacterChatScreen: (String) -> Unit, navigateToDiary: (Boolean, String, String) -> Unit, navigateToRecommendPlace: (Boolean, String, String) -> Unit, @@ -204,7 +204,7 @@ private fun UsersAdventuresInformation( modifier: Modifier = Modifier, homeViewModel: HomeViewModel, characterChatLastUnreadUiState: State, - navigateToGainedCharacter: () -> Unit, + navigateToGainedCharacter: (String) -> Unit, updateShowUserChatTextField: (Boolean) -> Unit, updateCharacterChatExist: (Boolean) -> Unit, updateCharacterName: (String) -> Unit, diff --git a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeIcons.kt b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeIcons.kt index cd4e69a1..68964158 100644 --- a/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeIcons.kt +++ b/feature/home/src/main/java/com/teamoffroad/feature/home/presentation/component/HomeIcons.kt @@ -32,7 +32,7 @@ fun HomeIcons( characterName: String, newDiaryExist: Boolean, characterChatLastUnreadUiState: State, - navigateToGainedCharacter: () -> Unit, + navigateToGainedCharacter: (String) -> Unit, updateShowUserChatTextField: (Boolean) -> Unit, updateCharacterChatExist: (Boolean) -> Unit, updateCharacterName: (String) -> Unit, @@ -84,7 +84,7 @@ fun HomeIcons( Image( painter = painterResource(id = R.drawable.ic_home_change_character), contentDescription = "change", - modifier = Modifier.clickableWithoutRipple { navigateToGainedCharacter() } + modifier = Modifier.clickableWithoutRipple { navigateToGainedCharacter("home") } ) Box( diff --git a/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavHost.kt b/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavHost.kt index 1fbdea59..917b1235 100644 --- a/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavHost.kt +++ b/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavHost.kt @@ -51,10 +51,8 @@ internal fun MainNavHost( navigateToCharacterChatScreen = { characterName -> navigator.navigateToCharacterChat(characterName) }, - navigateToGainedCharacter = { - navigator.navigateToMyPage().also { - navigator.navigateToGainedCharacter() - } + navigateToGainedCharacter = { beforeNavigateRoute -> + navigator.navigateToGainedCharacter(beforeNavigateRoute = beforeNavigateRoute) }, navigateToDiary = navigator::navigateToDiary, navigateToRecommendPlace = navigator::navigateToRecommendPlace, @@ -87,8 +85,8 @@ internal fun MainNavHost( placeId, ) }, - navigateToGainedCharacter = { - navigator.navigateToGainedCharacter() + navigateToGainedCharacter = { beforeNavigateRoute -> + navigator.navigateToGainedCharacter(beforeNavigateRoute) }, navigateToGainedEmblems = navigator::navigateToGainedEmblems, navigateToSetting = navigator::navigateToSetting, diff --git a/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt b/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt index 2b3f197f..b23ca9be 100644 --- a/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt +++ b/feature/main/src/main/java/com/teamoffroad/feature/main/navigation/MainNavigator.kt @@ -188,8 +188,10 @@ internal class MainNavigator( navController.navigateToCourseQuestDetail(questId, deadline, dDay) } - fun navigateToGainedCharacter() { - navController.navigateToGainedCharacter() + fun navigateToGainedCharacter( + beforeNavigateRoute: String + ) { + navController.navigateToGainedCharacter(beforeNavigateRoute = beforeNavigateRoute) } fun navigateToGainedEmblems() { diff --git a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/navigation/MyPageNavigation.kt b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/navigation/MyPageNavigation.kt index 798e4dde..d22e51df 100644 --- a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/navigation/MyPageNavigation.kt +++ b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/navigation/MyPageNavigation.kt @@ -12,20 +12,20 @@ import com.teamoffroad.feature.mypage.presentation.AnnouncementDetailScreen import com.teamoffroad.feature.mypage.presentation.AnnouncementScreen import com.teamoffroad.feature.mypage.presentation.AvailableCouponDetailScreen import com.teamoffroad.feature.mypage.presentation.CharacterDetailScreen -import com.teamoffroad.feature.mypage.presentation.diaryTime.DiaryTimeScreen import com.teamoffroad.feature.mypage.presentation.GainedCharacterScreen import com.teamoffroad.feature.mypage.presentation.GainedCouponScreen import com.teamoffroad.feature.mypage.presentation.GainedEmblemsScreen import com.teamoffroad.feature.mypage.presentation.MyPageScreen import com.teamoffroad.feature.mypage.presentation.SettingScreen import com.teamoffroad.feature.mypage.presentation.SupportScreen +import com.teamoffroad.feature.mypage.presentation.diaryTime.DiaryTimeScreen fun NavController.navigateToMyPage(navOptions: NavOptions) { navigate(MainTabRoute.MyPage, navOptions) } -fun NavController.navigateToGainedCharacter() { - navigate(MyPageRoute.GainedCharacter) +fun NavController.navigateToGainedCharacter(beforeNavigateRoute: String) { + navigate(MyPageRoute.GainedCharacter(beforeNavigateRoute = beforeNavigateRoute)) } fun NavController.navigateToGainedCoupon() { @@ -95,7 +95,7 @@ fun NavController.navigateToDiaryTime() { } fun NavGraphBuilder.myPageNavGraph( - navigateToGainedCharacter: () -> Unit, + navigateToGainedCharacter: (String) -> Unit, navigateToGainedCoupon: () -> Unit, navigateToAvailableCouponDetail: (Int, String, String, String, Int) -> Unit, navigateToGainedEmblems: () -> Unit, @@ -109,7 +109,7 @@ fun NavGraphBuilder.myPageNavGraph( navigateToAnnouncementDeleteStack: () -> Unit, navigateToSupport: () -> Unit, navigateToDiary: (Boolean, String, String) -> Unit, - navigateToDiaryTime: () -> Unit + navigateToDiaryTime: () -> Unit, ) { composable { MyPageScreen( @@ -121,8 +121,14 @@ fun NavGraphBuilder.myPageNavGraph( ) } - composable { - GainedCharacterScreen(navigateToCharacterDetail, navigateToBack) + composable { backStackEntry -> + val beforeNavigateRoute = + backStackEntry.toRoute().beforeNavigateRoute + GainedCharacterScreen( + navigateToCharacterDetail = navigateToCharacterDetail, + beforeNavigateRoute = beforeNavigateRoute, + navigateToBack = navigateToBack + ) } composable { diff --git a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/GainedCharacterScreen.kt b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/GainedCharacterScreen.kt index 96223216..a2ee46d9 100644 --- a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/GainedCharacterScreen.kt +++ b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/GainedCharacterScreen.kt @@ -34,6 +34,7 @@ import com.teamoffroad.offroad.feature.mypage.R @Composable fun GainedCharacterScreen( navigateToCharacterDetail: (Int, Boolean) -> Unit, + beforeNavigateRoute: String, navigateToBack: () -> Unit, gainedCharacterViewModel: GainedCharacterViewModel = hiltViewModel(), ) { @@ -53,7 +54,7 @@ fun GainedCharacterScreen( .actionBarPadding() ) { NavigateBackAppBar( - text = stringResource(R.string.my_page_my_page), + text = stringResource(if (beforeNavigateRoute == "home") R.string.my_page_home else R.string.my_page_my_page), modifier = Modifier.padding(top = 20.dp), ) { navigateToBack() diff --git a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/MyPageScreen.kt b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/MyPageScreen.kt index 4121e737..87ad6183 100644 --- a/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/MyPageScreen.kt +++ b/feature/mypage/src/main/java/com/teamoffroad/feature/mypage/presentation/MyPageScreen.kt @@ -33,7 +33,7 @@ import com.teamoffroad.feature.mypage.presentation.component.UserSettings @Composable internal fun MyPageScreen( - navigateToGainedCharacter: () -> Unit, + navigateToGainedCharacter: (String) -> Unit, navigateToGainedCoupon: () -> Unit, navigateToGainedEmblems: () -> Unit, navigateToSetting: () -> Unit, @@ -100,7 +100,7 @@ internal fun MyPageScreen( .aspectRatio(150f / 124f) ) { AcquireCharacter( - navigateToGainedCharacter + { navigateToGainedCharacter("mypage")} ) } Spacer(modifier = Modifier.padding(horizontal = 6.dp)) diff --git a/feature/mypage/src/main/res/values/strings.xml b/feature/mypage/src/main/res/values/strings.xml index 71a0fd4c..cf65db68 100644 --- a/feature/mypage/src/main/res/values/strings.xml +++ b/feature/mypage/src/main/res/values/strings.xml @@ -10,6 +10,7 @@ 획득 칭호 설정 마이페이지 + 획득 캐릭터 퀘스트를 달성하고 보상으로 캐릭터를 얻어보아요! 사용 가능