From 10bc152e96421faa76f2523622cabf5d0313f194 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 22 Sep 2025 15:03:57 +0900 Subject: [PATCH 1/9] =?UTF-8?q?[fix]:=20=EC=A7=84=ED=96=89=20=EC=A4=91=20?= =?UTF-8?q?=EB=AA=A8=EC=9E=84=EB=B0=A9=20api=20endpoint=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/texthip/thip/data/service/RoomsService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt index f43d1f7d..8be9c4d3 100644 --- a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt +++ b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt @@ -108,7 +108,7 @@ interface RoomsService { /** 기록장 API들 */ - @GET("rooms/{roomId}/playing") + @GET("rooms/{roomId}") suspend fun getRoomsPlaying( @Path("roomId") roomId: Int ): BaseResponse From fed1c73c033ad6a1c849d72240bd440fae80ae90 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 22 Sep 2025 16:22:56 +0900 Subject: [PATCH 2/9] =?UTF-8?q?[refactor]:=20=EB=82=B4=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=EB=B0=A9=20=EC=95=84=EC=A7=81=20=EB=AA=A8=EC=A7=91?= =?UTF-8?q?=EC=A4=91=EC=9D=BC=EB=95=8C=20deadline=20=EB=B3=B4=EC=9D=B4?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/myroom/component/GroupMainCard.kt | 57 ++++++++++++------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt index 35924a31..a29ac977 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt @@ -105,7 +105,7 @@ fun GroupMainCard( ) Spacer(Modifier.width(2.dp)) - Row ( + Row( verticalAlignment = Alignment.CenterVertically ) { Text( @@ -122,23 +122,39 @@ fun GroupMainCard( } Spacer(Modifier.height(16.dp)) // 닉네임 + 진행도 - Row(verticalAlignment = Alignment.Bottom) { - Text( - text = stringResource(R.string.group_progress, userName), - color = colors.Grey02, - style = typography.view_m500_s14 - ) - Spacer(Modifier.width(4.dp)) - Text( - text = "${data.userPercentage}", - color = colors.Purple, - style = typography.smalltitle_sb600_s16_h20 - ) - Text( - text = "%", - color = colors.Purple, - style = typography.menu_sb600_s12, - ) + if (data.deadlineDate == null) { + Row(verticalAlignment = Alignment.Bottom) { + Text( + text = stringResource(R.string.group_progress, userName), + color = colors.Grey02, + style = typography.view_m500_s14 + ) + Spacer(Modifier.width(4.dp)) + Text( + text = "${data.userPercentage}", + color = colors.Purple, + style = typography.smalltitle_sb600_s16_h20 + ) + Text( + text = "%", + color = colors.Purple, + style = typography.menu_sb600_s12, + ) + } + } else { + Row(verticalAlignment = Alignment.Bottom) { + Text( + text = stringResource(R.string.until_start), + color = colors.Grey02, + style = typography.view_m500_s14 + ) + Spacer(Modifier.width(4.dp)) + Text( + text = data.deadlineDate, + color = colors.Purple, + style = typography.smalltitle_sb600_s16_h20 + ) + } } Spacer(Modifier.height(10.dp)) @@ -153,7 +169,10 @@ fun GroupMainCard( modifier = Modifier .fillMaxWidth(fraction = percentage / 100f) .fillMaxHeight() - .background(color = colors.Purple, shape = RoundedCornerShape(12.dp)) + .background( + color = colors.Purple, + shape = RoundedCornerShape(12.dp) + ) ) } Spacer(Modifier.height(2.dp)) From 49834630cbab1fa17277a09301a5b3c0d27597c4 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 22 Sep 2025 17:21:06 +0900 Subject: [PATCH 3/9] =?UTF-8?q?[refactor]:=20=EC=99=84=EB=A3=8C=EB=90=9C?= =?UTF-8?q?=20=EB=AA=A8=EC=9E=84=EB=B0=A9=20=EC=B6=94=EA=B0=80=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rooms/response/JoinedRoomListResponse.kt | 3 +- .../ui/group/done/screen/GroupDoneScreen.kt | 5 +- .../note/component/CommentBottomSheet.kt | 53 +++++++++-------- .../ui/group/note/screen/GroupNoteScreen.kt | 59 +++++++++++++------ .../group/room/screen/GroupRoomChatScreen.kt | 38 +++++++++--- .../ui/group/room/screen/GroupRoomScreen.kt | 8 ++- .../extensions/GroupNavigationExtensions.kt | 13 ++-- .../navigator/navigations/GroupNavigation.kt | 24 ++++++-- .../thip/ui/navigator/routes/GroupRoutes.kt | 14 +++-- app/src/main/res/values/strings.xml | 2 + 10 files changed, 148 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/response/JoinedRoomListResponse.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/response/JoinedRoomListResponse.kt index 84d6615f..03d299ea 100644 --- a/app/src/main/java/com/texthip/thip/data/model/rooms/response/JoinedRoomListResponse.kt +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/response/JoinedRoomListResponse.kt @@ -18,6 +18,7 @@ data class JoinedRoomResponse( @SerialName("bookImageUrl") val bookImageUrl: String?, @SerialName("roomTitle") val roomTitle: String, @SerialName("memberCount") val memberCount: Int, - @SerialName("userPercentage") val userPercentage: Int + @SerialName("userPercentage") val userPercentage: Int, + @SerialName("deadlineDate") val deadlineDate: String? = null, ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt index 25ff4f69..6fb081c4 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt @@ -37,6 +37,7 @@ import com.texthip.thip.utils.rooms.RoomUtils @OptIn(ExperimentalMaterial3Api::class) @Composable fun GroupDoneScreen( + onRoomClick: (Int) -> Unit = {}, onNavigateBack: () -> Unit = {}, viewModel: GroupDoneViewModel = hiltViewModel() ) { @@ -44,6 +45,7 @@ fun GroupDoneScreen( GroupDoneContent( uiState = uiState, + onRoomClick = onRoomClick, onNavigateBack = onNavigateBack, onRefresh = { viewModel.refreshData() }, onLoadMore = { viewModel.loadMoreExpiredRooms() } @@ -54,6 +56,7 @@ fun GroupDoneScreen( @Composable fun GroupDoneContent( uiState: GroupDoneUiState, + onRoomClick: (Int) -> Unit = {}, onNavigateBack: () -> Unit = {}, onRefresh: () -> Unit = {}, onLoadMore: () -> Unit = {} @@ -118,7 +121,7 @@ fun GroupDoneContent( maxParticipants = room.recruitCount, // 모집 인원 수 사용 isRecruiting = RoomUtils.isRecruitingByType(room.type), isSecret = !room.isPublic, - onClick = { /* 완료된 모임방은 클릭 불가 */ } + onClick = { onRoomClick(room.roomId) } ) } } diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentBottomSheet.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentBottomSheet.kt index 9a2659b1..76714308 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentBottomSheet.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentBottomSheet.kt @@ -51,6 +51,7 @@ import com.texthip.thip.utils.rooms.advancedImePadding @Composable fun CommentBottomSheet( uiState: CommentsUiState, + isExpired: Boolean = false, onDismiss: () -> Unit, onProfileClick: (userId: Long) -> Unit = {}, onShowToast: (String) -> Unit = {}, @@ -122,6 +123,7 @@ fun CommentBottomSheet( } else { CommentLazyList( listState = listState, + isExpired = isExpired, commentList = uiState.comments, isLoadingMore = uiState.isLoadingMore, isLastPage = uiState.isLast, @@ -143,31 +145,33 @@ fun CommentBottomSheet( } } - CommentTextField( - modifier = Modifier - .fillMaxWidth() - .focusRequester(focusRequester), - hint = stringResource(R.string.reply_to), - input = inputText, - onInputChange = { inputText = it }, - onSendClick = { - viewModel.onEvent( - CommentsEvent.CreateComment( - content = inputText, - parentId = replyingToCommentId + if (!isExpired) { + CommentTextField( + modifier = Modifier + .fillMaxWidth() + .focusRequester(focusRequester), + hint = stringResource(R.string.reply_to), + input = inputText, + onInputChange = { inputText = it }, + onSendClick = { + viewModel.onEvent( + CommentsEvent.CreateComment( + content = inputText, + parentId = replyingToCommentId + ) ) - ) - inputText = "" - replyingToCommentId = null - replyingToNickname = null - focusManager.clearFocus() - }, - replyTo = replyingToNickname, - onCancelReply = { - replyingToCommentId = null - replyingToNickname = null - } - ) + inputText = "" + replyingToCommentId = null + replyingToNickname = null + focusManager.clearFocus() + }, + replyTo = replyingToNickname, + onCancelReply = { + replyingToCommentId = null + replyingToNickname = null + } + ) + } } } } @@ -224,6 +228,7 @@ fun CommentBottomSheet( @Composable private fun CommentLazyList( listState: LazyListState, + isExpired: Boolean = false, commentList: List, isLoadingMore: Boolean, isLastPage: Boolean, diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt index 20440fa1..0166a32e 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt @@ -74,6 +74,7 @@ import kotlinx.coroutines.launch @Composable fun GroupNoteScreen( roomId: Int, + isExpired: Boolean = false, onBackClick: () -> Unit = {}, onCreateNoteClick: (recentPage: Int, totalPage: Int, isOverviewPossible: Boolean) -> Unit, onCreateVoteClick: (recentPage: Int, totalPage: Int, isOverviewPossible: Boolean) -> Unit, @@ -144,6 +145,7 @@ fun GroupNoteScreen( GroupNoteContent( uiState = uiState, onEvent = viewModel::onEvent, + isExpired = isExpired, onBackClick = onBackClick, onCreateNoteClick = { uiState.let { s -> @@ -166,6 +168,7 @@ fun GroupNoteScreen( @Composable fun GroupNoteContent( uiState: GroupNoteUiState, + isExpired: Boolean = false, onEvent: (GroupNoteEvent) -> Unit, onBackClick: () -> Unit, onCreateNoteClick: () -> Unit, @@ -191,6 +194,8 @@ fun GroupNoteContent( var isErrorToast by remember { mutableStateOf(false) } val context = LocalContext.current + val expiredRoomMessage = stringResource(R.string.expired_room_read_only_message) + val commentsViewModel: CommentsViewModel = hiltViewModel() val commentsUiState by commentsViewModel.uiState.collectAsStateWithLifecycle() @@ -366,6 +371,11 @@ fun GroupNoteContent( Modifier } + val showExpiredToast = { + toastMessage = expiredRoomMessage + showToast = true + } + when (post.postType) { "RECORD" -> TextCommentCard( data = post, @@ -374,13 +384,19 @@ fun GroupNoteContent( selectedPostForComment = post isCommentBottomSheetVisible = true }, - onLongPress = { selectedPostForMenu = post }, + onLongPress = { + if (isExpired) showExpiredToast() else { + selectedPostForMenu = post + } + }, onPinClick = { postToPin = post isPinDialogVisible = true }, onLikeClick = { postId, postType -> - onEvent(GroupNoteEvent.OnLikeRecord(postId, postType)) + if (isExpired) showExpiredToast() else { + onEvent(GroupNoteEvent.OnLikeRecord(postId, postType)) + } }, onProfileClick = { onNavigateToUserProfile(post.userId) } ) @@ -392,12 +408,18 @@ fun GroupNoteContent( selectedPostForComment = post isCommentBottomSheetVisible = true }, - onLongPress = { selectedPostForMenu = post }, + onLongPress = { + if (isExpired) showExpiredToast() else { + selectedPostForMenu = post + } + }, onVote = { postId, voteItemId, type -> onEvent(GroupNoteEvent.OnVote(postId, voteItemId, type)) }, onLikeClick = { postId, postType -> - onEvent(GroupNoteEvent.OnLikeRecord(postId, postType)) + if (isExpired) showExpiredToast() else { + onEvent(GroupNoteEvent.OnLikeRecord(postId, postType)) + } }, onProfileClick = { onNavigateToUserProfile(post.userId) } ) @@ -468,20 +490,22 @@ fun GroupNoteContent( } } - ExpandableFloatingButton( - menuItems = listOf( - FabMenuItem( - icon = painterResource(R.drawable.ic_write), - text = stringResource(R.string.write_record), - onClick = onCreateNoteClick - ), - FabMenuItem( - icon = painterResource(R.drawable.ic_vote), - text = stringResource(R.string.create_vote), - onClick = onCreateVoteClick + if (!isExpired) { + ExpandableFloatingButton( + menuItems = listOf( + FabMenuItem( + icon = painterResource(R.drawable.ic_write), + text = stringResource(R.string.write_record), + onClick = onCreateNoteClick + ), + FabMenuItem( + icon = painterResource(R.drawable.ic_vote), + text = stringResource(R.string.create_vote), + onClick = onCreateVoteClick + ) ) ) - ) + } } } @@ -498,6 +522,7 @@ fun GroupNoteContent( CommentBottomSheet( viewModel = commentsViewModel, uiState = commentsUiState, + isExpired = isExpired, onDismiss = { isCommentBottomSheetVisible = false selectedPostForComment = null @@ -624,7 +649,7 @@ fun GroupNoteContent( ) { ToastWithDate( message = toastMessage, - color = if (isErrorToast) colors.Red else colors.DarkGrey + color = if (isErrorToast) colors.Red else colors.White ) } } diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomChatScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomChatScreen.kt index bca30a8c..77b2082d 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomChatScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomChatScreen.kt @@ -59,6 +59,7 @@ import kotlinx.coroutines.flow.collectLatest @Composable fun GroupRoomChatScreen( onBackClick: () -> Unit, + isExpired: Boolean, viewModel: GroupRoomChatViewModel = hiltViewModel() ) { var inputText by remember { mutableStateOf("") } @@ -73,6 +74,7 @@ fun GroupRoomChatScreen( val dailyGreetingLimitMessage = stringResource(R.string.group_room_chat_max) val deleteSuccessMessage = stringResource(R.string.group_room_chat_delete_success) + val expiredRoomMessage = stringResource(R.string.expired_room_read_only_message) LaunchedEffect(key1 = Unit) { viewModel.eventFlow.collectLatest { event -> @@ -83,10 +85,12 @@ fun GroupRoomChatScreen( toastMessage = dailyGreetingLimitMessage toastColor = colorRed } + ToastType.FIRST_WRITE -> { toastMessage = dailyGreetingLimitMessage toastColor = colorWhite } + ToastType.DELETE_GREETING_SUCCESS -> { toastMessage = deleteSuccessMessage toastColor = colorWhite @@ -94,9 +98,11 @@ fun GroupRoomChatScreen( } showToast = true } + is GroupRoomChatEvent.ShowErrorToast -> { Toast.makeText(context, event.message, Toast.LENGTH_SHORT).show() } + else -> Unit } } @@ -121,7 +127,13 @@ fun GroupRoomChatScreen( onNavigateBack = onBackClick, showToast = showToast, toastMessage = toastMessage, - toastColor = toastColor + toastColor = toastColor, + isExpired = isExpired, + onShowExpiredRoomToast = { + toastMessage = expiredRoomMessage + toastColor = colorWhite + showToast = true + } ) } @@ -136,6 +148,8 @@ fun GroupRoomChatContent( showToast: Boolean, toastMessage: String, toastColor: Color, + isExpired: Boolean = false, + onShowExpiredRoomToast: () -> Unit = {} ) { var isBottomSheetVisible by remember { mutableStateOf(false) } var selectedMessage by remember { mutableStateOf(null) } @@ -258,8 +272,12 @@ fun GroupRoomChatContent( CardCommentGroup( data = message, onMenuClick = { - selectedMessage = message - isBottomSheetVisible = true + if (isExpired) { + onShowExpiredRoomToast() + } else { + selectedMessage = message + isBottomSheetVisible = true + } } ) } @@ -267,12 +285,14 @@ fun GroupRoomChatContent( } } - CommentTextField( - input = inputText, - hint = stringResource(R.string.group_room_chat_hint), - onInputChange = onInputTextChanged, - onSendClick = onSendClick - ) + if (!isExpired) { + CommentTextField( + input = inputText, + hint = stringResource(R.string.group_room_chat_hint), + onInputChange = onInputTextChanged, + onSendClick = onSendClick + ) + } } AnimatedVisibility( diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt index bbeb0d64..09395c6d 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt @@ -59,6 +59,7 @@ import kotlinx.coroutines.flow.collectLatest @Composable fun GroupRoomScreen( roomId: Int, + isExpired: Boolean = false, onBackClick: () -> Unit = {}, onNavigateToMates: () -> Unit = {}, onNavigateToChat: () -> Unit = {}, @@ -96,6 +97,7 @@ fun GroupRoomScreen( // 성공 시, 실제 데이터를 화면에 표시 GroupRoomContent( roomDetails = state.roomsPlaying, + isExpired = isExpired, onBackClick = onBackClick, onNavigateToMates = onNavigateToMates, onNavigateToChat = onNavigateToChat, @@ -109,7 +111,7 @@ fun GroupRoomScreen( is GroupRoomUiState.Error -> { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - Text(text = state.message, color = colors.White) // TODO: 에러 메시지 스타일링 + Text(text = state.message, color = colors.White) } } } @@ -119,6 +121,7 @@ fun GroupRoomScreen( @Composable fun GroupRoomContent( roomDetails: RoomsPlayingResponse, + isExpired: Boolean = false, onBackClick: () -> Unit = {}, onNavigateToMates: () -> Unit = {}, onNavigateToChat: () -> Unit = {}, @@ -228,7 +231,8 @@ fun GroupRoomContent( GradationTopAppBar( onLeftClick = onBackClick, - isRightIconVisible = true, +// isRightIconVisible = true, + isRightIconVisible = !isExpired || !isOwner, // TODO: 방 삭제 기능 추가 시 변경 onRightClick = { isBottomSheetVisible = true }, ) diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt index 7b764299..13bdcdfa 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt @@ -71,8 +71,8 @@ fun NavHostController.navigateToRecommendedGroupRecruit(roomId: Int) { } // 진행중인 모임방 화면으로 이동 -fun NavHostController.navigateToGroupRoom(roomId: Int) { - navigate(GroupRoutes.Room(roomId)) +fun NavHostController.navigateToGroupRoom(roomId: Int, isExpired: Boolean = false) { + navigate(GroupRoutes.Room(roomId, isExpired)) } // 독서메이트 화면으로 이동 @@ -81,17 +81,18 @@ fun NavHostController.navigateToGroupRoomMates(roomId: Int) { } // 오늘의 한마디 회면으로 이동 -fun NavHostController.navigateToGroupRoomChat(roomId: Int) { - navigate(GroupRoutes.RoomChat(roomId)) +fun NavHostController.navigateToGroupRoomChat(roomId: Int, isExpired: Boolean = false) { + navigate(GroupRoutes.RoomChat(roomId, isExpired)) } // 기록장 화면으로 이동 fun NavHostController.navigateToGroupNote( roomId: Int, page: Int? = null, - isOverview: Boolean? = null + isOverview: Boolean? = null, + isExpired: Boolean = false ) { - navigate(GroupRoutes.Note(roomId = roomId, page = page, isOverview = isOverview)) + navigate(GroupRoutes.Note(roomId = roomId, page = page, isOverview = isOverview, isExpired = isExpired)) } // 기록 생성 화면으로 이동 diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt index 70e30efb..72daac81 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt @@ -144,6 +144,9 @@ fun NavGraphBuilder.groupNavigation( // Group Done 화면 composable { GroupDoneScreen( + onRoomClick = { roomId -> + navController.navigateToGroupRoom(roomId, isExpired = true) + }, onNavigateBack = { navigateBack() } @@ -161,7 +164,7 @@ fun NavGraphBuilder.groupNavigation( if (isRecruiting) { navController.navigateToGroupRecruit(room.roomId) } else { - navController.navigateToGroupRoom(room.roomId) + navController.navigateToGroupRoom(room.roomId, isExpired = false) } }, onNavigateBack = { @@ -256,9 +259,11 @@ fun NavGraphBuilder.groupNavigation( composable { backStackEntry -> val route = backStackEntry.toRoute() val roomId = route.roomId + val isExpired = route.isExpired GroupRoomScreen( roomId = roomId, + isExpired = isExpired, onBackClick = { navigateBack() }, @@ -266,10 +271,10 @@ fun NavGraphBuilder.groupNavigation( navController.navigateToGroupRoomMates(roomId) }, onNavigateToChat = { - navController.navigateToGroupRoomChat(roomId) + navController.navigateToGroupRoomChat(roomId, isExpired) }, onNavigateToNote = { page, isOverview -> - navController.navigateToGroupNote(roomId, page, isOverview) + navController.navigateToGroupNote(roomId, page, isOverview, isExpired) }, onNavigateToBookDetail = { isbn -> navController.navigateToBookDetail(isbn) @@ -282,7 +287,8 @@ fun NavGraphBuilder.groupNavigation( val route = backStackEntry.toRoute() val roomId = route.roomId - val feedViewModel: FeedViewModel = hiltViewModel(navController.getBackStackEntry(MainTabRoutes.Group)) + val feedViewModel: FeedViewModel = + hiltViewModel(navController.getBackStackEntry(MainTabRoutes.Group)) val feedUiState by feedViewModel.uiState.collectAsState() val myUserId = feedUiState.myFeedInfo?.creatorId @@ -307,9 +313,12 @@ fun NavGraphBuilder.groupNavigation( ) } - composable { + composable { backStackEntry -> + val route = backStackEntry.toRoute() + GroupRoomChatScreen( onBackClick = { navigateBack() }, + isExpired = route.isExpired ) } @@ -319,12 +328,14 @@ fun NavGraphBuilder.groupNavigation( val roomId = route.roomId val page = route.page val isOverview = route.isOverview + val isExpired = route.isExpired val result = backStackEntry.savedStateHandle.get("selected_tab_index") val viewModel: GroupNoteViewModel = hiltViewModel(backStackEntry) - val feedViewModel: FeedViewModel = hiltViewModel(navController.getBackStackEntry(MainTabRoutes.Group)) + val feedViewModel: FeedViewModel = + hiltViewModel(navController.getBackStackEntry(MainTabRoutes.Group)) val feedUiState by feedViewModel.uiState.collectAsState() val myUserId = feedUiState.myFeedInfo?.creatorId @@ -339,6 +350,7 @@ fun NavGraphBuilder.groupNavigation( resultTabIndex = result, initialPage = page, initialIsOverview = isOverview, + isExpired = isExpired, onResultConsumed = { backStackEntry.savedStateHandle.remove("selected_tab_index") }, diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt index 100d84e3..651a7e69 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt @@ -14,7 +14,7 @@ sealed class GroupRoutes : Routes() { val imageUrl: String, val author: String ) : GroupRoutes() - + @Serializable data object Done : GroupRoutes() @@ -31,17 +31,21 @@ sealed class GroupRoutes : Routes() { data class RoomUnlock(val roomId: Int) : GroupRoutes() @Serializable - data class Room(val roomId: Int) : GroupRoutes() + data class Room(val roomId: Int, val isExpired: Boolean = false) : GroupRoutes() @Serializable data class RoomMates(val roomId: Int) : GroupRoutes() @Serializable - data class RoomChat(val roomId: Int) : GroupRoutes() + data class RoomChat(val roomId: Int, val isExpired: Boolean = false) : GroupRoutes() @Serializable - data class Note(val roomId: Int, val page: Int? = null, val isOverview: Boolean? = null) : - GroupRoutes() + data class Note( + val roomId: Int, + val page: Int? = null, + val isOverview: Boolean? = null, + val isExpired: Boolean = false + ) : GroupRoutes() @Serializable data class NoteCreate( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 889a8971..bcbbdfe5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -175,6 +175,7 @@ % 모임 나가기를 완료했어요. 모임 나가기를 실패했어요. + 시작까지 소개글 @@ -256,6 +257,7 @@ 기록이 게시되었습니다! 이 댓글을 삭제하시겠어요? 삭제된 댓글이에요. + 완료된 모임방에서는 기존 기록에 대한 조회만 가능해요. 피드 From 5cd88cffa020c09ef5a5956c5f1335bf74c60910 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 22 Sep 2025 17:28:08 +0900 Subject: [PATCH 4/9] =?UTF-8?q?[refactor]:=20=EC=99=84=EB=A3=8C=EB=90=9C?= =?UTF-8?q?=20=EB=AA=A8=EC=9E=84=EB=B0=A9=EC=97=90=EC=84=9C=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EA=B4=80=EB=A0=A8=20=EC=88=98=EC=A0=95=20=EB=B6=88?= =?UTF-8?q?=EA=B0=80=ED=95=98=EA=B2=8C=20=EC=88=98=EC=A0=95=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../note/component/CommentBottomSheet.kt | 10 +++- .../ui/group/note/component/CommentSection.kt | 56 ++++++++++++++----- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentBottomSheet.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentBottomSheet.kt index 76714308..13ad1e0a 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentBottomSheet.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentBottomSheet.kt @@ -139,7 +139,8 @@ fun CommentBottomSheet( selectedCommentForMenu = comment }, onReplyLongPress = { reply -> selectedReplyForMenu = reply }, - onProfileClick = onProfileClick + onProfileClick = onProfileClick, + onShowToast = onShowToast ) } } @@ -237,7 +238,8 @@ private fun CommentLazyList( onEvent: (CommentsEvent) -> Unit, onCommentLongPress: (CommentList) -> Unit, onReplyLongPress: (ReplyList) -> Unit, - onProfileClick: (userId: Long) -> Unit + onProfileClick: (userId: Long) -> Unit, + onShowToast: (String) -> Unit ) { val isScrolledToEnd by remember { derivedStateOf { @@ -268,11 +270,13 @@ private fun CommentLazyList( ) { comment -> CommentSection( commentItem = comment, + isExpired = isExpired, onReplyClick = onReplyClick, onEvent = onEvent, onCommentLongPress = onCommentLongPress, onReplyLongPress = onReplyLongPress, - onProfileClick = onProfileClick + onProfileClick = onProfileClick, + onShowToast = onShowToast ) } diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentSection.kt index 12a38e08..0fd853e3 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentSection.kt @@ -8,8 +8,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.texthip.thip.R import com.texthip.thip.data.model.comments.response.CommentList import com.texthip.thip.data.model.comments.response.ReplyList import com.texthip.thip.ui.group.note.viewmodel.CommentsEvent @@ -18,12 +20,16 @@ import com.texthip.thip.ui.theme.ThipTheme @Composable fun CommentSection( commentItem: CommentList, + isExpired: Boolean = false, onReplyClick: (commentId: Int, nickname: String?) -> Unit, onEvent: (CommentsEvent) -> Unit = { _ -> }, onCommentLongPress: (CommentList) -> Unit = { _ -> }, onReplyLongPress: (ReplyList) -> Unit = { _ -> }, onProfileClick: (userId: Long) -> Unit = {}, + onShowToast: (String) -> Unit = {} ) { + val expiredRoomMessage = stringResource(R.string.expired_room_read_only_message) + Box { Column( modifier = Modifier @@ -35,20 +41,30 @@ fun CommentSection( CommentItem( data = commentItem, onReplyClick = { - // commentId가 null이 아닐 때만 답글 달기 가능 - // todo: 수정 가능 - commentItem.commentId?.let { id -> - onReplyClick(id, commentItem.creatorNickname) + if (isExpired) { + onShowToast(expiredRoomMessage) + } else { + commentItem.commentId?.let { id -> + onReplyClick(id, commentItem.creatorNickname) + } } }, onLikeClick = { - // commentId가 null이 아닐 때만 좋아요 가능 - // todo: 수정 가능 - commentItem.commentId?.let { id -> - onEvent(CommentsEvent.LikeComment(id)) + if (isExpired) { + onShowToast(expiredRoomMessage) + } else { + commentItem.commentId?.let { id -> + onEvent(CommentsEvent.LikeComment(id)) + } + } + }, + onLongPress = { + if (isExpired) { + onShowToast(expiredRoomMessage) + } else { + onCommentLongPress(commentItem) } }, - onLongPress = { onCommentLongPress(commentItem) }, onProfileClick = { commentItem.creatorId?.let { id -> onProfileClick(id) } @@ -59,14 +75,28 @@ fun CommentSection( ReplyItem( data = reply, onReplyClick = { - commentItem.commentId?.let { parentId -> - onReplyClick(parentId, reply.creatorNickname) + if (isExpired) { + onShowToast(expiredRoomMessage) + } else { + commentItem.commentId?.let { parentId -> + onReplyClick(parentId, reply.creatorNickname) + } } }, onLikeClick = { - onEvent(CommentsEvent.LikeReply(reply.commentId)) + if (isExpired) { + onShowToast(expiredRoomMessage) + } else { + onEvent(CommentsEvent.LikeReply(reply.commentId)) + } + }, + onLongPress = { + if (isExpired) { + onShowToast(expiredRoomMessage) + } else { + onReplyLongPress(reply) + } }, - onLongPress = { onReplyLongPress(reply) }, onProfileClick = { onProfileClick(reply.creatorId) } ) } From d58ed6c404755fed47c1a040401bd507c9b4d43b Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 22 Sep 2025 18:09:25 +0900 Subject: [PATCH 5/9] =?UTF-8?q?[ui]:=20=EC=A0=84=EC=B2=B4=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=EB=B0=A9=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=95=98=EB=8A=94=20button=20=EC=B6=94=EA=B0=80=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/feed/component/MySubscribelistBar.kt | 12 ++++--- .../thip/ui/group/screen/GroupScreen.kt | 12 ++++++- .../search/component/GroupRecentSearch.kt | 35 +++++++++++++++++-- app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt b/app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt index 1343d3d0..2a30dac7 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt @@ -131,21 +131,25 @@ fun MySubscribeBarlist( } @Composable -private fun EmptyMySubscriptionBar() { +fun EmptyMySubscriptionBar( + modifier: Modifier = Modifier, + text: String = stringResource(R.string.find_thip_mate), + onClick: () -> Unit = {} +) { Box( - modifier = Modifier + modifier = modifier .padding(top = 8.dp) .fillMaxWidth() .height(42.dp) .clip(RoundedCornerShape(12.dp)) .background(colors.DarkGrey02) - .clickable { } + .clickable { onClick() } ) { Text( modifier = Modifier .align(Alignment.CenterStart) .padding(start = 12.dp), - text = stringResource(R.string.find_thip_mate), + text = text, color = colors.White, style = typography.view_m500_s12_h20 ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt index 307074b7..25ff7a80 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex @@ -34,6 +35,7 @@ import com.texthip.thip.data.model.rooms.response.RoomMainResponse import com.texthip.thip.ui.common.buttons.FloatingButton import com.texthip.thip.ui.common.modal.ToastWithDate import com.texthip.thip.ui.common.topappbar.LogoTopAppBar +import com.texthip.thip.ui.feed.component.EmptyMySubscriptionBar import com.texthip.thip.ui.group.myroom.component.GroupMySectionHeader import com.texthip.thip.ui.group.myroom.component.GroupPager import com.texthip.thip.ui.group.myroom.component.GroupRoomDeadlineSection @@ -95,7 +97,7 @@ fun GroupContent( onHideToast: () -> Unit = {} ) { val scrollState = rememberScrollState() - + // 탭 전환 시 스크롤을 맨 위로 초기화 LaunchedEffect(Unit) { scrollState.scrollTo(0) @@ -145,6 +147,14 @@ fun GroupContent( .background(color = colors.DarkGrey02) ) + EmptyMySubscriptionBar( + modifier = Modifier.padding(horizontal = 30.dp), + text = stringResource(R.string.look_around_all_rooms), + onClick = {} // TODO: 전체 모임방 화면으로 이동 + ) + + Spacer(Modifier.height(32.dp)) + // 마감 임박한 독서 모임방 GroupRoomDeadlineSection( roomMainList = uiState.roomMainList, diff --git a/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt index d23b3c46..712eba6a 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt @@ -1,20 +1,27 @@ package com.texthip.thip.ui.group.search.component import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -58,6 +65,30 @@ fun GroupRecentSearch( } } } + + Spacer(modifier = Modifier.height(30.dp)) + + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { + // TODO: 전체 방 둘러보기 클릭 시 동작 + }, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = stringResource(R.string.look_around_all_rooms_title), + color = colors.White, + style = typography.smalltitle_sb600_s18_h24 + ) + + Icon( + painter = painterResource(R.drawable.ic_chevron), + contentDescription = null, + tint = Color.Unspecified + ) + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bcbbdfe5..fc5d1ca9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -258,6 +258,8 @@ 이 댓글을 삭제하시겠어요? 삭제된 댓글이에요. 완료된 모임방에서는 기존 기록에 대한 조회만 가능해요. + 전체 모임방을 한 눈에 둘러보세요! + 전체 모임방 둘러보기 피드 From cb9acedd8b0cbadcdb88e81cce3dc1ec70e91554 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 22 Sep 2025 18:41:02 +0900 Subject: [PATCH 6/9] =?UTF-8?q?[refactor]:=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EB=AA=A8=EC=9E=84=EB=B0=A9=20=EB=B3=B4=EC=97=AC=EC=A3=BC?= =?UTF-8?q?=EB=8A=94=20=ED=94=8C=EB=A1=9C=EC=9A=B0=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/data/repository/RoomsRepository.kt | 3 +- .../texthip/thip/data/service/RoomsService.kt | 1 + .../thip/ui/group/screen/GroupScreen.kt | 9 ++- .../component/GroupFilteredSearchResult.kt | 30 ++++++-- .../search/component/GroupRecentSearch.kt | 5 +- .../group/search/screen/GroupSearchScreen.kt | 30 ++++---- .../search/viewmodel/GroupSearchViewModel.kt | 72 ++++++++++++------- .../extensions/GroupNavigationExtensions.kt | 4 +- .../navigator/navigations/GroupNavigation.kt | 21 +++++- .../thip/ui/navigator/routes/GroupRoutes.kt | 2 +- app/src/main/res/values/strings.xml | 1 + 11 files changed, 122 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt b/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt index cf4208e4..25ff616d 100644 --- a/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt +++ b/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt @@ -141,11 +141,12 @@ class RoomsRepository @Inject constructor( suspend fun searchRooms( keyword: String, category: String, + isAllCategory: Boolean = false, sort: String = "deadline", isFinalized: Boolean = false, cursor: String? = null ): Result = runCatching { - roomsService.searchRooms(keyword, category, sort, isFinalized, cursor) + roomsService.searchRooms(keyword, category, isAllCategory, sort, isFinalized, cursor) .handleBaseResponse() .getOrThrow() } diff --git a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt index 8be9c4d3..1d0bd72e 100644 --- a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt +++ b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt @@ -100,6 +100,7 @@ interface RoomsService { suspend fun searchRooms( @Query("keyword") keyword: String, @Query("category") category: String, + @Query("isAllCategory") isAllCategory: Boolean = false, @Query("sort") sort: String = "deadline", @Query("isFinalized") isFinalized: Boolean = false, @Query("cursor") cursor: String? = null diff --git a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt index 25ff7a80..033598c9 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt @@ -55,7 +55,8 @@ fun GroupScreen( onNavigateToGroupSearch: () -> Unit = {}, // 검색 화면으로 이동 onNavigateToGroupMy: () -> Unit = {}, // 내 모임방 화면으로 이동 onNavigateToGroupRecruit: (Int) -> Unit = {}, // 모집 중인 모임방 화면으로 이동 - onNavigateToGroupRoom: (Int) -> Unit = {}, // 기록장 화면으로 이동 + onNavigateToGroupRoom: (Int) -> Unit = {}, // 기록장 화면으로 이동, + onNavigateToGroupSearchAllRooms: () -> Unit = {}, viewModel: GroupViewModel = hiltViewModel() ) { // 화면 재진입 시 데이터 새로고침 @@ -73,10 +74,11 @@ fun GroupScreen( onNavigateToGroupMy = onNavigateToGroupMy, onNavigateToGroupRecruit = onNavigateToGroupRecruit, onNavigateToGroupRoom = onNavigateToGroupRoom, + onNavigateToGroupSearchAllRooms = onNavigateToGroupSearchAllRooms, onRefreshGroupData = { viewModel.refreshGroupData() }, onCardVisible = { cardIndex -> viewModel.loadMoreGroups() }, onSelectGenre = { genreIndex -> viewModel.selectGenre(genreIndex) }, - onHideToast = { viewModel.hideToast() } + onHideToast = { viewModel.hideToast() }, ) } @@ -91,6 +93,7 @@ fun GroupContent( onNavigateToGroupMy: () -> Unit = {}, onNavigateToGroupRecruit: (Int) -> Unit = {}, onNavigateToGroupRoom: (Int) -> Unit = {}, + onNavigateToGroupSearchAllRooms: () -> Unit = {}, onRefreshGroupData: () -> Unit = {}, onCardVisible: (Int) -> Unit = {}, onSelectGenre: (Int) -> Unit = {}, @@ -150,7 +153,7 @@ fun GroupContent( EmptyMySubscriptionBar( modifier = Modifier.padding(horizontal = 30.dp), text = stringResource(R.string.look_around_all_rooms), - onClick = {} // TODO: 전체 모임방 화면으로 이동 + onClick = onNavigateToGroupSearchAllRooms ) Spacer(Modifier.height(32.dp)) diff --git a/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt index ae35bbe6..5787d44e 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt @@ -45,14 +45,36 @@ fun GroupFilteredSearchResult( onRoomClick: (SearchRoomItem) -> Unit = {}, canLoadMore: Boolean = false, isLoadingMore: Boolean = false, - onLoadMore: () -> Unit = {} + onLoadMore: () -> Unit = {}, + isAllCategory: Boolean = false ) { + val allChipText = stringResource(id = R.string.all) + val chipList = remember(genres) { listOf(allChipText) + genres } + + val finalSelectedIndex = if (selectedGenreIndex != -1) { + // 특정 장르가 선택되었다면, '전체' 칩 때문에 +1 된 인덱스를 사용 + selectedGenreIndex + 1 + } else { + // 특정 장르가 선택되지 않았다면, '전체' 칩(인덱스 0)을 선택 + 0 + } + + Column { GenreChipRow( modifier = Modifier.width(12.dp), - genres = genres, - selectedIndex = selectedGenreIndex, - onSelect = onGenreSelect + genres = chipList, + selectedIndex = finalSelectedIndex, + onSelect = { newIndex -> + when (newIndex) { + // 칩 선택이 해제된 경우 (동일 칩 재클릭) + -1 -> onGenreSelect(-1) + // '전체' 칩이 선택된 경우 -> 장르 필터 해제 + 0 -> onGenreSelect(-1) + // 특정 장르가 선택된 경우 -> 원래 인덱스로 변환하여 전달 + else -> onGenreSelect(newIndex - 1) + } + } ) Spacer(modifier = Modifier.height(20.dp)) diff --git a/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt index 712eba6a..9524b41c 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt @@ -35,7 +35,8 @@ import com.texthip.thip.ui.theme.ThipTheme.typography fun GroupRecentSearch( recentSearches: List, onSearchClick: (String) -> Unit, - onRemove: (String) -> Unit + onRemove: (String) -> Unit, + onViewAllRoomsClick: () -> Unit = {} ) { Column { Text( @@ -72,7 +73,7 @@ fun GroupRecentSearch( modifier = Modifier .fillMaxWidth() .clickable { - // TODO: 전체 방 둘러보기 클릭 시 동작 + onViewAllRoomsClick() }, verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween diff --git a/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt index 1822d574..6a00581c 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt @@ -28,10 +28,10 @@ import com.texthip.thip.data.model.rooms.response.SearchRoomItem import com.texthip.thip.ui.common.buttons.FilterButton import com.texthip.thip.ui.common.forms.SearchBookTextField import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar -import com.texthip.thip.ui.group.search.component.GroupRecentSearch import com.texthip.thip.ui.group.search.component.GroupEmptyResult import com.texthip.thip.ui.group.search.component.GroupFilteredSearchResult import com.texthip.thip.ui.group.search.component.GroupLiveSearchResult +import com.texthip.thip.ui.group.search.component.GroupRecentSearch import com.texthip.thip.ui.group.search.viewmodel.GroupSearchUiState import com.texthip.thip.ui.group.search.viewmodel.GroupSearchViewModel import com.texthip.thip.ui.theme.ThipTheme @@ -56,7 +56,8 @@ fun GroupSearchScreen( onDeleteRecentSearch = viewModel::deleteRecentSearchByKeyword, onLoadMoreRooms = viewModel::loadMoreRooms, onUpdateSelectedGenre = viewModel::updateSelectedGenre, - onUpdateSortType = viewModel::updateSortType + onUpdateSortType = viewModel::updateSortType, + onViewAllRooms = viewModel::onViewAllRooms ) } @@ -71,7 +72,8 @@ private fun GroupSearchContent( onDeleteRecentSearch: (String) -> Unit = {}, onLoadMoreRooms: () -> Unit = {}, onUpdateSelectedGenre: (Genre?) -> Unit = {}, - onUpdateSortType: (String) -> Unit = {} + onUpdateSortType: (String) -> Unit = {}, + onViewAllRooms: () -> Unit = {} ) { val focusRequester = remember { FocusRequester() } val focusManager = LocalFocusManager.current @@ -142,7 +144,8 @@ private fun GroupSearchContent( onUpdateSearchQuery(keyword) onSearchButtonClick() }, - onRemove = onDeleteRecentSearch + onRemove = onDeleteRecentSearch, + onViewAllRoomsClick = onViewAllRooms ) } } @@ -164,7 +167,7 @@ private fun GroupSearchContent( } } - uiState.isCompleteSearching -> { + uiState.isCompleteSearching || uiState.isAllCategory -> { GroupFilteredSearchResult( genres = genreDisplayNames, selectedGenreIndex = selectedGenreIndex, @@ -173,15 +176,9 @@ private fun GroupSearchContent( uiState.genres.indexOf(uiState.selectedGenre) } else -1 - val selectedGenre = if (index == currentSelectedIndex) { - // 같은 장르를 다시 터치하면 선택 해제 - null - } else if (index >= 0 && index < uiState.genres.size) { - // 새로운 장르 선택 - uiState.genres[index] - } else { - null - } + val selectedGenre = if (index == currentSelectedIndex) null + else if (index >= 0 && index < uiState.genres.size) uiState.genres[index] + else null onUpdateSelectedGenre(selectedGenre) }, resultCount = uiState.searchResults.size, @@ -189,14 +186,15 @@ private fun GroupSearchContent( onRoomClick = { room -> onRoomClick(room.roomId) }, canLoadMore = uiState.canLoadMore, isLoadingMore = uiState.isLoadingMore, - onLoadMore = onLoadMoreRooms + onLoadMore = onLoadMoreRooms, + isAllCategory = uiState.isAllCategory ) } } } } - if (uiState.isCompleteSearching) { + if (uiState.isCompleteSearching || uiState.isAllCategory) { FilterButton( modifier = Modifier .align(Alignment.TopEnd) diff --git a/app/src/main/java/com/texthip/thip/ui/group/search/viewmodel/GroupSearchViewModel.kt b/app/src/main/java/com/texthip/thip/ui/group/search/viewmodel/GroupSearchViewModel.kt index 95966920..10c22c9f 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/search/viewmodel/GroupSearchViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/viewmodel/GroupSearchViewModel.kt @@ -24,6 +24,7 @@ data class GroupSearchUiState( val isInitial: Boolean = true, val isLiveSearching: Boolean = false, val isCompleteSearching: Boolean = false, + val isAllCategory: Boolean = false, // 검색 결과 및 데이터 val searchResults: List = emptyList(), @@ -49,7 +50,7 @@ data class GroupSearchUiState( ) { val hasResults: Boolean get() = searchResults.isNotEmpty() val canLoadMore: Boolean get() = hasMore && !isSearching && !isLoadingMore - val showEmptyState: Boolean get() = searchQuery.isNotBlank() && searchResults.isEmpty() && !isSearching + val showEmptyState: Boolean get() = (isCompleteSearching || isAllCategory) && searchResults.isEmpty() && !isSearching } @HiltViewModel @@ -108,7 +109,8 @@ class GroupSearchViewModel @Inject constructor( it.copy( isInitial = false, isLiveSearching = true, - isCompleteSearching = false + isCompleteSearching = false, + isAllCategory = false ) } searchJob = viewModelScope.launch { @@ -121,16 +123,21 @@ class GroupSearchViewModel @Inject constructor( } fun onSearchButtonClick() { - val query = uiState.value.searchQuery - if (query.isNotEmpty()) { // 공백도 검색 가능 (빈 문자열만 제외) - searchJob?.cancel() - loadMoreJob?.cancel() + val query = uiState.value.searchQuery.trim() + searchJob?.cancel() + loadMoreJob?.cancel() + // 검색어가 비어있으면 '전체 모임방' 검색 실행 + if (query.isEmpty()) { + onViewAllRooms() + } else { + // 검색어가 있으면 기존 검색 로직 실행 updateState { it.copy( isInitial = false, isLiveSearching = false, - isCompleteSearching = true + isCompleteSearching = true, + isAllCategory = false ) } viewModelScope.launch { @@ -140,10 +147,25 @@ class GroupSearchViewModel @Inject constructor( } } + fun onViewAllRooms() { + searchJob?.cancel() + loadMoreJob?.cancel() + updateState { + it.copy( + searchQuery = "", + isInitial = false, + isLiveSearching = false, + isCompleteSearching = false, + isAllCategory = true + ) + } + performSearchWithCurrentQuery() + } + fun updateSelectedGenre(genre: Genre?) { updateState { it.copy(selectedGenre = genre) } // 필터 변경 시 새로운 검색 수행 (공백도 허용) - if (uiState.value.searchQuery.isNotEmpty() && !uiState.value.isInitial) { + if (uiState.value.isCompleteSearching || uiState.value.isAllCategory) { performSearchWithCurrentQuery() } } @@ -151,26 +173,28 @@ class GroupSearchViewModel @Inject constructor( fun updateSortType(sort: String) { updateState { it.copy(selectedSort = sort) } // 정렬 변경 시 새로운 검색 수행 (공백도 허용) - if (uiState.value.searchQuery.isNotEmpty() && !uiState.value.isInitial) { + if (uiState.value.isCompleteSearching || uiState.value.isAllCategory) { performSearchWithCurrentQuery() } } private fun performSearchWithCurrentQuery() { - val currentState = uiState.value - if (currentState.searchQuery.isNotEmpty()) { // 공백도 허용 - searchJob?.cancel() - loadMoreJob?.cancel() + searchJob?.cancel() + loadMoreJob?.cancel() - searchJob = viewModelScope.launch { - performSearch(currentState.searchQuery, isLiveSearch = currentState.isLiveSearching) - } + searchJob = viewModelScope.launch { + val currentState = uiState.value + performSearch( + query = currentState.searchQuery, + isLiveSearch = currentState.isLiveSearching, + isFinalized = !currentState.isLiveSearching || currentState.isAllCategory + ) } } fun loadMoreRooms() { val currentState = uiState.value - if (currentState.canLoadMore && currentState.searchQuery.isNotEmpty()) { // 공백도 허용 + if (currentState.canLoadMore) { loadMoreJob?.cancel() loadMoreJob = viewModelScope.launch { performLoadMore() @@ -178,13 +202,9 @@ class GroupSearchViewModel @Inject constructor( } } - private suspend fun performSearch(query: String, isLiveSearch: Boolean) { - val currentState = uiState.value + private suspend fun performSearch(query: String, isLiveSearch: Boolean, isFinalized: Boolean = !isLiveSearch) { updateState { it.copy( - isInitial = false, - isLiveSearching = isLiveSearch, - isCompleteSearching = !isLiveSearch, isSearching = true, error = null, searchResults = emptyList(), @@ -193,12 +213,15 @@ class GroupSearchViewModel @Inject constructor( ) } + val currentState = uiState.value val category = currentState.selectedGenre?.apiCategory ?: "" + roomsRepository.searchRooms( keyword = query, category = category, + isAllCategory = currentState.isAllCategory, sort = currentState.selectedSort, - isFinalized = !isLiveSearch, + isFinalized = isFinalized, cursor = null ) .onSuccess { response -> @@ -248,8 +271,9 @@ class GroupSearchViewModel @Inject constructor( roomsRepository.searchRooms( keyword = currentState.searchQuery, category = category, + isAllCategory = currentState.isAllCategory, sort = currentState.selectedSort, - isFinalized = true, + isFinalized = currentState.isCompleteSearching || currentState.isAllCategory, cursor = currentState.nextCursor ) .onSuccess { response -> diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt index 13bdcdfa..864247c9 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt @@ -37,8 +37,8 @@ fun NavHostController.navigateToGroupDone() { } // 모임방 검색 화면으로 이동 -fun NavHostController.navigateToGroupSearch() { - navigate(GroupRoutes.Search) +fun NavHostController.navigateToGroupSearch(viewAll: Boolean = false) { + navigate(GroupRoutes.Search(viewAll = viewAll)) } // 내 모임방 화면으로 이동 diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt index 72daac81..b6ba059f 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt @@ -28,6 +28,7 @@ import com.texthip.thip.ui.group.room.screen.GroupRoomUnlockScreen import com.texthip.thip.ui.group.room.viewmodel.GroupRoomRecruitViewModel import com.texthip.thip.ui.group.screen.GroupScreen import com.texthip.thip.ui.group.search.screen.GroupSearchScreen +import com.texthip.thip.ui.group.search.viewmodel.GroupSearchViewModel import com.texthip.thip.ui.group.viewmodel.GroupViewModel import com.texthip.thip.ui.navigator.extensions.navigateToAlarm import com.texthip.thip.ui.navigator.extensions.navigateToBookDetail @@ -82,7 +83,7 @@ fun NavGraphBuilder.groupNavigation( navController.navigateToAlarm() }, onNavigateToGroupSearch = { - navController.navigateToGroupSearch() + navController.navigateToGroupSearch(viewAll = false) }, onNavigateToGroupMy = { navController.navigateToGroupMy() @@ -92,6 +93,9 @@ fun NavGraphBuilder.groupNavigation( }, onNavigateToGroupRoom = { roomId -> navController.navigateToGroupRoom(roomId) + }, + onNavigateToGroupSearchAllRooms = { + navController.navigateToGroupSearch(viewAll = true) } ) } @@ -174,14 +178,25 @@ fun NavGraphBuilder.groupNavigation( } // Group Search 화면 - composable { + composable { backStackEntry -> + val route = backStackEntry.toRoute() + val viewModel: GroupSearchViewModel = hiltViewModel() + + // [추가] 화면 진입 시 viewAll 플래그를 확인하고 ViewModel의 함수를 호출 + LaunchedEffect(Unit) { + if (route.viewAll) { + viewModel.onViewAllRooms() + } + } + GroupSearchScreen( onNavigateBack = { navigateBack() }, onRoomClick = { roomId -> navController.navigateToGroupRecruit(roomId) - } + }, + viewModel = viewModel ) } diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt index 651a7e69..723054e0 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt @@ -19,7 +19,7 @@ sealed class GroupRoutes : Routes() { data object Done : GroupRoutes() @Serializable - data object Search : GroupRoutes() + data class Search(val viewAll: Boolean = false) : GroupRoutes() @Serializable data object My : GroupRoutes() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fc5d1ca9..a62c02c9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -260,6 +260,7 @@ 완료된 모임방에서는 기존 기록에 대한 조회만 가능해요. 전체 모임방을 한 눈에 둘러보세요! 전체 모임방 둘러보기 + 전체 피드 From c7c183bd2c22867ba1a9e1d9b70f484892d5fdff Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 22 Sep 2025 18:52:19 +0900 Subject: [PATCH 7/9] =?UTF-8?q?[ui]:=20=EA=B2=80=EC=83=89=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=ED=95=84=ED=84=B0=20=EB=B2=84=ED=8A=BC=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=88=98=EC=A0=95=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/group/search/component/GroupFilteredSearchResult.kt | 1 - .../texthip/thip/ui/group/search/screen/GroupSearchScreen.kt | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt index 5787d44e..37038469 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt @@ -46,7 +46,6 @@ fun GroupFilteredSearchResult( canLoadMore: Boolean = false, isLoadingMore: Boolean = false, onLoadMore: () -> Unit = {}, - isAllCategory: Boolean = false ) { val allChipText = stringResource(id = R.string.all) val chipList = remember(genres) { listOf(allChipText) + genres } diff --git a/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt index 6a00581c..41f00d0b 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt @@ -187,7 +187,6 @@ private fun GroupSearchContent( canLoadMore = uiState.canLoadMore, isLoadingMore = uiState.isLoadingMore, onLoadMore = onLoadMoreRooms, - isAllCategory = uiState.isAllCategory ) } } @@ -198,7 +197,7 @@ private fun GroupSearchContent( FilterButton( modifier = Modifier .align(Alignment.TopEnd) - .padding(top = 196.dp, end = 20.dp), + .padding(top = 174.dp, end = 20.dp), selectedOption = sortOptions[selectedSortOptionIndex], options = sortOptions, onOptionSelected = { selected -> From b2f48e5a11b69df7ddd601cdb66460f290948fbb Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 22 Sep 2025 23:18:06 +0900 Subject: [PATCH 8/9] =?UTF-8?q?[refactor]:=20=EC=B5=9C=EA=B7=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EB=90=9C=20=EB=8F=85=EC=84=9C=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=EB=B0=A9=20=EC=B6=94=EA=B0=80=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/data/model/rooms/response/RoomMainResponse.kt | 3 ++- .../com/texthip/thip/data/repository/RoomsRepository.kt | 2 +- .../java/com/texthip/thip/data/service/RoomsService.kt | 2 +- .../ui/group/myroom/component/GroupDeadlineRoomSection.kt | 8 ++++++-- app/src/main/res/values/strings.xml | 4 ++-- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomMainResponse.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomMainResponse.kt index a49b4d53..cb95dab3 100644 --- a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomMainResponse.kt +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomMainResponse.kt @@ -17,5 +17,6 @@ data class RoomMainResponse( @Serializable data class RoomMainList( @SerialName("deadlineRoomList") val deadlineRoomList: List = emptyList(), - @SerialName("popularRoomList") val popularRoomList: List = emptyList() + @SerialName("popularRoomList") val popularRoomList: List = emptyList(), + @SerialName("recentRoomList") val recentRoomList: List = emptyList() ) \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt b/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt index 25ff616d..6db0d4a0 100644 --- a/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt +++ b/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt @@ -57,7 +57,7 @@ class RoomsRepository @Inject constructor( response } - /** 카테고리별 모임방 섹션 조회 (마감임박/인기) */ + /** 카테고리별 모임방 섹션 조회 (마감임박/인기/최근 생성) */ suspend fun getRoomSections( genre: Genre? = null ): Result = runCatching { diff --git a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt index 1d0bd72e..28ad0581 100644 --- a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt +++ b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt @@ -52,7 +52,7 @@ interface RoomsService { @Query("cursor") cursor: String? = null ): BaseResponse - /** 카테고리별 모임방 목록 조회 (마감임박/인기) */ + /** 카테고리별 모임방 목록 조회 (마감임박/인기/최근 생성) */ @GET("rooms") suspend fun getRooms( @Query("category") category: String = "문학" diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt index 26d46fea..f5dfb027 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt @@ -68,7 +68,7 @@ fun GroupRoomDeadlineSection( // Genre enum을 현지화된 문자열로 변환 val genreStrings = Genre.entries.toDisplayStrings() - // 마감 임박 방 목록과 인기 방 목록을 섹션으로 구성 + // 마감 임박 방 목록, 인기 방 목록, 최신 생성 모임방을 섹션으로 구성 val roomSections = listOf( Pair( stringResource(R.string.room_section_deadline), @@ -77,7 +77,11 @@ fun GroupRoomDeadlineSection( Pair( stringResource(R.string.room_section_popular), roomMainList?.popularRoomList ?: emptyList() - ) + ), + Pair( + stringResource(R.string.room_section_recent), + roomMainList?.recentRoomList ?: emptyList() + ), ) val effectivePagerState = rememberPagerState( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a62c02c9..6e5d8af1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -158,7 +158,6 @@ 이런 모임방은 어때요? "모집" "장르" - 마감 임박한 독서 모임방 %1$s명 참여 "%1$s님의 진행도 " @@ -414,7 +413,8 @@ 마감 임박한 독서 모임방 인기 있는 독서 모임방 인플루언서·작가 독서 모임방 - + 최근 생성된 독서 모임방 + 데이터를 불러올 수 없습니다 네트워크 연결을 확인해주세요 From d366113540f4da4c5efd9d11c7cd5774cae41de2 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Mon, 22 Sep 2025 23:23:43 +0900 Subject: [PATCH 9/9] =?UTF-8?q?[refactor]:=20=EC=B5=9C=EA=B7=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EB=90=9C=20=EB=8F=85=EC=84=9C=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=EB=B0=A9=20=EC=B2=AB=EB=B2=88=EC=A7=B8,=20=EC=BA=90?= =?UTF-8?q?=EB=9F=AC=EC=85=80=20=EB=AC=B4=ED=95=9C=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/myroom/component/GroupDeadlineRoomSection.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt index f5dfb027..fb048e93 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt @@ -84,9 +84,11 @@ fun GroupRoomDeadlineSection( ), ) + val actualPageCount = roomSections.size + val effectivePagerState = rememberPagerState( - initialPage = 0, - pageCount = { roomSections.size } + initialPage = 2, + pageCount = { Int.MAX_VALUE } ) HorizontalPager( @@ -95,7 +97,8 @@ fun GroupRoomDeadlineSection( pageSpacing = pageSpacing, modifier = Modifier.fillMaxWidth() ) { page -> - val (sectionTitle, rooms) = roomSections[page] + val actualPage = page % actualPageCount + val (sectionTitle, rooms) = roomSections[actualPage] val isCurrent = effectivePagerState.currentPage == page val scale = if (isCurrent) 1f else 0.94f