From 77a4fb29af6155022d020b2dfc460dfa4c8bfb53 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:09:23 +0900 Subject: [PATCH 01/25] =?UTF-8?q?[ui]:=20=ED=88=AC=ED=91=9C=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=97=86=EC=9D=84=20=EB=95=8C=20ui=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/common/cards/CardVote.kt | 114 ++++++++++-------- .../thip/ui/group/room/mock/VoteData.kt | 6 +- app/src/main/res/values/strings.xml | 3 +- 3 files changed, 70 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardVote.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardVote.kt index 12df707f..7795853e 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardVote.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardVote.kt @@ -1,11 +1,13 @@ package com.texthip.thip.ui.common.cards 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.Row import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.pager.HorizontalPager @@ -14,9 +16,7 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateMapOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.toMutableStateList +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -30,17 +30,12 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun CardVote( - voteData: List + voteData: List, + onVoteClick: (VoteData) -> Unit = {} ) { val pageCount = voteData.size val pagerState = rememberPagerState(pageCount = { pageCount }) - // 각 페이지별 상태 기억: 선택 인덱스, 선택 여부 포함한 voteItems - val selectedIndexes = remember { mutableStateMapOf() } - val voteItemStates = remember { - voteData.map { it.voteItems.toMutableStateList() }.toMutableStateList() - } - Column( modifier = Modifier .fillMaxWidth() @@ -55,52 +50,65 @@ fun CardVote( modifier = Modifier.padding(horizontal = 12.dp) ) - HorizontalPager( - state = pagerState, - modifier = Modifier.fillMaxWidth() - ) { page -> - val voteItems = voteItemStates[page] - val selectedIndex = selectedIndexes[page] - val hasVoted = voteItems.any { it.isVoted } - - Column( - modifier = Modifier.padding(horizontal = 12.dp), - verticalArrangement = Arrangement.spacedBy(10.dp) + if (voteData.isEmpty()) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp) + .padding(vertical = 60.dp), + contentAlignment = Alignment.Center ) { Text( - text = voteData[page].description, + text = stringResource(R.string.no_vote), style = typography.info_m500_s12, - color = colors.White, - ) - - GroupVoteButton( - voteItems = voteItems, - selectedIndex = selectedIndex, - hasVoted = hasVoted, - onOptionSelected = { index -> - selectedIndexes[page] = if (selectedIndex == index) null else index - - voteItemStates[page] = voteItems.mapIndexed { i, item -> - item.copy(isVoted = i == index && selectedIndex != index) - }.toMutableStateList() - } + color = colors.Grey ) } - } + } else { + HorizontalPager( + state = pagerState, + modifier = Modifier.fillMaxWidth() + ) { page -> + val vote = voteData[page] + val voteItems = vote.voteItems.take(3) // 최대 3개만 - Row( - Modifier - .fillMaxWidth(), - horizontalArrangement = Arrangement.Center - ) { - repeat(pageCount) { iteration -> - val color = if (pagerState.currentPage == iteration) colors.White else colors.Grey02 - Box( + Column( modifier = Modifier + .height(176.dp) .padding(horizontal = 12.dp) - .background(color, CircleShape) - .size(4.dp) - ) + .clickable { onVoteClick(vote) }, // 전체 클릭 시 이동 + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + Text( + text = vote.description, + style = typography.info_m500_s12, + color = colors.White, + ) + + GroupVoteButton( + voteItems = voteItems, + selectedIndex = null, // 표시용이므로 선택 없음 + hasVoted = false, // 투표 상태 없음 + onOptionSelected = { onVoteClick(vote) } // 어떤 항목을 눌러도 이동 + ) + } + } + + Row( + Modifier + .fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + repeat(pageCount) { iteration -> + val color = + if (pagerState.currentPage == iteration) colors.White else colors.Grey02 + Box( + modifier = Modifier + .padding(horizontal = 12.dp) + .background(color, CircleShape) + .size(4.dp) + ) + } } } } @@ -109,5 +117,13 @@ fun CardVote( @Preview @Composable private fun CardVotePreview() { - CardVote(voteData = mockVoteData) + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + CardVote(voteData = mockVoteData) + CardVote(voteData = emptyList()) + } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/mock/VoteData.kt b/app/src/main/java/com/texthip/thip/ui/group/room/mock/VoteData.kt index 638cd8f7..acff9b1a 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/mock/VoteData.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/mock/VoteData.kt @@ -13,9 +13,9 @@ val mockVoteData = listOf( voteItems = listOf( VoteItem(1, "김땡땡", 50, false), VoteItem(2, "이땡땡", 10, false), - VoteItem(3, "박땡땡", 20, false), - VoteItem(4, "최땡땡", 15, false), - VoteItem(5, "정땡땡", 5, false) +// VoteItem(3, "박땡땡", 20, false), +// VoteItem(4, "최땡땡", 15, false), +// VoteItem(5, "정땡땡", 5, false) ) ), VoteData( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1b87df01..dd424c49 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,7 +50,8 @@ 도서 소개 %1$s 저 기록장 - 🔥모임방의 뜨거운 감자 + 모임방의 뜨거운 감자 + 모임방에 생성된 투표가 없어요 님의 구독자 From 716d88122775067c9d9c8a6e49f6c66e01047d03 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 00:23:01 +0900 Subject: [PATCH 02/25] =?UTF-8?q?[refactor]:=20=EB=B0=A9=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C,=20=EB=82=98=EA=B0=80=EA=B8=B0=20=EB=B0=94=ED=85=80?= =?UTF-8?q?=EC=8B=9C=ED=8A=B8=20=EB=B0=8F=20=EB=AA=A8=EB=8B=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/bottomsheet/MenuBottomSheet.kt | 46 ++++++----- .../ui/group/room/screen/GroupRoomScreen.kt | 81 +++++++++++++++---- app/src/main/res/values/strings.xml | 4 + 3 files changed, 95 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/bottomsheet/MenuBottomSheet.kt b/app/src/main/java/com/texthip/thip/ui/common/bottomsheet/MenuBottomSheet.kt index 1a32c7bd..ebda7048 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/bottomsheet/MenuBottomSheet.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/bottomsheet/MenuBottomSheet.kt @@ -27,30 +27,32 @@ fun MenuBottomSheet( CustomBottomSheet( onDismiss = onDismiss, ) { - items.forEachIndexed { index, item -> - if (index > 0) { - Spacer(modifier = Modifier.height(8.dp)) - HorizontalDivider(modifier = Modifier.height(1.dp), color = colors.Grey03) - Spacer(modifier = Modifier.height(8.dp)) - } + Column(modifier = Modifier.padding(20.dp)) { + items.forEachIndexed { index, item -> + if (index > 0) { + Spacer(modifier = Modifier.height(8.dp)) + HorizontalDivider(modifier = Modifier.height(1.dp), color = colors.Grey03) + Spacer(modifier = Modifier.height(8.dp)) + } - Column( - modifier = Modifier - .height(50.dp) - .padding(horizontal = 12.dp, vertical = 8.dp), - verticalArrangement = Arrangement.Center - ) { - Text( - text = item.text, - style = typography.menu_m500_s16_h24, - color = item.color, + Column( modifier = Modifier - .fillMaxWidth() - .clickable { - item.onClick() - onDismiss() - } - ) + .height(50.dp) + .padding(horizontal = 12.dp, vertical = 8.dp), + verticalArrangement = Arrangement.Center + ) { + Text( + text = item.text, + style = typography.menu_m500_s16_h24, + color = item.color, + modifier = Modifier + .fillMaxWidth() + .clickable { + item.onClick() + onDismiss() + } + ) + } } } } 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 92521fdd..9b42ef22 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 @@ -16,6 +16,7 @@ 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.draw.blur import androidx.compose.ui.layout.ContentScale @@ -25,6 +26,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R import com.texthip.thip.ui.common.bottomsheet.MenuBottomSheet +import com.texthip.thip.ui.common.modal.DialogPopup import com.texthip.thip.ui.common.topappbar.GradationTopAppBar import com.texthip.thip.ui.group.room.component.GroupRoomBody import com.texthip.thip.ui.group.room.component.GroupRoomHeader @@ -41,9 +43,13 @@ fun GroupRoomScreen() { val scrollState = rememberScrollState() var isBottomSheetVisible by remember { mutableStateOf(false) } + var isLeaveDialogVisible by remember { mutableStateOf(false) } + var isDeleteDialogVisible by remember { mutableStateOf(false) } + + val isOwner = false // 서버에서 받아오기 Box( - if (isBottomSheetVisible) { + if (isBottomSheetVisible || isLeaveDialogVisible || isDeleteDialogVisible) { Modifier .fillMaxSize() .blur(5.dp) @@ -98,29 +104,76 @@ fun GroupRoomScreen() { } if (isBottomSheetVisible) { - MenuBottomSheet( - items = listOf( + val menuItems = if (isOwner) { + // 방 주인일 때 + listOf( + MenuBottomSheetItem( + text = stringResource(R.string.delete_room), + color = colors.Red, + onClick = { isDeleteDialogVisible = true } + ) + ) + } else { + // 방 참여자일 때 + listOf( MenuBottomSheetItem( text = stringResource(R.string.leave_room), color = colors.White, - onClick = { } + onClick = { isLeaveDialogVisible = true } ), MenuBottomSheetItem( text = stringResource(R.string.report_room), color = colors.Red, - onClick = { } - ), - MenuBottomSheetItem( - text = stringResource(R.string.delete_room), - color = colors.Red, - onClick = { } + onClick = { /* 신고 로직 */ } ) - ), - onDismiss = { - isBottomSheetVisible = false - } + ) + } + + MenuBottomSheet( + items = menuItems, + onDismiss = { isBottomSheetVisible = false } ) } + + if (isLeaveDialogVisible) { + Box( + modifier = Modifier + .fillMaxSize(), + contentAlignment = Alignment.Center + ) { + DialogPopup( + title = stringResource(R.string.leave_room_modal_title), + description = stringResource(R.string.leave_room_modal_content), + onConfirm = { + // 방 나가기 로직 + isLeaveDialogVisible = false + }, + onCancel = { + isLeaveDialogVisible = false + } + ) + } + } + + if (isDeleteDialogVisible) { + Box( + modifier = Modifier + .fillMaxSize(), + contentAlignment = Alignment.Center + ) { + DialogPopup( + title = stringResource(R.string.delete_room_modal_title), + description = stringResource(R.string.delete_room_modal_content), + onConfirm = { + // 방 삭제하기 로직 + isDeleteDialogVisible = false + }, + onCancel = { + isDeleteDialogVisible = false + } + ) + } + } } @Preview diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dd424c49..6973e548 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -149,8 +149,12 @@ 님에게 답글 작성 메이트들과 간단한 인사를 나눠보세요! 방 나가기 + 모임방을 나가시겠어요? + 방을 나가시게 되면\n독서메이트들과의 추억이 사라집니다. 방 신고하기 방 삭제하기 + 모임방을 삭제하시겠어요? + 방을 삭제하게 되면\n독서메이트들과의 추억이 사라집니다. ~ From 617aaa5e81560a9fa80096e593232ece218a7e3a Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 00:46:22 +0900 Subject: [PATCH 03/25] =?UTF-8?q?[chore]:=20=EB=B0=A9=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=ED=8F=B4=EB=8D=94=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/GroupRoomRecruitScreen.kt} | 16 ++++++++-------- .../screen/GroupRoomUnlockScreen.kt} | 11 ++++++----- .../component/GroupEmptyResult.kt} | 4 ++-- .../component/GroupFilteredSearchResult.kt} | 6 +++--- .../component/GroupLiveSearchResult.kt} | 4 ++-- .../component/GroupRecentSearch.kt} | 10 +++++----- .../screen/GroupSearchScreen.kt | 16 ++++++++++------ 7 files changed, 36 insertions(+), 31 deletions(-) rename app/src/main/java/com/texthip/thip/ui/group/{myroom/screen/GroupRoomScreen.kt => room/screen/GroupRoomRecruitScreen.kt} (98%) rename app/src/main/java/com/texthip/thip/ui/group/{myroom/screen/GroupRoomSecretScreen.kt => room/screen/GroupRoomUnlockScreen.kt} (96%) rename app/src/main/java/com/texthip/thip/ui/group/{myroom/screen/GroupEmptyResultScreen.kt => search/component/GroupEmptyResult.kt} (93%) rename app/src/main/java/com/texthip/thip/ui/group/{myroom/screen/GroupFilteredSearchResultScreen.kt => search/component/GroupFilteredSearchResult.kt} (96%) rename app/src/main/java/com/texthip/thip/ui/group/{myroom/screen/GroupLiveSearchResultScreen.kt => search/component/GroupLiveSearchResult.kt} (94%) rename app/src/main/java/com/texthip/thip/ui/group/{myroom/screen/GroupRecentSearchScreen.kt => search/component/GroupRecentSearch.kt} (95%) rename app/src/main/java/com/texthip/thip/ui/group/{myroom => search}/screen/GroupSearchScreen.kt (93%) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomRecruitScreen.kt similarity index 98% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomRecruitScreen.kt index 269577eb..e9614956 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomRecruitScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.room.screen import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -51,7 +51,7 @@ import com.texthip.thip.ui.theme.ThipTheme.typography import kotlinx.coroutines.delay @Composable -fun GroupRoomScreen( +fun GroupRoomRecruitScreen( detail: GroupRoomData, buttonType: GroupBottomButtonType, onRecommendationClick: (GroupCardItemRoomData) -> Unit = {}, @@ -437,7 +437,7 @@ fun GroupRoomScreen( @Preview(name = "참여 버튼 상태") @Composable -fun GroupRoomScreenPreview_Join() { +fun GroupRoomRecruitScreenPreviewJoin() { ThipTheme { val recommendations = listOf( GroupCardItemRoomData( @@ -504,7 +504,7 @@ fun GroupRoomScreenPreview_Join() { recommendations = recommendations ) - GroupRoomScreen( + GroupRoomRecruitScreen( detail = detailJoin, buttonType = GroupBottomButtonType.JOIN, onRecommendationClick = {}, @@ -518,7 +518,7 @@ fun GroupRoomScreenPreview_Join() { @Preview(name = "참여 취소 버튼 상태") @Composable -fun GroupRoomScreenPreview_Cancel() { +fun GroupRoomRecruitScreenPreviewCancel() { ThipTheme { val recommendations = listOf( GroupCardItemRoomData( @@ -569,7 +569,7 @@ fun GroupRoomScreenPreview_Cancel() { recommendations = recommendations ) - GroupRoomScreen( + GroupRoomRecruitScreen( detail = detailCancel, buttonType = GroupBottomButtonType.CANCEL, onRecommendationClick = {}, @@ -583,7 +583,7 @@ fun GroupRoomScreenPreview_Cancel() { @Preview(name = "모집 마감 버튼 상태") @Composable -fun GroupRoomScreenPreview_Close() { +fun GroupRoomRecruitScreenClose() { ThipTheme { val recommendations = listOf( GroupCardItemRoomData( @@ -634,7 +634,7 @@ fun GroupRoomScreenPreview_Close() { recommendations = recommendations ) - GroupRoomScreen( + GroupRoomRecruitScreen( detail = detailClose, buttonType = GroupBottomButtonType.CLOSE, onRecommendationClick = {}, diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomUnlockScreen.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomUnlockScreen.kt index 3cd62a38..52a36a10 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomUnlockScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.room.screen import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -32,9 +32,10 @@ import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography +import kotlinx.coroutines.delay @Composable -fun GroupRoomSecretScreen( +fun GroupRoomUnlockScreen( onBackClick: () -> Unit = {}, onPasswordComplete: (String) -> Unit = {}, correctPassword: String = "1234" // 실제로는 외부에서 받아올 값 @@ -53,7 +54,7 @@ fun GroupRoomSecretScreen( onPasswordComplete(fullPassword) } else { showError = true - kotlinx.coroutines.delay(1000) + delay(1000) password = arrayOf("", "", "", "") showError = false focusRequesters[0].requestFocus() @@ -157,9 +158,9 @@ fun GroupRoomSecretScreen( @Preview(showBackground = true) @Composable -fun GroupRoomSecretScreenPreview() { +fun GroupRoomUnlockScreenPreview() { ThipTheme { - GroupRoomSecretScreen( + GroupRoomUnlockScreen( onBackClick = {}, onPasswordComplete = { password -> }, diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupEmptyResultScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupEmptyResult.kt similarity index 93% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupEmptyResultScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/search/component/GroupEmptyResult.kt index 0cf28824..2ecaca4a 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupEmptyResultScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupEmptyResult.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.search.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -12,7 +12,7 @@ import androidx.compose.ui.unit.dp import com.texthip.thip.ui.theme.ThipTheme @Composable -fun GroupEmptyResultScreen( +fun GroupEmptyResult( mainText: String, subText: String ) { diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt index f18ac4c3..9d688020 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.search.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -23,7 +23,7 @@ import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData import com.texthip.thip.ui.theme.ThipTheme @Composable -fun GroupFilteredSearchResultScreen( +fun GroupFilteredSearchResult( genres: List, selectedGenreIndex: Int, onGenreSelect: (Int) -> Unit, @@ -58,7 +58,7 @@ fun GroupFilteredSearchResultScreen( .background(colors.DarkGrey02) ) if (roomList.isEmpty()) { - GroupEmptyResultScreen( + GroupEmptyResult( mainText = stringResource(R.string.group_no_search_result1), subText = stringResource(R.string.group_no_search_result2) ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupLiveSearchResult.kt similarity index 94% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/search/component/GroupLiveSearchResult.kt index abf2ea50..b5244d7b 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupLiveSearchResult.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.search.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -15,7 +15,7 @@ import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData import com.texthip.thip.ui.theme.ThipTheme.colors @Composable -fun GroupLiveSearchResultScreen( +fun GroupLiveSearchResult( roomList: List ) { LazyColumn( diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRecentSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt similarity index 95% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRecentSearchScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt index 1958776f..23f5f0df 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRecentSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt @@ -1,6 +1,9 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.search.component import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -9,12 +12,9 @@ import androidx.compose.ui.unit.dp import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.GenreChipButton import com.texthip.thip.ui.theme.ThipTheme -import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height @Composable -fun GroupRecentSearchScreen( +fun GroupRecentSearch( recentSearches: List, onSearchClick: (String) -> Unit, onRemove: (String) -> Unit diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt similarity index 93% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt index 43ec959c..76bd00c9 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.search.screen import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -29,6 +29,10 @@ 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.myroom.mock.GroupCardItemRoomData +import com.texthip.thip.ui.group.search.component.GroupEmptyResult +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.component.GroupFilteredSearchResult import com.texthip.thip.ui.theme.ThipTheme @Composable @@ -132,14 +136,14 @@ fun GroupSearchScreen( when { searchText.isBlank() && !isSearched && recentSearches.isEmpty() -> { - GroupRecentSearchScreen( + GroupRecentSearch( recentSearches = emptyList(), onSearchClick = {}, onRemove = {} ) } searchText.isBlank() && !isSearched && recentSearches.isNotEmpty() -> { - GroupRecentSearchScreen( + GroupRecentSearch( recentSearches = recentSearches, onSearchClick = { keyword -> searchText = keyword @@ -152,18 +156,18 @@ fun GroupSearchScreen( } searchText.isNotBlank() && !isSearched -> { if (liveFilteredRoomList.isEmpty()) { - GroupEmptyResultScreen( + GroupEmptyResult( mainText = stringResource(R.string.group_no_search_result1), subText = stringResource(R.string.group_no_search_result2) ) } else { - GroupLiveSearchResultScreen( + GroupLiveSearchResult( roomList = liveFilteredRoomList ) } } isSearched -> { - GroupFilteredSearchResultScreen( + GroupFilteredSearchResult( genres = genres, selectedGenreIndex = selectedGenreIndex, onGenreSelect = { selectedGenreIndex = it }, From 605b0fd077b44b477157647659df95f45ab4cfe7 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 01:00:40 +0900 Subject: [PATCH 04/25] =?UTF-8?q?[ui]:=20=EC=98=A4=EB=8A=98=EC=9D=98=20?= =?UTF-8?q?=ED=95=9C=EB=A7=88=EB=94=94=20=EB=8C=93=EA=B8=80=20=EB=B0=94?= =?UTF-8?q?=ED=85=80=EC=8B=9C=ED=8A=B8=20=EC=B6=94=EA=B0=80=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/cards/CardCommentGroup.kt | 12 +- .../ui/group/room/mock/GroupRoomChatData.kt | 3 +- .../group/room/screen/GroupRoomChatScreen.kt | 168 +++++++++++++----- app/src/main/res/values/strings.xml | 3 + 4 files changed, 134 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardCommentGroup.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardCommentGroup.kt index caf7a8e1..73036875 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardCommentGroup.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardCommentGroup.kt @@ -17,7 +17,8 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun CardCommentGroup( - data: GroupRoomChatData + data: GroupRoomChatData, + onMenuClick: () -> Unit ) { Column( modifier = Modifier @@ -27,7 +28,8 @@ fun CardCommentGroup( ProfileBarWithDate( profileImage = data.profileImage, nickname = data.nickname, - dateText = data.date + dateText = data.date, + onMenuClick = onMenuClick ) Spacer(Modifier.height(8.dp)) Text( @@ -47,7 +49,9 @@ private fun CardCommentGroupPreview() { profileImage = null, nickname = "user.01", date = "11시간 전", - content = "이것은 그룹 채팅의 댓글입니다. 이곳에 댓글 내용을 작성할 수 있습니다. 여러 줄로 작성해도 됩니다." - ) + content = "이것은 그룹 채팅의 댓글입니다. 이곳에 댓글 내용을 작성할 수 있습니다. 여러 줄로 작성해도 됩니다.", + isMine = false + ), + onMenuClick = {} ) } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/mock/GroupRoomChatData.kt b/app/src/main/java/com/texthip/thip/ui/group/room/mock/GroupRoomChatData.kt index 039859bb..05324dbf 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/mock/GroupRoomChatData.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/mock/GroupRoomChatData.kt @@ -6,5 +6,6 @@ data class GroupRoomChatData( val profileImage: Painter?, val nickname: String, val date: String, - val content: String + val content: String, + val isMine: Boolean ) 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 1b86cb09..e7f12221 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 @@ -1,6 +1,7 @@ package com.texthip.thip.ui.group.room.screen import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding @@ -14,15 +15,18 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur 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.ui.common.bottomsheet.MenuBottomSheet import com.texthip.thip.ui.common.cards.CardCommentGroup import com.texthip.thip.ui.common.forms.CommentTextField import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar import com.texthip.thip.ui.common.view.CountingBar import com.texthip.thip.ui.group.room.mock.GroupRoomChatData +import com.texthip.thip.ui.group.room.mock.MenuBottomSheetItem import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors @@ -33,78 +37,148 @@ fun GroupRoomChatScreen() { null, "user.01", "2024.04.29", - "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다." + "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", + isMine = true ), GroupRoomChatData( null, "user.01", "2024.04.28", - "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다." + "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", + isMine = true ), - GroupRoomChatData(null, "user.01", "2024.04.30", "공백 포함 글자 입력입니다."), - GroupRoomChatData(null, "user.01", "2024.04.30", "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다."), + GroupRoomChatData(null, "user.01", "2024.04.30", "공백 포함 글자 입력입니다.", isMine = false), GroupRoomChatData( null, "user.01", "2024.04.30", - "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다." + "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", + isMine = true + ), + GroupRoomChatData( + null, + "user.01", + "2024.04.30", + "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", + isMine = false ), ).sortedByDescending { it.date } var input by remember { mutableStateOf("") } var replyTo by remember { mutableStateOf(null) } - Column( - modifier = Modifier - .fillMaxSize() - ) { - DefaultTopAppBar( - title = stringResource(R.string.group_room_chat), - onLeftClick = {}, - ) + var isBottomSheetVisible by remember { mutableStateOf(false) } + var selectedMessage by remember { mutableStateOf(null) } - LazyColumn( - reverseLayout = true, - modifier = Modifier.weight(1f), - verticalArrangement = Arrangement.spacedBy(20.dp) + Box( + if (isBottomSheetVisible) { + Modifier + .fillMaxSize() + .blur(5.dp) + } else { + Modifier.fillMaxSize() + } + ) { + Column( + modifier = Modifier + .fillMaxSize() ) { - itemsIndexed(messages) { index, message -> - val isNewDate = when { - index == 0 -> true - messages[index - 1].date != message.date -> true - else -> false - } + DefaultTopAppBar( + title = stringResource(R.string.group_room_chat), + onLeftClick = {}, + ) - val isBottomItem = index == 0 + LazyColumn( + reverseLayout = true, + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(20.dp) + ) { + itemsIndexed(messages) { index, message -> + val isNewDate = when { + index == 0 -> true + messages[index - 1].date != message.date -> true + else -> false + } + val isBottomItem = index == 0 - Column( - verticalArrangement = Arrangement.spacedBy(20.dp), - modifier = if (isBottomItem) Modifier.padding(bottom = 20.dp) else Modifier - ) { - if (isNewDate) { - HorizontalDivider( - color = colors.DarkGrey02, - thickness = 10.dp - ) - CountingBar( - modifier = Modifier.align(Alignment.CenterHorizontally), - content = message.date + Column( + verticalArrangement = Arrangement.spacedBy(20.dp), + modifier = if (isBottomItem) Modifier.padding(bottom = 20.dp) else Modifier + ) { + if (isNewDate) { + HorizontalDivider( + color = colors.DarkGrey02, + thickness = 10.dp + ) + CountingBar( + modifier = Modifier.align(Alignment.CenterHorizontally), + content = message.date + ) + } + + CardCommentGroup( + data = message, + onMenuClick = { + selectedMessage = message + isBottomSheetVisible = true + } ) } - CardCommentGroup(data = message) } } + CommentTextField( + input = input, + hint = stringResource(R.string.group_room_chat_hint), + onInputChange = { input = it }, + onSendClick = { + input = "" + replyTo = null + }, + replyTo = replyTo, + onCancelReply = { replyTo = null } + ) + } + } + + if (isBottomSheetVisible && selectedMessage != null) { + val menuItems = if (selectedMessage!!.isMine) { + listOf( + MenuBottomSheetItem( + text = stringResource(R.string.modify), + color = colors.White, + onClick = { + // TODO: 수정 처리 + isBottomSheetVisible = false + } + ), + MenuBottomSheetItem( + text = stringResource(R.string.delete), + color = colors.Red, + onClick = { + // TODO: 삭제 처리 + isBottomSheetVisible = false + } + ) + ) + } else { + listOf( + MenuBottomSheetItem( + text = stringResource(R.string.report), + color = colors.Red, + onClick = { + // TODO: 신고 처리 + isBottomSheetVisible = false + } + ) + ) } - CommentTextField( - input = input, - hint = stringResource(R.string.group_room_chat_hint), - onInputChange = { input = it }, - onSendClick = { - input = "" - replyTo = null - }, - replyTo = replyTo, - onCancelReply = { replyTo = null } + + MenuBottomSheet( + items = menuItems, + onDismiss = { + isBottomSheetVisible = false + selectedMessage = null + } ) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6973e548..893c8ab4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,6 +155,9 @@ 방 삭제하기 모임방을 삭제하시겠어요? 방을 삭제하게 되면\n독서메이트들과의 추억이 사라집니다. + 삭제하기 + 수정하기 + 신고하기 ~ From 35c34c020f34106cc90ee8f753f760760a31d5a6 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 01:08:07 +0900 Subject: [PATCH 05/25] =?UTF-8?q?[ui]:=20=EC=98=A4=EB=8A=98=EC=9D=98=20?= =?UTF-8?q?=ED=95=9C=EB=A7=88=EB=94=94=20=EC=97=86=EC=9D=84=20=EB=95=8C=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=B6=94=EA=B0=80=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/room/screen/GroupRoomChatScreen.kt | 82 ++++++++++++------- app/src/main/res/values/strings.xml | 2 + 2 files changed, 54 insertions(+), 30 deletions(-) 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 e7f12221..72ee598f 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 @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -29,6 +30,7 @@ import com.texthip.thip.ui.group.room.mock.GroupRoomChatData 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 @Composable fun GroupRoomChatScreen() { @@ -88,41 +90,61 @@ fun GroupRoomChatScreen() { onLeftClick = {}, ) - LazyColumn( - reverseLayout = true, - modifier = Modifier.weight(1f), - verticalArrangement = Arrangement.spacedBy(20.dp) - ) { - itemsIndexed(messages) { index, message -> - val isNewDate = when { - index == 0 -> true - messages[index - 1].date != message.date -> true - else -> false - } - val isBottomItem = index == 0 - + if (messages.isEmpty()) { Column( - verticalArrangement = Arrangement.spacedBy(20.dp), - modifier = if (isBottomItem) Modifier.padding(bottom = 20.dp) else Modifier + modifier = Modifier + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center ) { - if (isNewDate) { - HorizontalDivider( - color = colors.DarkGrey02, - thickness = 10.dp - ) - CountingBar( - modifier = Modifier.align(Alignment.CenterHorizontally), - content = message.date - ) + Text( + text = stringResource(R.string.group_room_no_chat_title), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Text( + text = stringResource(R.string.group_room_no_chat_content), + style = typography.copy_r400_s14, + color = colors.Grey + ) + } + } else { + LazyColumn( + reverseLayout = true, + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(20.dp) + ) { + itemsIndexed(messages) { index, message -> + val isNewDate = when { + index == 0 -> true + messages[index - 1].date != message.date -> true + else -> false } + val isBottomItem = index == 0 - CardCommentGroup( - data = message, - onMenuClick = { - selectedMessage = message - isBottomSheetVisible = true + Column( + verticalArrangement = Arrangement.spacedBy(20.dp), + modifier = if (isBottomItem) Modifier.padding(bottom = 20.dp) else Modifier + ) { + if (isNewDate) { + HorizontalDivider( + color = colors.DarkGrey02, + thickness = 10.dp + ) + CountingBar( + modifier = Modifier.align(Alignment.CenterHorizontally), + content = message.date + ) } - ) + + CardCommentGroup( + data = message, + onMenuClick = { + selectedMessage = message + isBottomSheetVisible = true + } + ) + } } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 893c8ab4..0f44fa33 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -158,6 +158,8 @@ 삭제하기 수정하기 신고하기 + 아직 대화가 없어요 + 첫번째 한마디를 남겨보세요! ~ From 2c3cab79743d163ca18e4f8ee6c8cc7bd08cb14c Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 01:30:06 +0900 Subject: [PATCH 06/25] =?UTF-8?q?[refactor]:=20=EC=B4=9D=ED=8F=89=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94=EC=9D=BC=20?= =?UTF-8?q?=EB=95=8C=20toast=20message=20=EB=9C=A8=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/buttons/OptionChipButton.kt | 13 +- .../note/component/FilterHeaderSection.kt | 4 +- .../ui/group/note/screen/GroupNoteScreen.kt | 243 ++++++++++-------- app/src/main/res/values/strings.xml | 1 + 4 files changed, 149 insertions(+), 112 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/OptionChipButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/OptionChipButton.kt index a631aebf..21f0ba2a 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/OptionChipButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/OptionChipButton.kt @@ -32,10 +32,11 @@ fun OptionChipButton( modifier: Modifier = Modifier, text: String, isFilled: Boolean = false, - isSelected: Boolean? = null, // 추가 + isSelected: Boolean? = null, enabled: Boolean = true, textStyle: TextStyle = typography.info_r400_s12, onClick: () -> Unit, + onDisabledClick: () -> Unit = { } ) { var isClicked by remember { mutableStateOf(false) } val checked = isSelected ?: isClicked @@ -69,9 +70,13 @@ fun OptionChipButton( color = borderColor, shape = RoundedCornerShape(20.dp) ) - .clickable(enabled = enabled) { - if (isSelected == null) isClicked = !isClicked - onClick() + .clickable { + if (enabled) { + if (isSelected == null) isClicked = !isClicked + onClick() + } else { + onDisabledClick.invoke() + } } .height(30.dp) .padding(horizontal = 12.dp), diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/FilterHeaderSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/FilterHeaderSection.kt index b1452684..33e37221 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/FilterHeaderSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/FilterHeaderSection.kt @@ -31,6 +31,7 @@ fun FilterHeaderSection( onFirstPageChange: (String) -> Unit, onLastPageChange: (String) -> Unit, onTotalToggle: () -> Unit, + onDisabledClick: () -> Unit = { } ) { var isPageInputVisible by rememberSaveable { mutableStateOf(false) } val isPageFiltered = firstPage.isNotBlank() || lastPage.isNotBlank() @@ -63,7 +64,8 @@ fun FilterHeaderSection( isSelected = isTotalSelected, enabled = totalEnabled, textStyle = typography.menu_r400_s14_h24, - onClick = onTotalToggle + onClick = onTotalToggle, + onDisabledClick = onDisabledClick ) } 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 8a5cfbb1..77bcb364 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 @@ -12,6 +12,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf @@ -25,11 +26,13 @@ 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 import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.ExpandableFloatingButton import com.texthip.thip.ui.common.buttons.FabMenuItem import com.texthip.thip.ui.common.buttons.FilterButton import com.texthip.thip.ui.common.header.HeaderMenuBarTab +import com.texthip.thip.ui.common.modal.ToastWithDate import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar import com.texthip.thip.ui.group.note.component.CommentBottomSheet import com.texthip.thip.ui.group.note.component.FilterHeaderSection @@ -42,6 +45,7 @@ import com.texthip.thip.ui.group.note.mock.mockGroupNoteItems import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography +import kotlinx.coroutines.delay @Composable fun GroupNoteScreen() { @@ -66,6 +70,16 @@ fun GroupNoteScreen() { var selectedNoteRecord by remember { mutableStateOf(null) } var selectedNoteVote by remember { mutableStateOf(null) } + var showToast by remember { mutableStateOf(false) } + + // 토스트 3초 + LaunchedEffect(showToast) { + if (showToast) { + delay(3000) // TODO: 수정 가능 + showToast = false + } + } + Box( if (isBottomSheetVisible) { Modifier @@ -75,126 +89,141 @@ fun GroupNoteScreen() { Modifier.fillMaxSize() } ) { - Column(modifier = Modifier.fillMaxSize()) { - DefaultTopAppBar( - title = stringResource(R.string.record_book), - onLeftClick = {} - ) + Box { + // 토스트 팝업 + if (showToast) { + ToastWithDate( + message = stringResource(R.string.condition_of_view_general_review), + modifier = Modifier + .align(Alignment.TopCenter) + .padding(horizontal = 20.dp, vertical = 16.dp) + .zIndex(2f) + ) + } - HeaderMenuBarTab( - titles = tabs, - selectedTabIndex = selectedTabIndex, - onTabSelected = { selectedTabIndex = it }, - modifier = Modifier - .fillMaxWidth() - .padding(top = 20.dp, bottom = 56.dp) - ) + Column(modifier = Modifier.fillMaxSize()) { + DefaultTopAppBar( + title = stringResource(R.string.record_book), + onLeftClick = {} + ) - // 피드 리스트 영역 - LazyColumn( - modifier = Modifier - .fillMaxSize() - .padding(bottom = 82.dp), - ) { - item { - Row( - modifier = Modifier.padding( - start = 20.dp, - end = 20.dp, - bottom = 16.dp, - top = 20.dp - ), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(4.dp), - ) { - Icon( - painterResource(R.drawable.ic_information), - contentDescription = null, - tint = colors.White, - ) - Text( - text = stringResource(R.string.group_note_info), - modifier = Modifier.padding(start = 8.dp), - color = colors.Grey01, - style = typography.info_r400_s12 - ) + HeaderMenuBarTab( + titles = tabs, + selectedTabIndex = selectedTabIndex, + onTabSelected = { selectedTabIndex = it }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 20.dp, bottom = 56.dp) + ) + + + // 피드 리스트 영역 + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(bottom = 82.dp), + ) { + item { + Row( + modifier = Modifier.padding( + start = 20.dp, + end = 20.dp, + bottom = 16.dp, + top = 20.dp + ), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Icon( + painterResource(R.drawable.ic_information), + contentDescription = null, + tint = colors.White, + ) + Text( + text = stringResource(R.string.group_note_info), + modifier = Modifier.padding(start = 8.dp), + color = colors.Grey01, + style = typography.info_r400_s12 + ) + } } - } - items(filteredItems) { item -> - when (item) { - is GroupNoteRecord -> TextCommentCard( - data = item, - onCommentClick = { - selectedNoteRecord = item - isBottomSheetVisible = true - } - ) - - is GroupNoteVote -> VoteCommentCard( - data = item, - onCommentClick = { - selectedNoteVote = item - isBottomSheetVisible = true - } - ) + items(filteredItems) { item -> + when (item) { + is GroupNoteRecord -> TextCommentCard( + data = item, + onCommentClick = { + selectedNoteRecord = item + isBottomSheetVisible = true + } + ) + + is GroupNoteVote -> VoteCommentCard( + data = item, + onCommentClick = { + selectedNoteVote = item + isBottomSheetVisible = true + } + ) + } } } } - } - Box( - modifier = Modifier - .fillMaxWidth() - .padding(top = 136.dp), - ) { - FilterButton( + Box( modifier = Modifier - .align(Alignment.CenterEnd) - .padding(end = 20.dp), - selectedOption = selectedFilter, - options = filters, - onOptionSelected = { selectedFilter = it } - ) + .fillMaxWidth() + .padding(top = 136.dp), + ) { + FilterButton( + modifier = Modifier + .align(Alignment.CenterEnd) + .padding(end = 20.dp), + selectedOption = selectedFilter, + options = filters, + onOptionSelected = { selectedFilter = it } + ) - FilterHeaderSection( - firstPage = firstPage, - lastPage = lastPage, - isTotalSelected = isTotalSelected, - totalEnabled = totalEnabled, - onFirstPageChange = { firstPage = it }, - onLastPageChange = { lastPage = it }, - onTotalToggle = { isTotalSelected = !isTotalSelected }, - ) - } + FilterHeaderSection( + firstPage = firstPage, + lastPage = lastPage, + isTotalSelected = isTotalSelected, + totalEnabled = totalEnabled, + onFirstPageChange = { firstPage = it }, + onLastPageChange = { lastPage = it }, + onTotalToggle = { isTotalSelected = !isTotalSelected }, + onDisabledClick = { showToast = true } + ) + } - ExpandableFloatingButton( - menuItems = listOf( - FabMenuItem( - icon = painterResource(R.drawable.ic_write), - text = stringResource(R.string.write_record), - onClick = { } - ), - FabMenuItem( - icon = painterResource(R.drawable.ic_vote), - text = stringResource(R.string.create_vote), - onClick = { } + ExpandableFloatingButton( + menuItems = listOf( + FabMenuItem( + icon = painterResource(R.drawable.ic_write), + text = stringResource(R.string.write_record), + onClick = { } + ), + FabMenuItem( + icon = painterResource(R.drawable.ic_vote), + text = stringResource(R.string.create_vote), + onClick = { } + ) ) ) - ) - } + } - if (isBottomSheetVisible && (selectedNoteRecord != null || selectedNoteVote != null)) { - CommentBottomSheet( - commentResponse = listOf(mockComment, mockComment, mockComment), - onDismiss = { - isBottomSheetVisible = false - selectedNoteRecord = null - selectedNoteVote = null - }, - onSendReply = { replyText, commentId, replyTo -> - // 댓글 전송 로직 구현 - } - ) + if (isBottomSheetVisible && (selectedNoteRecord != null || selectedNoteVote != null)) { + CommentBottomSheet( + commentResponse = listOf(mockComment, mockComment, mockComment), + onDismiss = { + isBottomSheetVisible = false + selectedNoteRecord = null + selectedNoteVote = null + }, + onSendReply = { replyText, commentId, replyTo -> + // 댓글 전송 로직 구현 + } + ) + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f44fa33..b771bdb5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -197,6 +197,7 @@ 투표 내용을 20자 이내로 입력하세요. 항목을 20자 이내로 입력 항목 추가 + 독서 진행도 80% 이상부터 총평을 볼 수 있어요. 피드 From 60288143eefaab84961374615c762054d76e36b9 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 01:56:58 +0900 Subject: [PATCH 07/25] =?UTF-8?q?[ui]:=20=EA=B8=B0=EB=A1=9D=20=EB=8D=94?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0=20=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/note/component/TextCommentCard.kt | 10 +++- .../group/note/component/VoteCommentCard.kt | 10 +++- .../ui/group/note/screen/GroupNoteScreen.kt | 55 +++++++++++++++++-- 3 files changed, 67 insertions(+), 8 deletions(-) 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 a93dccfe..97179f05 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 @@ -1,5 +1,6 @@ package com.texthip.thip.ui.group.note.component +import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding @@ -11,6 +12,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.blur +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -26,13 +28,19 @@ import com.texthip.thip.ui.theme.ThipTheme.typography fun TextCommentCard( modifier: Modifier = Modifier, data: GroupNoteRecord, - onCommentClick: () -> Unit = {} + onCommentClick: () -> Unit = {}, + onLongPress: () -> Unit = {} ) { var isLiked by remember { mutableStateOf(data.isLiked) } Column( modifier = modifier .blur(if (data.isLocked) 5.dp else 0.dp) + .pointerInput(Unit) { + detectTapGestures( + onLongPress = { onLongPress() } + ) + } .padding(vertical = 16.dp, horizontal = 20.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { 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 b227b296..47ce8bc8 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 @@ -1,5 +1,6 @@ package com.texthip.thip.ui.group.note.component +import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding @@ -11,6 +12,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.blur +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -28,7 +30,8 @@ import com.texthip.thip.ui.theme.ThipTheme.typography fun VoteCommentCard( modifier: Modifier = Modifier, data: GroupNoteVote, - onCommentClick: () -> Unit = {} + onCommentClick: () -> Unit = {}, + onLongPress: () -> Unit = {} ) { var isLiked by remember { mutableStateOf(data.isLiked) } var selected by remember { mutableStateOf(null) } @@ -38,6 +41,11 @@ fun VoteCommentCard( Column( modifier = modifier .blur(if (data.isLocked) 5.dp else 0.dp) + .pointerInput(Unit) { + detectTapGestures( + onLongPress = { onLongPress() } + ) + } .padding(vertical = 16.dp, horizontal = 20.dp), 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 77bcb364..0d17c537 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 @@ -28,6 +28,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.texthip.thip.R +import com.texthip.thip.ui.common.bottomsheet.MenuBottomSheet import com.texthip.thip.ui.common.buttons.ExpandableFloatingButton import com.texthip.thip.ui.common.buttons.FabMenuItem import com.texthip.thip.ui.common.buttons.FilterButton @@ -42,6 +43,7 @@ import com.texthip.thip.ui.group.note.mock.GroupNoteRecord import com.texthip.thip.ui.group.note.mock.GroupNoteVote import com.texthip.thip.ui.group.note.mock.mockComment import com.texthip.thip.ui.group.note.mock.mockGroupNoteItems +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 @@ -66,10 +68,12 @@ fun GroupNoteScreen() { else -> emptyList() } - var isBottomSheetVisible by rememberSaveable { mutableStateOf(false) } + var isCommentBottomSheetVisible by rememberSaveable { mutableStateOf(false) } var selectedNoteRecord by remember { mutableStateOf(null) } var selectedNoteVote by remember { mutableStateOf(null) } + var isMenuBottomSheetVisible by rememberSaveable { mutableStateOf(false) } + var showToast by remember { mutableStateOf(false) } // 토스트 3초 @@ -81,7 +85,7 @@ fun GroupNoteScreen() { } Box( - if (isBottomSheetVisible) { + if (isCommentBottomSheetVisible || isMenuBottomSheetVisible) { Modifier .fillMaxSize() .blur(5.dp) @@ -153,7 +157,10 @@ fun GroupNoteScreen() { data = item, onCommentClick = { selectedNoteRecord = item - isBottomSheetVisible = true + isCommentBottomSheetVisible = true + }, + onLongPress = { + isMenuBottomSheetVisible = true } ) @@ -161,7 +168,10 @@ fun GroupNoteScreen() { data = item, onCommentClick = { selectedNoteVote = item - isBottomSheetVisible = true + isCommentBottomSheetVisible = true + }, + onLongPress = { + isMenuBottomSheetVisible = true } ) } @@ -211,11 +221,11 @@ fun GroupNoteScreen() { ) } - if (isBottomSheetVisible && (selectedNoteRecord != null || selectedNoteVote != null)) { + if (isCommentBottomSheetVisible && (selectedNoteRecord != null || selectedNoteVote != null)) { CommentBottomSheet( commentResponse = listOf(mockComment, mockComment, mockComment), onDismiss = { - isBottomSheetVisible = false + isCommentBottomSheetVisible = false selectedNoteRecord = null selectedNoteVote = null }, @@ -225,6 +235,39 @@ fun GroupNoteScreen() { ) } } + + if (isMenuBottomSheetVisible) { + val isWriter = selectedTabIndex == 1 + + val menuItems = if (isWriter) { + listOf( + MenuBottomSheetItem( + text = stringResource(R.string.delete), + color = colors.Red, + onClick = { + // TODO: 삭제 처리 + isMenuBottomSheetVisible = false + } + ) + ) + } else { + listOf( + MenuBottomSheetItem( + text = stringResource(R.string.report), + color = colors.Red, + onClick = { + // TODO: 신고 처리 + isMenuBottomSheetVisible = false + } + ) + ) + } + + MenuBottomSheet( + items = menuItems, + onDismiss = { isMenuBottomSheetVisible = false } + ) + } } @Preview From afdad737b09737ab2d28ef8bba02c1f285973824 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 02:02:06 +0900 Subject: [PATCH 08/25] =?UTF-8?q?[refactor]:=20lock=EC=83=81=ED=83=9C?= =?UTF-8?q?=EC=9D=BC=20=EB=95=8C=20=ED=81=B4=EB=A6=AD=20=EB=A7=89=EA=B8=B0?= =?UTF-8?q?=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/note/component/TextCommentCard.kt | 16 ++++---- .../group/note/component/VoteCommentCard.kt | 37 ++++++++++--------- 2 files changed, 29 insertions(+), 24 deletions(-) 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 97179f05..809deba3 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 @@ -32,21 +32,21 @@ fun TextCommentCard( onLongPress: () -> Unit = {} ) { var isLiked by remember { mutableStateOf(data.isLiked) } + val isLocked = data.isLocked Column( modifier = modifier - .blur(if (data.isLocked) 5.dp else 0.dp) + .blur(if (isLocked) 5.dp else 0.dp) .pointerInput(Unit) { - detectTapGestures( - onLongPress = { onLongPress() } - ) + if (!isLocked) { + detectTapGestures(onLongPress = { onLongPress() }) + } } .padding(vertical = 16.dp, horizontal = 20.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { ProfileBar( modifier = Modifier.padding(0.dp), -// profileImage = data.profileImageUrl, profileImage = painterResource(R.drawable.character_literature), topText = data.nickName, bottomText = data.page.toString() + stringResource(R.string.page), @@ -66,9 +66,11 @@ fun TextCommentCard( likeCount = data.likeCount, commentCount = data.commentCount, onLikeClick = { - isLiked = !isLiked + if (!isLocked) isLiked = !isLiked + }, + onCommentClick = { + if (!isLocked) onCommentClick() }, - onCommentClick = { onCommentClick() }, ) } } 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 47ce8bc8..75d8507d 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 @@ -38,19 +38,20 @@ fun VoteCommentCard( var voteItems by remember { mutableStateOf(data.voteItems) } val hasVoted = voteItems.any { it.isVoted } + val isLocked = data.isLocked + Column( modifier = modifier - .blur(if (data.isLocked) 5.dp else 0.dp) + .blur(if (isLocked) 5.dp else 0.dp) .pointerInput(Unit) { - detectTapGestures( - onLongPress = { onLongPress() } - ) + if (!isLocked) { + detectTapGestures(onLongPress = { onLongPress() }) + } } .padding(vertical = 16.dp, horizontal = 20.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { ProfileBar( -// profileImage = data.profileImageUrl, profileImage = painterResource(R.drawable.character_literature), topText = data.nickName, bottomText = data.page.toString() + stringResource(R.string.page), @@ -59,9 +60,7 @@ fun VoteCommentCard( hoursAgo = data.postDate ) - Column( - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { Text( text = data.content, style = typography.feedcopy_r400_s14_h20, @@ -73,13 +72,15 @@ fun VoteCommentCard( selectedIndex = selected, hasVoted = hasVoted, onOptionSelected = { - if (selected == it) { - selected = null - voteItems = voteItems.map { it.copy(isVoted = false) } - } else { - selected = it - voteItems = voteItems.mapIndexed { index, item -> - item.copy(isVoted = index == it) + if (!isLocked) { + if (selected == it) { + selected = null + voteItems = voteItems.map { it.copy(isVoted = false) } + } else { + selected = it + voteItems = voteItems.mapIndexed { index, item -> + item.copy(isVoted = index == it) + } } } } @@ -91,9 +92,11 @@ fun VoteCommentCard( likeCount = data.likeCount, commentCount = data.commentCount, onLikeClick = { - isLiked = !isLiked + if (!isLocked) isLiked = !isLiked + }, + onCommentClick = { + if (!isLocked) onCommentClick() }, - onCommentClick = { onCommentClick() }, ) } } From 2acba9377dd25eef1f9fd440e8d4afbc6a64d6c6 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 15:20:50 +0900 Subject: [PATCH 09/25] =?UTF-8?q?[fix]:=20=EC=98=A4=EB=8A=98=EC=9D=98=20?= =?UTF-8?q?=ED=95=9C=EB=A7=88=EB=94=94=20=EB=9C=A8=EB=8A=94=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/room/screen/GroupRoomChatScreen.kt | 57 ++++++++++++------- 1 file changed, 38 insertions(+), 19 deletions(-) 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 72ee598f..896769d5 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 @@ -64,7 +64,22 @@ fun GroupRoomChatScreen() { "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", isMine = false ), + GroupRoomChatData( + null, + "user.01", + "2024.04.27", + "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", + isMine = true + ), + GroupRoomChatData( + null, + "user.01", + "2024.04.27", + "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", + isMine = true + ), ).sortedByDescending { it.date } +// val messages = emptyList() var input by remember { mutableStateOf("") } var replyTo by remember { mutableStateOf(null) } @@ -91,23 +106,26 @@ fun GroupRoomChatScreen() { ) if (messages.isEmpty()) { - Column( - modifier = Modifier - .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text( - text = stringResource(R.string.group_room_no_chat_title), - style = typography.smalltitle_sb600_s18_h24, - color = colors.White - ) - Text( - text = stringResource(R.string.group_room_no_chat_content), - style = typography.copy_r400_s14, - color = colors.Grey - ) - } + Column( + modifier = Modifier + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy( + 8.dp, + alignment = Alignment.CenterVertically + ) + ) { + Text( + text = stringResource(R.string.group_room_no_chat_title), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Text( + text = stringResource(R.string.group_room_no_chat_content), + style = typography.copy_r400_s14, + color = colors.Grey + ) + } } else { LazyColumn( reverseLayout = true, @@ -116,8 +134,8 @@ fun GroupRoomChatScreen() { ) { itemsIndexed(messages) { index, message -> val isNewDate = when { - index == 0 -> true - messages[index - 1].date != message.date -> true + index == messages.lastIndex -> true + messages[index + 1].date != message.date -> true else -> false } val isBottomItem = index == 0 @@ -148,6 +166,7 @@ fun GroupRoomChatScreen() { } } } + CommentTextField( input = input, hint = stringResource(R.string.group_room_chat_hint), From 6d415c827ddc10188001779bee0ed1de67b9d599 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 15:39:21 +0900 Subject: [PATCH 10/25] =?UTF-8?q?[ui]:=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=ED=95=98=EB=8B=A8=EC=97=90=20=EA=B3=A0=EC=A0=95=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/room/screen/GroupRoomChatScreen.kt | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) 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 896769d5..5e0e2c9a 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 @@ -106,31 +106,33 @@ fun GroupRoomChatScreen() { ) if (messages.isEmpty()) { - Column( + Box( modifier = Modifier + .weight(1f) .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy( - 8.dp, - alignment = Alignment.CenterVertically - ) + contentAlignment = Alignment.Center ) { - Text( - text = stringResource(R.string.group_room_no_chat_title), - style = typography.smalltitle_sb600_s18_h24, - color = colors.White - ) - Text( - text = stringResource(R.string.group_room_no_chat_content), - style = typography.copy_r400_s14, - color = colors.Grey - ) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text( + text = stringResource(R.string.group_room_no_chat_title), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Text( + text = stringResource(R.string.group_room_no_chat_content), + style = typography.copy_r400_s14, + color = colors.Grey + ) + } } } else { LazyColumn( reverseLayout = true, modifier = Modifier.weight(1f), - verticalArrangement = Arrangement.spacedBy(20.dp) + verticalArrangement = Arrangement.spacedBy(20.dp, Alignment.Bottom) ) { itemsIndexed(messages) { index, message -> val isNewDate = when { From 6573df64dfec1e8916df768f84f1b91a107c7ed2 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 16:05:59 +0900 Subject: [PATCH 11/25] =?UTF-8?q?[refactor]:=20=EA=B7=B8=EB=A3=B9=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D=EC=97=90=20=EB=AA=A8=EB=93=A0=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=EB=8B=A4=20=EB=B3=B4=EC=9D=B4=EA=B2=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=98=EA=B3=A0=20=EA=B8=B0=EB=A1=9D=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=20=ED=99=94=EB=A9=B4=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/group/note/screen/GroupNoteScreen.kt | 204 +++++++++++------- app/src/main/res/values/strings.xml | 3 + 2 files changed, 128 insertions(+), 79 deletions(-) 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 0d17c537..8bc81caa 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 @@ -63,14 +63,15 @@ fun GroupNoteScreen() { val filters = listOf("최신순", "인기순", "댓글 많은 순") val filteredItems = when (selectedTabIndex) { - 0 -> mockGroupNoteItems.filter { !it.isWriter } // 다른 사람 기록 - 1 -> mockGroupNoteItems.filter { it.isWriter } // 내 기록 + 0 -> mockGroupNoteItems // 전체 기록 + 1 -> mockGroupNoteItems.filter { it.isWriter } // 내 기록만 else -> emptyList() } var isCommentBottomSheetVisible by rememberSaveable { mutableStateOf(false) } var selectedNoteRecord by remember { mutableStateOf(null) } var selectedNoteVote by remember { mutableStateOf(null) } + var selectedItemForMenu by remember { mutableStateOf(null) } var isMenuBottomSheetVisible by rememberSaveable { mutableStateOf(false) } @@ -117,92 +118,128 @@ fun GroupNoteScreen() { onTabSelected = { selectedTabIndex = it }, modifier = Modifier .fillMaxWidth() - .padding(top = 20.dp, bottom = 56.dp) + .padding(top = 20.dp) + .padding(bottom = if (selectedTabIndex == 0) 0.dp else 20.dp), ) - - // 피드 리스트 영역 - LazyColumn( - modifier = Modifier - .fillMaxSize() - .padding(bottom = 82.dp), - ) { - item { - Row( - modifier = Modifier.padding( - start = 20.dp, - end = 20.dp, - bottom = 16.dp, - top = 20.dp - ), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(4.dp), - ) { - Icon( - painterResource(R.drawable.ic_information), - contentDescription = null, - tint = colors.White, - ) - Text( - text = stringResource(R.string.group_note_info), - modifier = Modifier.padding(start = 8.dp), - color = colors.Grey01, - style = typography.info_r400_s12 - ) - } + if (filteredItems.isEmpty()) { + // 기록이 없을 때 중앙에 메시지 + Column( + modifier = Modifier + .fillMaxSize() + .padding(bottom = 102.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy( + 8.dp, + alignment = Alignment.CenterVertically + ) + ) { + Text( + text = stringResource(R.string.no_records_yet), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Text( + text = when (selectedTabIndex) { + 0 -> stringResource(R.string.no_group_record_subtext) + 1 -> stringResource(R.string.no_my_record_subtext) + else -> "" + }, + style = typography.copy_r400_s14, + color = colors.Grey + ) } - items(filteredItems) { item -> - when (item) { - is GroupNoteRecord -> TextCommentCard( - data = item, - onCommentClick = { - selectedNoteRecord = item - isCommentBottomSheetVisible = true - }, - onLongPress = { - isMenuBottomSheetVisible = true + } else { + // 피드 리스트 영역 + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(bottom = 82.dp) + .padding(top = if (selectedTabIndex == 0) 56.dp else 0.dp), + ) { + if (selectedTabIndex == 0) { + item { + Row( + modifier = Modifier.padding( + start = 20.dp, + end = 20.dp, + bottom = 16.dp, + top = 20.dp + ), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Icon( + painterResource(R.drawable.ic_information), + contentDescription = null, + tint = colors.White, + ) + Text( + text = stringResource(R.string.group_note_info), + modifier = Modifier.padding(start = 8.dp), + color = colors.Grey01, + style = typography.info_r400_s12 + ) } - ) + } + } + items(filteredItems) { item -> + when (item) { + is GroupNoteRecord -> TextCommentCard( + data = item, + onCommentClick = { + selectedNoteRecord = item + isCommentBottomSheetVisible = true + }, + onLongPress = { + selectedItemForMenu = item + isMenuBottomSheetVisible = true + } + ) - is GroupNoteVote -> VoteCommentCard( - data = item, - onCommentClick = { - selectedNoteVote = item - isCommentBottomSheetVisible = true - }, - onLongPress = { - isMenuBottomSheetVisible = true - } - ) + is GroupNoteVote -> VoteCommentCard( + data = item, + onCommentClick = { + selectedNoteVote = item + isCommentBottomSheetVisible = true + }, + onLongPress = { + selectedItemForMenu = item + isMenuBottomSheetVisible = true + } + ) + } } } } } - Box( - modifier = Modifier - .fillMaxWidth() - .padding(top = 136.dp), - ) { - FilterButton( + if (selectedTabIndex == 0) { + Box( modifier = Modifier - .align(Alignment.CenterEnd) - .padding(end = 20.dp), - selectedOption = selectedFilter, - options = filters, - onOptionSelected = { selectedFilter = it } - ) + .fillMaxWidth() + .padding(top = 136.dp), + ) { + FilterButton( + modifier = Modifier + .align(Alignment.CenterEnd) + .padding(end = 20.dp), + selectedOption = selectedFilter, + options = filters, + onOptionSelected = { selectedFilter = it } + ) - FilterHeaderSection( - firstPage = firstPage, - lastPage = lastPage, - isTotalSelected = isTotalSelected, - totalEnabled = totalEnabled, - onFirstPageChange = { firstPage = it }, - onLastPageChange = { lastPage = it }, - onTotalToggle = { isTotalSelected = !isTotalSelected }, - onDisabledClick = { showToast = true } - ) + FilterHeaderSection( + firstPage = firstPage, + lastPage = lastPage, + isTotalSelected = isTotalSelected, + totalEnabled = totalEnabled, + onFirstPageChange = { firstPage = it }, + onLastPageChange = { lastPage = it }, + onTotalToggle = { isTotalSelected = !isTotalSelected }, + onDisabledClick = { showToast = true } + ) + } } ExpandableFloatingButton( @@ -236,8 +273,12 @@ fun GroupNoteScreen() { } } - if (isMenuBottomSheetVisible) { - val isWriter = selectedTabIndex == 1 + if (isMenuBottomSheetVisible && selectedItemForMenu != null) { + val isWriter = when (val item = selectedItemForMenu) { + is GroupNoteRecord -> item.isWriter + is GroupNoteVote -> item.isWriter + else -> false + } val menuItems = if (isWriter) { listOf( @@ -247,6 +288,7 @@ fun GroupNoteScreen() { onClick = { // TODO: 삭제 처리 isMenuBottomSheetVisible = false + selectedItemForMenu = null } ) ) @@ -258,6 +300,7 @@ fun GroupNoteScreen() { onClick = { // TODO: 신고 처리 isMenuBottomSheetVisible = false + selectedItemForMenu = null } ) ) @@ -265,7 +308,10 @@ fun GroupNoteScreen() { MenuBottomSheet( items = menuItems, - onDismiss = { isMenuBottomSheetVisible = false } + onDismiss = { + isMenuBottomSheetVisible = false + selectedItemForMenu = null + } ) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b771bdb5..eb1b9b57 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -198,6 +198,9 @@ 항목을 20자 이내로 입력 항목 추가 독서 진행도 80% 이상부터 총평을 볼 수 있어요. + 아직 기록이 없어요. + 우리 모임의 첫번째 기록을 남겨보세요 + 나의 첫번째 기록을 남겨보세요 피드 From 9503ef8232281e1960d963babbde626e8860d2d1 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 23 Jul 2025 16:12:20 +0900 Subject: [PATCH 12/25] =?UTF-8?q?[fix]:=20conflict=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- .../booksearch/component/BookEmptyResult.kt | 55 +++ .../component/BookFilteredSearchResult.kt | 102 ++++++ .../component/BookLiveSearchResult.kt | 43 +++ .../booksearch/component/BookRecentSearch.kt | 187 ++++++++++ .../thip/ui/booksearch/mock/BookData.kt | 10 + .../thip/ui/booksearch/mock/DetailBookData.kt | 13 + .../ui/booksearch/screen/BookDetailScreen.kt | 345 ++++++++++++++++++ .../booksearch/screen/BookRecruitingScreen.kt | 227 ++++++++++++ .../ui/booksearch/screen/BookSearchScreen.kt | 202 +++++++++- .../ui/common/buttons/ActionMediumButton.kt | 3 +- .../thip/ui/common/cards/CardBookList.kt | 5 +- .../thip/ui/common/cards/CardBookSearch.kt | 11 + .../texthip/thip/ui/common/modal/InfoPopup.kt | 93 +++-- .../screen/GroupRegisterBookScreen.kt | 66 ---- .../room/screen/GroupRoomRecruitScreen.kt | 8 +- .../room/screen/GroupRoomUnlockScreen.kt | 3 - .../thip/ui/group/screen/GroupScreen.kt | 3 - .../search/component/GroupEmptyResult.kt | 6 +- .../component/GroupFilteredSearchResult.kt | 36 +- .../search/component/GroupLiveSearchResult.kt | 22 +- .../search/component/GroupRecentSearch.kt | 14 +- .../group/search/screen/GroupSearchScreen.kt | 68 ++-- .../texthip/thip/ui/navigator/MainNavHost.kt | 2 +- app/src/main/res/values/strings.xml | 25 ++ 25 files changed, 1377 insertions(+), 174 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/component/BookEmptyResult.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/component/BookFilteredSearchResult.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/component/BookLiveSearchResult.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/mock/BookData.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/mock/DetailBookData.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookDetailScreen.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookRecruitingScreen.kt delete mode 100644 app/src/main/java/com/texthip/thip/ui/group/makeroom/screen/GroupRegisterBookScreen.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index 5e471df0..38860e7c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,5 +4,5 @@