diff --git a/app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsCreateResponse.kt b/app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsCreateResponse.kt index 3700cd2a..fdaaec4f 100644 --- a/app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsCreateResponse.kt +++ b/app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsCreateResponse.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable @Serializable data class CommentsCreateResponse( val commentId: Int?, - val creatorId: Int?, + val creatorId: Long?, val creatorProfileImageUrl: String?, val creatorNickname: String?, val aliasName: String?, diff --git a/app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsResponse.kt b/app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsResponse.kt index 3e35e956..73a70059 100644 --- a/app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsResponse.kt +++ b/app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsResponse.kt @@ -12,7 +12,7 @@ data class CommentsResponse( @Serializable data class CommentList( val commentId: Int?, - val creatorId: Int?, + val creatorId: Long?, val creatorProfileImageUrl: String?, val creatorNickname: String?, val aliasName: String?, @@ -30,7 +30,7 @@ data class CommentList( data class ReplyList( val commentId: Int, val parentCommentCreatorNickname: String, - val creatorId: Int, + val creatorId: Long, val creatorProfileImageUrl: String, val creatorNickname: String, val aliasName: String, diff --git a/app/src/main/java/com/texthip/thip/data/model/feed/response/AllFeedResponse.kt b/app/src/main/java/com/texthip/thip/data/model/feed/response/AllFeedResponse.kt index b2f6ec70..31025630 100644 --- a/app/src/main/java/com/texthip/thip/data/model/feed/response/AllFeedResponse.kt +++ b/app/src/main/java/com/texthip/thip/data/model/feed/response/AllFeedResponse.kt @@ -14,7 +14,7 @@ data class AllFeedResponse( @Serializable data class AllFeedItem( @SerialName("feedId") val feedId: Int, - @SerialName("creatorId") val creatorId: Int, + @SerialName("creatorId") val creatorId: Long, @SerialName("creatorNickname") val creatorNickname: String, @SerialName("creatorProfileImageUrl") val creatorProfileImageUrl: String?, @SerialName("aliasName") val aliasName: String, diff --git a/app/src/main/java/com/texthip/thip/data/model/feed/response/FeedDetailResponse.kt b/app/src/main/java/com/texthip/thip/data/model/feed/response/FeedDetailResponse.kt index 360dd988..886d2238 100644 --- a/app/src/main/java/com/texthip/thip/data/model/feed/response/FeedDetailResponse.kt +++ b/app/src/main/java/com/texthip/thip/data/model/feed/response/FeedDetailResponse.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable @Serializable data class FeedDetailResponse( @SerialName("feedId") val feedId: Int, - @SerialName("creatorId") val creatorId: Int, + @SerialName("creatorId") val creatorId: Long, @SerialName("creatorNickname") val creatorNickname: String, @SerialName("creatorProfileImageUrl") val creatorProfileImageUrl: String?, @SerialName("aliasName") val aliasName: String, diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPostsResponse.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPostsResponse.kt index 8df0be26..f32f41ea 100644 --- a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPostsResponse.kt +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPostsResponse.kt @@ -18,7 +18,7 @@ data class PostList( val postDate: String, val postType: String, val page: Int, - val userId: Int, + val userId: Long, val nickName: String, val profileImageUrl: String?, val content: String, diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsUsersResponse.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsUsersResponse.kt index 92d6a0d1..0c24c461 100644 --- a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsUsersResponse.kt +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsUsersResponse.kt @@ -9,7 +9,7 @@ data class RoomsUsersResponse( @Serializable data class UserList( - val userId: Int, + val userId: Long, val nickname: String, val imageUrl: String, val aliasColor: String, diff --git a/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt index 3061c3f9..972b9d86 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt @@ -45,30 +45,15 @@ fun BookPageTextField( bookTotalPage: Int, enabled: Boolean = true, text: String, + isError: Boolean, onValueChange: (String) -> Unit, ) { - var isError by rememberSaveable { mutableStateOf(false) } - var errorMessageRes by rememberSaveable { mutableStateOf(null) } - Column { OutlinedTextField( value = text, onValueChange = { newText: String -> if (newText.isEmpty() || newText.all { it.isDigit() }) { onValueChange(newText) - - if (newText.isNotEmpty()) { - val pageNum = newText.toInt() - isError = pageNum > bookTotalPage - errorMessageRes = if (isError) { - R.string.error_page_over - } else { - null - } - } else { - isError = false - errorMessageRes = null - } } }, enabled = enabled, @@ -111,8 +96,6 @@ fun BookPageTextField( modifier = Modifier.clickable { if (text.isNotEmpty()) { onValueChange("") - isError = false - errorMessageRes = null } }, tint = Color.Unspecified @@ -120,11 +103,11 @@ fun BookPageTextField( } ) - Box(modifier = Modifier.height(22.dp)) { - if (isError && errorMessageRes != null) { + Box(modifier = Modifier.height(24.dp)) { + if (isError) { Text( modifier = Modifier.padding(start = 4.dp, top = 8.dp), - text = stringResource(id = errorMessageRes!!), + text = stringResource(id = R.string.error_page_over), color = colors.Red, style = typography.menu_r400_s14_h24.copy(lineHeight = 12.sp) ) @@ -172,6 +155,7 @@ fun BookPageTextFieldPreviewEmpty() { BookPageTextField( bookTotalPage = 456, text = text, + isError = false, onValueChange = { text = it } diff --git a/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt b/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt index ee49681d..0b856f83 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt @@ -29,7 +29,7 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun ProfileBar( modifier: Modifier = Modifier, - profileImage: String, + profileImage: String?, topText: String, bottomText: String, bottomTextColor: Color = colors.NeonGreen, diff --git a/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBarFeed.kt b/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBarFeed.kt index bc5f842f..9d4ff041 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBarFeed.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/header/ProfileBarFeed.kt @@ -1,6 +1,7 @@ package com.texthip.thip.ui.common.header 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 @@ -31,10 +32,12 @@ fun ProfileBarFeed( genreName: String, genreColor: Color = colors.NeonGreen, date: String, + onClick: () -> Unit = {} ) { Row( modifier = Modifier - .fillMaxWidth(), + .fillMaxWidth() + .clickable { onClick() }, verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt index c2ba0c71..ab0e5498 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt @@ -58,6 +58,7 @@ import com.texthip.thip.ui.group.room.mock.MenuBottomSheetItem import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography +import com.texthip.thip.utils.rooms.advancedImePadding import kotlinx.coroutines.delay @Composable @@ -66,6 +67,7 @@ fun FeedCommentScreen( feedId: Int, onNavigateBack: () -> Unit = {}, onNavigateToFeedEdit: (Int) -> Unit = {}, + onNavigateToUserProfile: (userId: Long) -> Unit = {}, feedDetailViewModel: FeedDetailViewModel = hiltViewModel(), commentsViewModel: CommentsViewModel = hiltViewModel() ) { @@ -132,295 +134,303 @@ fun FeedCommentScreen( val focusManager = LocalFocusManager.current - Box(modifier = Modifier.fillMaxSize()) { + Box( + modifier = Modifier + .fillMaxSize() + .advancedImePadding() + ) { Box( - modifier = if (isBottomSheetVisible || showDialog) { - Modifier - .fillMaxSize() - .blur(5.dp) - } else { - Modifier.fillMaxSize() - } - // 바깥 터치 시 키보드 숨기기 - .pointerInput(Unit) { - detectTapGestures(onTap = { - focusManager.clearFocus() - selectedCommentId = null - }) + modifier = if (isBottomSheetVisible || showDialog) { + Modifier + .fillMaxSize() + .blur(5.dp) + } else { + Modifier.fillMaxSize() } - ) { - DefaultTopAppBar( - isRightIconVisible = true, - isTitleVisible = false, - onLeftClick = onNavigateBack, - onRightClick = { isBottomSheetVisible = true }, - ) - - LazyColumn( - modifier = modifier - .fillMaxWidth() - .padding(top = 56.dp), - contentPadding = PaddingValues(bottom = 20.dp) + // 바깥 터치 시 키보드 숨기기 + .pointerInput(Unit) { + detectTapGestures(onTap = { + focusManager.clearFocus() + selectedCommentId = null + }) + } ) { - // 상단 피드 - item { - Column { - ProfileBar( - modifier = Modifier.padding(20.dp), - profileImage = feedDetail.creatorProfileImageUrl ?: "", - topText = feedDetail.creatorNickname, - bottomText = feedDetail.aliasName, - showSubscriberInfo = false, - hoursAgo = feedDetail.postDate - ) - Column( - Modifier - .fillMaxWidth() - .padding(vertical = 16.dp, horizontal = 20.dp) - ) { - ActionBookButton( - bookTitle = feedDetail.bookTitle, - bookAuthor = feedDetail.bookAuthor, - onClick = {} - ) - } - Text( - text = feedDetail.contentBody, - style = typography.feedcopy_r400_s14_h20, - color = colors.White, - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp, start = 20.dp, end = 20.dp) - ) - if (images.isNotEmpty()) { - LazyRow( - Modifier - .fillMaxWidth() - .padding(start = 20.dp, bottom = 16.dp), - verticalAlignment = Alignment.CenterVertically - ) { - itemsIndexed(images.take(3)) { index, imageUrl -> - AsyncImage( - model = imageUrl, - contentDescription = null, - modifier = Modifier - .padding(end = 16.dp) - .size(200.dp) - .clickable { - selectedImageIndex = index - showImageViewer = true - }, - contentScale = ContentScale.Crop + Column(modifier = Modifier.fillMaxSize()) { + DefaultTopAppBar( + isRightIconVisible = true, + isTitleVisible = false, + onLeftClick = onNavigateBack, + onRightClick = { isBottomSheetVisible = true }, + ) + + LazyColumn( + modifier = modifier + .fillMaxWidth() + .weight(1f), + contentPadding = PaddingValues(bottom = 20.dp) + ) { + // 상단 피드 + item { + Column { + ProfileBar( + modifier = Modifier.padding(20.dp), + profileImage = feedDetail.creatorProfileImageUrl ?: "", + topText = feedDetail.creatorNickname, + bottomText = feedDetail.aliasName, + showSubscriberInfo = false, + hoursAgo = feedDetail.postDate, + onClick = { onNavigateToUserProfile(feedDetail.creatorId) } + ) + Column( + Modifier + .fillMaxWidth() + .padding(vertical = 16.dp, horizontal = 20.dp) + ) { + ActionBookButton( + bookTitle = feedDetail.bookTitle, + bookAuthor = feedDetail.bookAuthor, + onClick = {} ) } + Text( + text = feedDetail.contentBody, + style = typography.feedcopy_r400_s14_h20, + color = colors.White, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 16.dp, start = 20.dp, end = 20.dp) + ) + if (images.isNotEmpty()) { + LazyRow( + Modifier + .fillMaxWidth() + .padding(start = 20.dp, bottom = 16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + itemsIndexed(images.take(3)) { index, imageUrl -> + AsyncImage( + model = imageUrl, + contentDescription = null, + modifier = Modifier + .padding(end = 16.dp) + .size(200.dp) + .clickable { + selectedImageIndex = index + showImageViewer = true + }, + contentScale = ContentScale.Crop + ) + } + } + } + if (feedDetail.tagList.isNotEmpty()) { + Row( + Modifier + .fillMaxWidth() + .padding(bottom = 16.dp, start = 20.dp, end = 20.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + feedDetail.tagList.forEach { tag -> + OptionChipButton( + text = "#$tag", + isFilled = false, + isSelected = false, + onClick = {}) + } + } + } + HorizontalDivider(color = colors.DarkGrey03, thickness = 10.dp) } } - if (feedDetail.tagList.isNotEmpty()) { - Row( - Modifier - .fillMaxWidth() - .padding(bottom = 16.dp, start = 20.dp, end = 20.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp) - ) { - feedDetail.tagList.forEach { tag -> - OptionChipButton( - text = "#$tag", - isFilled = false, - isSelected = false, - onClick = {}) + when { + commentsUiState.isLoading -> { + item { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 40.dp), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator(color = colors.White) + } } } - } - HorizontalDivider(color = colors.DarkGrey03, thickness = 10.dp) - } - } - when { - commentsUiState.isLoading -> { - item { - Box( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 40.dp), - contentAlignment = Alignment.Center - ) { - CircularProgressIndicator(color = colors.White) + // 댓글 없음 + commentsUiState.comments.isEmpty() -> { + item { + Column( + modifier = Modifier + .fillMaxWidth() + .height(400.dp), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = stringResource(R.string.no_comments_yet), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(R.string.no_comment_subtext), + style = typography.copy_r400_s14, + color = colors.Grey + ) + } + } + } + + else -> { + items( + items = commentsUiState.comments, + key = { comment -> comment.commentId ?: comment.hashCode() } + ) { commentItem -> + CommentSection( + commentItem = commentItem, + actionMode = CommentActionMode.POPUP, + selectedCommentId = selectedCommentId, + onEvent = commentsViewModel::onEvent, + onReplyClick = { commentId, nickname -> + replyingToCommentId = commentId + replyingToNickname = nickname + selectedCommentId = null + }, + onCommentLongPress = { comment -> + selectedCommentId = comment.commentId + }, + onReplyLongPress = { reply -> + selectedCommentId = reply.commentId + }, + onDismissPopup = { + selectedCommentId = null + }, + onProfileClick = onNavigateToUserProfile + ) + } } } } - // 댓글 없음 - commentsUiState.comments.isEmpty() -> { - item { - Column( - modifier = Modifier - .fillMaxWidth() - .height(400.dp), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text( - text = stringResource(R.string.no_comments_yet), - style = typography.smalltitle_sb600_s18_h24, - color = colors.White - ) - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = stringResource(R.string.no_comment_subtext), - style = typography.copy_r400_s14, - color = colors.Grey + + // 댓글 입력창 + CommentTextField( +// modifier = Modifier.align(Alignment.BottomCenter), + input = commentInput, + hint = stringResource(R.string.reply_to), + onInputChange = { commentInput = it }, + onSendClick = { + if (commentInput.isNotBlank()) { + commentsViewModel.onEvent( + CommentsEvent.CreateComment( + content = commentInput, + parentId = replyingToCommentId + ) ) + commentInput = "" + replyingToCommentId = null + replyingToNickname = null + focusManager.clearFocus() } + }, + replyTo = replyingToNickname, + onCancelReply = { + replyingToCommentId = null + replyingToNickname = null } - } + ) + } - else -> { - items( - items = commentsUiState.comments, - key = { comment -> comment.commentId ?: comment.hashCode() } - ) { commentItem -> - CommentSection( - commentItem = commentItem, - actionMode = CommentActionMode.POPUP, - selectedCommentId = selectedCommentId, - onEvent = commentsViewModel::onEvent, - onReplyClick = { commentId, nickname -> - replyingToCommentId = commentId - replyingToNickname = nickname - selectedCommentId = null - }, - onCommentLongPress = { comment -> - selectedCommentId = comment.commentId - }, - onReplyLongPress = { reply -> - selectedCommentId = reply.commentId - }, - onDismissPopup = { - selectedCommentId = null - } - ) - } - } + // 신고 완료 토스트 + if (showToast) { + ToastWithDate( + message = "게시글 신고를 완료했어요.", + modifier = Modifier + .align(Alignment.TopCenter) + .padding(horizontal = 20.dp, vertical = 16.dp) + .zIndex(2f) + ) } } - // 댓글 입력창 - CommentTextField( - modifier = Modifier.align(Alignment.BottomCenter), - input = commentInput, - hint = stringResource(R.string.reply_to), - onInputChange = { commentInput = it }, - onSendClick = { - if (commentInput.isNotBlank()) { - commentsViewModel.onEvent( - CommentsEvent.CreateComment( - content = commentInput, - parentId = replyingToCommentId - ) + if (isBottomSheetVisible) { + val menuItems = if (feedDetail.isWriter) { + // 내 피드인 경우: 수정, 삭제 + listOf( + MenuBottomSheetItem( + text = stringResource(R.string.edit_feed), + color = colors.White, + onClick = { + isBottomSheetVisible = false + onNavigateToFeedEdit(feedDetail.feedId) + } + ), + MenuBottomSheetItem( + text = stringResource(R.string.delete_feed), + color = colors.Red, + onClick = { + isBottomSheetVisible = false + showDialog = true + } ) - commentInput = "" - replyingToCommentId = null - replyingToNickname = null - focusManager.clearFocus() - } - }, - replyTo = replyingToNickname, - onCancelReply = { - replyingToCommentId = null - replyingToNickname = null + ) + } else { + // 다른 사람 피드인 경우: 신고만 + listOf( + MenuBottomSheetItem( + text = stringResource(R.string.report), + color = colors.Red, + onClick = { + isBottomSheetVisible = false + // TODO: 피드 신고 API 호출 + showToast = true + } + ) + ) } - ) - } - // 신고 완료 토스트 - if (showToast) { - ToastWithDate( - message = "게시글 신고를 완료했어요.", - modifier = Modifier - .align(Alignment.TopCenter) - .padding(horizontal = 20.dp, vertical = 16.dp) - .zIndex(2f) + MenuBottomSheet( + items = menuItems, + onDismiss = { isBottomSheetVisible = false } ) } - } - if (isBottomSheetVisible) { - val menuItems = if (feedDetail.isWriter) { - // 내 피드인 경우: 수정, 삭제 - listOf( - MenuBottomSheetItem( - text = stringResource(R.string.edit_feed), - color = colors.White, - onClick = { - isBottomSheetVisible = false - onNavigateToFeedEdit(feedDetail.feedId) - } - ), - MenuBottomSheetItem( - text = stringResource(R.string.delete_feed), - color = colors.Red, - onClick = { - isBottomSheetVisible = false - showDialog = true - } - ) - ) - } else { - // 다른 사람 피드인 경우: 신고만 - listOf( - MenuBottomSheetItem( - text = stringResource(R.string.report), - color = colors.Red, - onClick = { - isBottomSheetVisible = false - // TODO: 피드 신고 API 호출 - showToast = true - } - ) - ) + if (showDialog) { + Box( + Modifier + .fillMaxSize() + .clickable { showDialog = false }) { + Box(Modifier.align(Alignment.Center)) { + DialogPopup( + title = stringResource(R.string.delete_feed_dialog_title), + description = stringResource(R.string.delete_feed_dialog_description), + onConfirm = { + showDialog = false + isBottomSheetVisible = false + // TODO: 피드 삭제 API 호출 + }, + onCancel = { + showDialog = false + isBottomSheetVisible = false + } + ) + } + } } - MenuBottomSheet( - items = menuItems, - onDismiss = { isBottomSheetVisible = false } - ) - } - - if (showDialog) { - Box( - Modifier - .fillMaxSize() - .clickable { showDialog = false }) { - Box(Modifier.align(Alignment.Center)) { - DialogPopup( - title = stringResource(R.string.delete_feed_dialog_title), - description = stringResource(R.string.delete_feed_dialog_description), - onConfirm = { - showDialog = false - isBottomSheetVisible = false - // TODO: 피드 삭제 API 호출 - }, - onCancel = { - showDialog = false - isBottomSheetVisible = false - } - ) + LaunchedEffect(showToast) { + if (showToast) { + delay(3000) + showToast = false } } - } - LaunchedEffect(showToast) { - if (showToast) { - delay(3000) - showToast = false + if (showImageViewer && images.isNotEmpty()) { + ImageViewerModal( + imageUrls = images.take(3), + initialIndex = selectedImageIndex, + onDismiss = { showImageViewer = false } + ) } } - - if (showImageViewer && images.isNotEmpty()) { - ImageViewerModal( - imageUrls = images.take(3), - initialIndex = selectedImageIndex, - onDismiss = { showImageViewer = false } - ) - } } @Preview 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 13e81322..e1ee0d57 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 @@ -50,7 +50,6 @@ import com.texthip.thip.ui.feed.component.FeedSubscribeBarlist import com.texthip.thip.ui.feed.component.MyFeedCard import com.texthip.thip.ui.feed.component.MySubscribeBarlist import com.texthip.thip.ui.feed.viewmodel.FeedViewModel -import com.texthip.thip.ui.feed.viewmodel.MySubscriptionViewModel import com.texthip.thip.ui.mypage.component.SavedFeedCard import com.texthip.thip.ui.mypage.mock.FeedItem import com.texthip.thip.ui.theme.ThipTheme @@ -68,10 +67,10 @@ fun FeedScreen( onNavigateToFeedWrite: () -> Unit = {}, onNavigateToFeedComment: (Int) -> Unit = {}, onNavigateToBookDetail: (String) -> Unit = {}, + onNavigateToUserProfile: (userId: Long) -> Unit = {}, resultFeedId: Int? = null, onResultConsumed: () -> Unit = {}, feedViewModel: FeedViewModel = hiltViewModel(), - mySubscriptionViewModel: MySubscriptionViewModel = hiltViewModel() ) { val feedUiState by feedViewModel.uiState.collectAsState() val scope = rememberCoroutineScope() @@ -351,6 +350,9 @@ fun FeedScreen( }, onBookClick = { onNavigateToBookDetail(allFeed.isbn) + }, + onProfileClick = { + onNavigateToUserProfile(allFeed.creatorId) } ) Spacer(modifier = Modifier.height(40.dp)) 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 f50adfeb..eae22f65 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 @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -46,7 +45,8 @@ fun CommentBottomSheet( uiState: CommentsUiState, onEvent: (CommentsEvent) -> Unit, onDismiss: () -> Unit, - onSendReply: (text: String, parentCommentId: Int?, replyToNickname: String?) -> Unit + onSendReply: (text: String, parentCommentId: Int?, replyToNickname: String?) -> Unit, + onProfileClick: (userId: Long) -> Unit = {} ) { var inputText by remember { mutableStateOf("") } var replyingToCommentId by remember { mutableStateOf(null) } @@ -70,7 +70,7 @@ fun CommentBottomSheet( Column( modifier = Modifier .fillMaxWidth() - .height(600.dp) + .fillMaxHeight(0.8f) .advancedImePadding() ) { Column( @@ -110,7 +110,8 @@ fun CommentBottomSheet( onCommentLongPress = { comment -> selectedCommentForMenu = comment }, - onReplyLongPress = { reply -> selectedReplyForMenu = reply } + onReplyLongPress = { reply -> selectedReplyForMenu = reply }, + onProfileClick = onProfileClick ) } } @@ -198,7 +199,8 @@ private fun CommentLazyList( onReplyClick: (commentId: Int, nickname: String?) -> Unit, onEvent: (CommentsEvent) -> Unit, onCommentLongPress: (CommentList) -> Unit, - onReplyLongPress: (ReplyList) -> Unit + onReplyLongPress: (ReplyList) -> Unit, + onProfileClick: (userId: Long) -> Unit ) { val lazyListState = rememberLazyListState() @@ -235,7 +237,8 @@ private fun CommentLazyList( onReplyClick = onReplyClick, onEvent = onEvent, onCommentLongPress = onCommentLongPress, - onReplyLongPress = onReplyLongPress + onReplyLongPress = onReplyLongPress, + onProfileClick = onProfileClick ) } diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentItem.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentItem.kt index 658f789d..66ee8e9f 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentItem.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/CommentItem.kt @@ -36,6 +36,7 @@ fun CommentItem( onReplyClick: (String?) -> Unit = { }, onLikeClick: () -> Unit = {}, onLongPress: () -> Unit = {}, + onProfileClick: () -> Unit = {}, actionMode: CommentActionMode, isSelected: Boolean = false, onDismissPopup: () -> Unit = {}, @@ -61,7 +62,8 @@ fun CommentItem( nickname = data.creatorNickname ?: "", genreName = data.aliasName ?: "", genreColor = hexToColor(data.aliasColor ?: "#FFFFFF"), - date = data.postDate ?: "" + date = data.postDate ?: "", + onClick = onProfileClick ) Row( 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 cd4b6ef6..8d8c339c 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 @@ -23,9 +23,10 @@ fun CommentSection( onEvent: (CommentsEvent) -> Unit = { _ -> }, onCommentLongPress: (CommentList) -> Unit = { _ -> }, onReplyLongPress: (ReplyList) -> Unit = { _ -> }, + onProfileClick: (userId: Long) -> Unit = {}, actionMode: CommentActionMode, selectedCommentId: Int? = null, - onDismissPopup: () -> Unit = {} + onDismissPopup: () -> Unit = {}, ) { Box { Column( @@ -52,6 +53,10 @@ fun CommentSection( } }, onLongPress = { onCommentLongPress(commentItem) }, + + onProfileClick = { + commentItem.creatorId?.let { id -> onProfileClick(id) } + }, actionMode = actionMode, isSelected = selectedCommentId != null && commentItem.commentId == selectedCommentId, onDismissPopup = onDismissPopup, @@ -70,6 +75,7 @@ fun CommentSection( onEvent(CommentsEvent.LikeReply(reply.commentId)) }, onLongPress = { onReplyLongPress(reply) }, + onProfileClick = { onProfileClick(reply.creatorId) }, actionMode = actionMode, isSelected = selectedCommentId != null && reply.commentId == selectedCommentId, onDismissPopup = onDismissPopup, diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/PageInputSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/PageInputSection.kt index 752580fb..8322e281 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/PageInputSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/PageInputSection.kt @@ -13,6 +13,7 @@ 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.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -42,6 +43,13 @@ fun PageInputSection( onInfoPositionCaptured: (LayoutCoordinates) -> Unit ) { val allRangeText = stringResource(R.string.all_range) + val isError = remember(pageText, bookTotalPage, isGeneralReview) { + if (isGeneralReview) { + false + } else { + pageText.toIntOrNull()?.let { it > bookTotalPage } ?: false + } + } Column( modifier = Modifier, @@ -63,7 +71,8 @@ fun PageInputSection( onValueChange = { if (!isGeneralReview) onPageTextChange(it) }, - enabled = !isGeneralReview + enabled = !isGeneralReview, + isError = isError ) Row( diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/ReplyItem.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/ReplyItem.kt index 829ec33c..539e47e9 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/ReplyItem.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/ReplyItem.kt @@ -38,6 +38,7 @@ fun ReplyItem( onReplyClick: () -> Unit = { }, onLikeClick: () -> Unit = {}, onLongPress: () -> Unit = {}, + onProfileClick: () -> Unit = {}, actionMode: CommentActionMode, isSelected: Boolean = false, onDismissPopup: () -> Unit = {}, @@ -64,7 +65,8 @@ fun ReplyItem( nickname = data.creatorNickname, genreName = data.aliasName, genreColor = hexToColor(data.aliasColor), - date = data.postDate + date = data.postDate, + onClick = onProfileClick ) Row( diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/TextCommentCard.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/TextCommentCard.kt index 3dc8208a..a6269de5 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/TextCommentCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/TextCommentCard.kt @@ -26,7 +26,8 @@ fun TextCommentCard( onLikeClick: (postId: Int, postType: String) -> Unit = { _, _ -> }, onCommentClick: () -> Unit = {}, onLongPress: () -> Unit = {}, - onPinClick: () -> Unit = {} + onPinClick: () -> Unit = {}, + onProfileClick: () -> Unit = {} ) { val isLocked = data.isLocked val isWriter = data.isWriter @@ -45,17 +46,18 @@ fun TextCommentCard( detectTapGestures(onLongPress = { onLongPress() }) } } - .padding(start = 20.dp, end = 20.dp, top = 32.dp), + .padding(start = 20.dp, end = 20.dp, top = 40.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { ProfileBar( modifier = Modifier.padding(0.dp), - profileImage = "https://example.com/image1.jpg", + profileImage = data.profileImageUrl, topText = data.nickName, bottomText = pageText, bottomTextColor = colors.Purple, showSubscriberInfo = false, - hoursAgo = data.postDate + hoursAgo = data.postDate, + onClick = onProfileClick ) Text( diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteCommentCard.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteCommentCard.kt index 04405d8c..8f072d34 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteCommentCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteCommentCard.kt @@ -28,12 +28,12 @@ fun VoteCommentCard( onVote: (postId: Int, voteItemId: Int, type: Boolean) -> Unit = { _, _, _ -> }, onCommentClick: () -> Unit = {}, onLongPress: () -> Unit = {}, + onProfileClick: () -> Unit = {} ) { val selectedIndex = data.voteItems.indexOfFirst { it.isVoted }.takeIf { it != -1 } val hasVoted = selectedIndex != null val isLocked = data.isLocked - val isWriter = data.isWriter val pageText = if (data.isOverview) { stringResource(id = R.string.general_review) @@ -49,16 +49,17 @@ fun VoteCommentCard( detectTapGestures(onLongPress = { onLongPress() }) } } - .padding(start = 20.dp, end = 20.dp, top = 32.dp), + .padding(start = 20.dp, end = 20.dp, top = 40.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { ProfileBar( - profileImage = "https://example.com/image1.jpg", + profileImage = data.profileImageUrl, topText = data.nickName, bottomText = pageText, bottomTextColor = colors.Purple, showSubscriberInfo = false, - hoursAgo = data.postDate + hoursAgo = data.postDate, + onClick = onProfileClick ) Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { 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 379b9fd8..9b39a3f5 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 @@ -79,6 +79,7 @@ fun GroupNoteScreen( onCreateNoteClick: (recentPage: Int, totalPage: Int, isOverviewPossible: Boolean) -> Unit, onCreateVoteClick: (recentPage: Int, totalPage: Int, isOverviewPossible: Boolean) -> Unit, onNavigateToFeedWrite: (pinInfo: RoomsRecordsPinResponse, recordContent: String) -> Unit, + onNavigateToUserProfile: (userId: Long) -> Unit = {}, resultTabIndex: Int? = null, onResultConsumed: () -> Unit = {}, initialPage: Int? = null, @@ -153,6 +154,7 @@ fun GroupNoteScreen( onCreateVoteClick(s.recentBookPage, s.totalBookPage, s.isOverviewPossible) } }, + onNavigateToUserProfile = onNavigateToUserProfile, showProgressBar = showProgressBar, progress = progress.value ) @@ -165,6 +167,7 @@ fun GroupNoteContent( onBackClick: () -> Unit, onCreateNoteClick: () -> Unit, onCreateVoteClick: () -> Unit, + onNavigateToUserProfile: (userId: Long) -> Unit, showProgressBar: Boolean, progress: Float ) { @@ -256,7 +259,6 @@ fun GroupNoteContent( onTabSelected = { onEvent(GroupNoteEvent.OnTabSelected(it)) }, modifier = Modifier .fillMaxWidth() - .padding(top = 20.dp) ) if (uiState.isLoading) { @@ -391,7 +393,8 @@ fun GroupNoteContent( }, onLikeClick = { postId, postType -> onEvent(GroupNoteEvent.OnLikeRecord(postId, postType)) - } + }, + onProfileClick = { onNavigateToUserProfile(post.userId) } ) "VOTE" -> VoteCommentCard( @@ -407,7 +410,8 @@ fun GroupNoteContent( }, onLikeClick = { postId, postType -> onEvent(GroupNoteEvent.OnLikeRecord(postId, postType)) - } + }, + onProfileClick = { onNavigateToUserProfile(post.userId) } ) } } @@ -432,19 +436,19 @@ fun GroupNoteContent( Box( modifier = Modifier .fillMaxWidth() - .padding(top = 118.dp) + .padding(top = 120.dp) ) { Box( modifier = Modifier .fillMaxWidth() - .height(56.dp) + .height(76.dp) .background(color = colors.Black) ) FilterButton( modifier = Modifier .align(Alignment.CenterEnd) - .padding(top = 20.dp, end = 20.dp), + .padding(top = 20.dp, end = 20.dp, bottom = 20.dp), selectedOption = stringResource(uiState.selectedSort.displayNameRes), options = sortDisplayStrings, onOptionSelected = { selectedString -> @@ -515,7 +519,8 @@ fun GroupNoteContent( ) ) } - } + }, + onProfileClick = onNavigateToUserProfile ) } @@ -645,7 +650,8 @@ private fun GroupNoteScreenPreview() { onCreateNoteClick = {}, onCreateVoteClick = {}, showProgressBar = true, - progress = 0.5f + progress = 0.5f, + onNavigateToUserProfile = {} ) } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/component/GroupRoomHeader.kt b/app/src/main/java/com/texthip/thip/ui/group/room/component/GroupRoomHeader.kt index 195ff46a..b132c44a 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/component/GroupRoomHeader.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/component/GroupRoomHeader.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -86,7 +87,9 @@ fun GroupRoomHeader( horizontalArrangement = Arrangement.spacedBy(40.dp, Alignment.Start), verticalAlignment = Alignment.CenterVertically, ) { - Column { + Column( + modifier = Modifier.widthIn(max = 180.dp) + ) { Row { Icon( painter = painterResource(R.drawable.ic_calendar), @@ -114,7 +117,9 @@ fun GroupRoomHeader( } Column( - modifier = Modifier.clickable { onNavigateToMates() } + modifier = Modifier + .widthIn(max = 180.dp) + .clickable { onNavigateToMates() } ) { Row( modifier = Modifier.fillMaxWidth(), @@ -136,16 +141,11 @@ fun GroupRoomHeader( ) } - IconButton( - onClick = { /* TODO: Navigate to participant list */ }, - modifier = Modifier.size(24.dp) - ) { - Icon( - painter = painterResource(R.drawable.ic_chevron), - contentDescription = "Participant Icon", - tint = colors.White - ) - } + Icon( + painter = painterResource(R.drawable.ic_chevron), + contentDescription = "Participant Icon", + tint = colors.White + ) } Spacer(Modifier.height(12.dp)) Text( diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/component/GroupRoomMatesList.kt b/app/src/main/java/com/texthip/thip/ui/group/room/component/GroupRoomMatesList.kt index 158b31b6..9307aaec 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/component/GroupRoomMatesList.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/component/GroupRoomMatesList.kt @@ -18,7 +18,7 @@ import com.texthip.thip.utils.color.hexToColor @Composable fun GroupRoomMatesList( members: RoomsUsersResponse, - onUserClick: (Int) -> Unit = {} + onUserClick: (Long) -> Unit = {} ) { Column( verticalArrangement = Arrangement.spacedBy(16.dp), 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 bc7d026c..f31bc1eb 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 @@ -278,14 +278,6 @@ fun GroupRoomChatContent( if (isBottomSheetVisible && selectedMessage != null) { val menuItems = if (selectedMessage!!.isWriter) { listOf( - MenuBottomSheetItem( - text = stringResource(R.string.modify), - color = colors.White, - onClick = { - // TODO: 수정 처리 - isBottomSheetVisible = false - } - ), MenuBottomSheetItem( text = stringResource(R.string.delete), color = colors.Red, diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomMatesScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomMatesScreen.kt index 3748aff7..2b7487fc 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomMatesScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomMatesScreen.kt @@ -30,7 +30,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors fun GroupRoomMatesScreen( roomId: Int, onBackClick: () -> Unit = {}, - onUserClick: (Int) -> Unit = {}, + onUserClick: (Long) -> Unit = {}, viewModel: GroupRoomMatesViewModel = hiltViewModel() ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -69,7 +69,7 @@ fun GroupRoomMatesScreen( fun GroupRoomMatesContent( data: RoomsUsersResponse, onBackClick: () -> Unit = {}, - onUserClick: (Int) -> Unit = {}, + onUserClick: (Long) -> Unit = {}, ) { val scrollState = rememberScrollState() diff --git a/app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt b/app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt index d35d3103..ac5d937f 100644 --- a/app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt @@ -37,7 +37,8 @@ fun SavedFeedCard( onLikeClick: () -> Unit = {}, onContentClick: () -> Unit = {}, onCommentClick: () -> Unit = {}, - onBookClick: () -> Unit = {} + onBookClick: () -> Unit = {}, + onProfileClick: () -> Unit = {} ) { val hasImages = feedItem.imageUrls.isNotEmpty() val maxLines = if (hasImages) 3 else 8 @@ -53,7 +54,8 @@ fun SavedFeedCard( bottomText = feedItem.userRole, bottomTextColor = bottomTextColor, showSubscriberInfo = false, - hoursAgo = feedItem.timeAgo + hoursAgo = feedItem.timeAgo, + onClick = onProfileClick ) Column( modifier = Modifier diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/FeedNavigation.kt b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/FeedNavigation.kt index d9013c37..906166ca 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/FeedNavigation.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/FeedNavigation.kt @@ -5,17 +5,18 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable +import androidx.navigation.toRoute import com.texthip.thip.ui.feed.screen.FeedCommentScreen +import com.texthip.thip.ui.feed.screen.FeedOthersScreen import com.texthip.thip.ui.feed.screen.FeedScreen import com.texthip.thip.ui.feed.screen.FeedWriteScreen import com.texthip.thip.ui.feed.screen.MySubscriptionScreen -import com.texthip.thip.ui.navigator.extensions.navigateToFeedComment -import androidx.navigation.toRoute -import com.texthip.thip.ui.feed.screen.FeedOthersScreen import com.texthip.thip.ui.feed.viewmodel.FeedWriteViewModel +import com.texthip.thip.ui.navigator.extensions.navigateToBookDetail +import com.texthip.thip.ui.navigator.extensions.navigateToFeedComment import com.texthip.thip.ui.navigator.extensions.navigateToFeedWrite import com.texthip.thip.ui.navigator.extensions.navigateToMySubscription -import com.texthip.thip.ui.navigator.extensions.navigateToBookDetail +import com.texthip.thip.ui.navigator.extensions.navigateToUserProfile import com.texthip.thip.ui.navigator.routes.FeedRoutes import com.texthip.thip.ui.navigator.routes.MainTabRoutes @@ -40,6 +41,9 @@ fun NavGraphBuilder.feedNavigation(navController: NavHostController, navigateBac }, onNavigateToBookDetail = { isbn -> navController.navigateToBookDetail(isbn) + }, + onNavigateToUserProfile = { userId -> + navController.navigateToUserProfile(userId) } ) } @@ -126,6 +130,9 @@ fun NavGraphBuilder.feedNavigation(navController: NavHostController, navigateBac }, onNavigateToFeedEdit = { feedId -> navController.navigate(FeedRoutes.Write(feedId = feedId)) + }, + onNavigateToUserProfile = { userId -> + navController.navigateToUserProfile(userId) } ) } 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 28320fff..b4d4beb5 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 @@ -5,7 +5,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable @@ -45,6 +44,7 @@ import com.texthip.thip.ui.navigator.extensions.navigateToGroupRoomUnlock import com.texthip.thip.ui.navigator.extensions.navigateToGroupSearch import com.texthip.thip.ui.navigator.extensions.navigateToGroupVoteCreate import com.texthip.thip.ui.navigator.extensions.navigateToRecommendedGroupRecruit +import com.texthip.thip.ui.navigator.extensions.navigateToUserProfile import com.texthip.thip.ui.navigator.routes.GroupRoutes import com.texthip.thip.ui.navigator.routes.MainTabRoutes @@ -58,17 +58,17 @@ fun NavGraphBuilder.groupNavigation( // 메인 Group 화면 composable { backStackEntry -> val groupViewModel: GroupViewModel = hiltViewModel() - + // 네비게이션 파라미터로 전달된 토스트 메시지가 있는지 확인 LaunchedEffect(backStackEntry) { val toastMessage = backStackEntry.savedStateHandle.get("toast_message") - + toastMessage?.let { message -> backStackEntry.savedStateHandle.remove("toast_message") groupViewModel.showToastMessage(message) } } - + GroupScreen( viewModel = groupViewModel, onNavigateToMakeRoom = { @@ -94,7 +94,7 @@ fun NavGraphBuilder.groupNavigation( } ) } - + // Group MakeRoom 화면 composable { val viewModel: GroupMakeRoomViewModel = hiltViewModel() @@ -110,12 +110,12 @@ fun NavGraphBuilder.groupNavigation( } ) } - + // Group MakeRoom 화면 (책 정보 미리 선택됨) composable { backStackEntry -> val route = backStackEntry.toRoute() val viewModel: GroupMakeRoomViewModel = hiltViewModel() - + // 책 정보를 ViewModel에 미리 설정 LaunchedEffect(route) { viewModel.setPreselectedBook( @@ -125,7 +125,7 @@ fun NavGraphBuilder.groupNavigation( author = route.author ) } - + GroupMakeRoomScreen( viewModel = viewModel, onNavigateBack = { @@ -139,7 +139,7 @@ fun NavGraphBuilder.groupNavigation( } ) } - + // Group Done 화면 composable { GroupDoneScreen( @@ -148,11 +148,11 @@ fun NavGraphBuilder.groupNavigation( } ) } - + // Group My 화면 composable { val groupMyViewModel: GroupMyViewModel = hiltViewModel() - + GroupMyScreen( viewModel = groupMyViewModel, onCardClick = { room -> @@ -168,12 +168,12 @@ fun NavGraphBuilder.groupNavigation( } ) } - + // Group Search 화면 composable { val groupViewModel: GroupViewModel = hiltViewModel() val uiState by groupViewModel.uiState.collectAsState() - + GroupSearchScreen( roomList = emptyList(), //TODO: RoomMainResponse -> GroupCardItemRoomData 변환 필요 onNavigateBack = { @@ -190,7 +190,7 @@ fun NavGraphBuilder.groupNavigation( } ) } - + // Group Recruit 화면 composable { backStackEntry -> val route = backStackEntry.toRoute() @@ -240,12 +240,12 @@ fun NavGraphBuilder.groupNavigation( } ) } - + // Group Room Unlock 화면 (비밀번호 입력) composable { backStackEntry -> val route = backStackEntry.toRoute() val roomId = route.roomId - + GroupRoomUnlockScreen( roomId = roomId, onBackClick = { @@ -260,7 +260,7 @@ fun NavGraphBuilder.groupNavigation( } ) } - + // Group Room 화면 composable { backStackEntry -> val route = backStackEntry.toRoute() @@ -296,8 +296,8 @@ fun NavGraphBuilder.groupNavigation( onBackClick = { navigateBack() }, - onUserClick = { - // 네비게이션 로직 (예: 유저 프로필로 이동) + onUserClick = { userId -> + navController.navigateToUserProfile(userId) } ) } @@ -318,7 +318,6 @@ fun NavGraphBuilder.groupNavigation( val result = backStackEntry.savedStateHandle.get("selected_tab_index") val viewModel: GroupNoteViewModel = hiltViewModel(backStackEntry) - val uiState by viewModel.uiState.collectAsStateWithLifecycle() GroupNoteScreen( roomId = roomId, @@ -337,7 +336,6 @@ fun NavGraphBuilder.groupNavigation( isOverviewPossible = isOverviewPossible ) }, - // [수정] '투표 생성' 클릭 시 페이지 정보와 함께 내비게이션 onCreateVoteClick = { recentPage, totalPage, isOverviewPossible -> navController.navigateToGroupVoteCreate( roomId = roomId, @@ -355,11 +353,14 @@ fun NavGraphBuilder.groupNavigation( recordContent = recordContent ) }, + onNavigateToUserProfile = { userId -> + navController.navigateToUserProfile(userId) + }, viewModel = viewModel ) } - // Group Note Create 화면 + // Group Note Create 화면 composable { backStackEntry -> val route = backStackEntry.toRoute() val roomId = route.roomId