diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt index 044f27a1..6e07877d 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt @@ -120,6 +120,7 @@ fun FeedScreen( lastVisibleIndex >= totalItems - 3 } } + LaunchedEffect(Unit) { navController.currentBackStackEntry?.savedStateHandle?.let { handle -> handle.getLiveData("deleted_feed_id").observeForever { deletedId -> @@ -144,11 +145,24 @@ fun FeedScreen( if (feedUiState.allFeeds.isEmpty() && feedUiState.myFeeds.isEmpty()) { feedViewModel.refreshData() } + val hasUpdatedFeedData = navController.currentBackStackEntry?.savedStateHandle?.get("updated_feed_id") != null + val fromProfile = + navController.currentBackStackEntry?.savedStateHandle?.get("from_profile") ?: false - if (!hasUpdatedFeedData) { + if (!hasUpdatedFeedData && !fromProfile) { + // 일반적인 경우: 전체 새로고침 + 스크롤 상단 이동 + feedViewModel.refreshData() allFeedListState.scrollToItem(0) + } else { + // 댓글 화면 또는 프로필에서 돌아온 경우: recentWriters만 업데이트 + feedViewModel.fetchRecentWriters() + } + + // 프로필 플래그 제거 + if (fromProfile) { + navController.currentBackStackEntry?.savedStateHandle?.remove("from_profile") } } @@ -457,6 +471,8 @@ fun FeedScreen( onNavigateToBookDetail(allFeed.isbn) }, onProfileClick = { + // 프로필에서 돌아올 때를 위한 플래그 설정 + navController.currentBackStackEntry?.savedStateHandle?.set("from_profile", true) onNavigateToUserProfile(allFeed.creatorId) } ) @@ -530,4 +546,4 @@ private fun FeedScreenWithoutDataPreview() { navController = rememberNavController() ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedViewModel.kt b/app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedViewModel.kt index 7ba7c95b..4b408e8a 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedViewModel.kt @@ -202,7 +202,7 @@ class FeedViewModel @Inject constructor( fun pullToRefresh() { viewModelScope.launch { updateState { it.copy(isPullToRefreshing = true) } - + fetchRecentWriters() when (_uiState.value.selectedTabIndex) { 0 -> refreshAllFeeds() 1 -> refreshMyFeeds() @@ -288,7 +288,7 @@ class FeedViewModel @Inject constructor( } } - private fun fetchRecentWriters() { + fun fetchRecentWriters() { viewModelScope.launch { updateState { it.copy(isLoading = true) } userRepository.getMyFollowingsRecentFeeds() @@ -332,10 +332,10 @@ class FeedViewModel @Inject constructor( viewModelScope.launch { val currentAllFeeds = _uiState.value.allFeeds val currentMyFeeds = _uiState.value.myFeeds - + val allFeedToUpdate = currentAllFeeds.find { it.feedId.toLong() == feedId } val myFeedToUpdate = currentMyFeeds.find { it.feedId.toLong() == feedId } - + if (allFeedToUpdate == null && myFeedToUpdate == null) return@launch //ui 먼저 변경 ( 낙관적 업데이트 ) @@ -349,7 +349,7 @@ class FeedViewModel @Inject constructor( it } } - + val newMyFeeds = currentMyFeeds.map { if (it.feedId.toLong() == feedId) { it.copy( @@ -360,7 +360,7 @@ class FeedViewModel @Inject constructor( it } } - + _uiState.update { it.copy(allFeeds = newAllFeeds, myFeeds = newMyFeeds) } //api 호출 @@ -369,15 +369,20 @@ class FeedViewModel @Inject constructor( } else { !myFeedToUpdate!!.isLiked } - + val currentLikeCount = allFeedToUpdate?.likeCount ?: myFeedToUpdate!!.likeCount val currentIsSaved = allFeedToUpdate?.isSaved ?: myFeedToUpdate!!.isSaved - + changeFeedLikeUseCase( feedId, newLikeStatus, currentLikeCount, currentIsSaved ) .onFailure { - _uiState.update { it.copy(allFeeds = currentAllFeeds, myFeeds = currentMyFeeds) } + _uiState.update { + it.copy( + allFeeds = currentAllFeeds, + myFeeds = currentMyFeeds + ) + } } } } @@ -386,10 +391,10 @@ class FeedViewModel @Inject constructor( viewModelScope.launch { val currentAllFeeds = _uiState.value.allFeeds val currentMyFeeds = _uiState.value.myFeeds - + val allFeedToUpdate = currentAllFeeds.find { it.feedId.toLong() == feedId } val myFeedToUpdate = currentMyFeeds.find { it.feedId.toLong() == feedId } - + if (allFeedToUpdate == null && myFeedToUpdate == null) return@launch // (낙관적 업데이트) UI 즉시 변경 @@ -400,7 +405,7 @@ class FeedViewModel @Inject constructor( it } } - + val newMyFeeds = currentMyFeeds.map { if (it.feedId.toLong() == feedId) { it.copy(isSaved = !it.isSaved) @@ -408,7 +413,7 @@ class FeedViewModel @Inject constructor( it } } - + updateState { it.copy(allFeeds = newAllFeeds, myFeeds = newMyFeeds) } // API 호출 @@ -417,10 +422,10 @@ class FeedViewModel @Inject constructor( } else { !myFeedToUpdate!!.isSaved } - + val currentIsLiked = allFeedToUpdate?.isLiked ?: myFeedToUpdate!!.isLiked val currentLikeCount = allFeedToUpdate?.likeCount ?: myFeedToUpdate!!.likeCount - + changeFeedSaveUseCase( feedId = feedId, newSaveStatus = newSaveStatus, @@ -445,7 +450,7 @@ class FeedViewModel @Inject constructor( feed } } - + val updatedMyFeeds = _uiState.value.myFeeds.map { feed -> if (feed.feedId.toLong() == result.feedId) { feed.copy( @@ -458,7 +463,7 @@ class FeedViewModel @Inject constructor( feed } } - + _uiState.update { it.copy(allFeeds = updatedAllFeeds, myFeeds = updatedMyFeeds) } }