From a7397ea9e63c3b5bbb4c8fa3a1b7a81bd10f46fd Mon Sep 17 00:00:00 2001 From: Gyubin Date: Tue, 24 Jun 2025 16:52:17 +0900 Subject: [PATCH 01/29] =?UTF-8?q?[UI]=20=ED=8C=8C=EC=9D=BC=EB=AA=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20CardItemRoom=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/cards/CardItemRoom.kt | 145 ++++++++++++++++++ .../thip/ui/common/cards/CardRoomBook.kt | 6 +- .../ui/common/forms/FormTextFieldDefault.kt | 6 +- 3 files changed, 151 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt new file mode 100644 index 00000000..6422efe0 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt @@ -0,0 +1,145 @@ +package com.texthip.thip.ui.common.cards + +import androidx.compose.foundation.Image +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.Spacer +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.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun CardItemRoom( + modifier: Modifier = Modifier, + title: String, + participants: Int, + maxParticipants: Int, + isRecruiting: Boolean, + endDate: Int, // 남은 일 수 (예: 3) + imageRes: Int? = R.drawable.bookcover_sample, + onClick: () -> Unit = {} +) { + Card( + modifier = modifier + .fillMaxWidth() + .clickable { onClick() }, + colors = CardDefaults.cardColors( + containerColor = colors.DarkGrey50 + ), + elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), + shape = RoundedCornerShape(12.dp) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(12.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth() + ) { + // 이미지 + Box( + modifier = Modifier + .size(width = 80.dp, height = 107.dp) + ) { + imageRes?.let { + Image( + painter = painterResource(id = it), + contentDescription = null, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } + } + + Spacer(modifier = Modifier.width(16.dp)) + + Column( + modifier = Modifier.weight(1f) + ) { + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = title, + color = colors.White, + style = typography.smalltitle_sb600_s18_h24, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(8.dp)) + Row(verticalAlignment = Alignment.CenterVertically) { + Icon( + modifier = Modifier.size(20.dp), + painter = painterResource(id = R.drawable.ic_group), + contentDescription = "그룹 아이콘", + tint = Color.White + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = if (isRecruiting) { + "$participants / ${maxParticipants}명" + } else { + "${participants}명 참여" + }, + color = colors.White, + style = typography.info_m500_s12, + ) + } + Spacer(modifier = Modifier.height(5.dp)) + Text( + text = "${endDate}일 뒤 " + if (isRecruiting) "모집 마감" else "종료", + color = if (isRecruiting) colors.Red else colors.Grey01, + style = typography.menu_sb600_s12_h20, + maxLines = 1 + ) + } + } + } + } +} + + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) +@Composable +fun CardItemRoomPreview() { + Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { + CardItemRoom( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + imageRes = R.drawable.bookcover_sample + ) + CardItemRoom( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3, + imageRes = R.drawable.bookcover_sample + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt index 068a4ce5..109a37c4 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt @@ -34,7 +34,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun DetailedDarkCard( +fun CardRoomBook( modifier: Modifier = Modifier, title: String, author: String, @@ -141,13 +141,13 @@ fun DetailedDarkCard( @Preview @Composable -fun PreviewDetailedDarkCard() { +fun PreviewCardRoomBook() { Column( modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { - DetailedDarkCard( + CardRoomBook( title = "도서명을 입력, 예시까지 최대 입력 후...", author = "저자명", publisher = "출판사", diff --git a/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt index cc8f2285..286bb8c8 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt @@ -25,7 +25,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun BaseInputTextField( +fun FormTextFieldDefault( modifier: Modifier = Modifier, hint: String ) { @@ -74,12 +74,12 @@ fun BaseInputTextField( @Composable @Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 200) -fun InputTextFieldPreviewEmpty() { +fun FormTextFieldDefaultPreview() { Box( modifier = Modifier.size(width = 360.dp, height = 200.dp), contentAlignment = Alignment.Center ) { - BaseInputTextField( + FormTextFieldDefault( hint = "이곳에 텍스트를 입력하세요" ) } From 7667ca7006b0df30f6fdca6e66bf31a79a6a5083 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 26 Jun 2025 21:16:34 +0900 Subject: [PATCH 02/29] =?UTF-8?q?[UI]=20=EA=B8=B0=EC=A1=B4=20OptionChipBut?= =?UTF-8?q?ton=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20CardItemRoomData=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetSelector.xml | 14 -- .../ui/common/buttons/OptionChipButton.kt | 16 +- .../thip/ui/common/cards/CardItemRoom.kt | 6 +- .../ui/myPage/myGroup/CardItemRoomData.kt | 13 ++ .../thip/ui/myPage/myGroup/FilterRow.kt | 32 +++ .../myPage/myGroup/MyGroupListFilterScreen.kt | 190 ++++++++++++++++++ .../thip/ui/myPage/myGroup/MyGroupScreen.kt | 108 ++++++++++ app/src/main/res/values/strings.xml | 5 + 8 files changed, 357 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupListFilterScreen.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 75b3c473..a5f374e9 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -13,20 +13,6 @@ - - - - \ No newline at end of file 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 22069b2e..5b6f4d6e 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 @@ -30,22 +30,21 @@ fun OptionChipButton( modifier: Modifier = Modifier, text: String, isFilled: Boolean = false, + isSelected: Boolean = false, onClick: () -> Unit, ) { - var isClicked by remember { mutableStateOf(false) } - val textColor = when { - isFilled -> colors.White - isClicked -> colors.Purple + isFilled && isSelected -> colors.White + isFilled -> colors.Grey01 else -> colors.Grey01 } val backgroundColor = when { - isFilled && isClicked -> colors.Purple + isFilled && isSelected -> colors.Purple isFilled -> colors.DarkGrey else -> Color.Transparent } val borderColor = when { - !isFilled && isClicked -> colors.Purple + !isFilled && isSelected -> colors.Purple !isFilled -> colors.Grey02 else -> Color.Transparent } @@ -61,10 +60,7 @@ fun OptionChipButton( color = borderColor, shape = RoundedCornerShape(20.dp) ) - .clickable { - isClicked = !isClicked - onClick() - } + .clickable { onClick() } .padding(vertical = 8.dp, horizontal = 12.dp), contentAlignment = Alignment.Center, ) { diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt index 6422efe0..a550bf65 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt @@ -78,7 +78,7 @@ fun CardItemRoom( Spacer(modifier = Modifier.width(16.dp)) Column( - modifier = Modifier.weight(1f) + modifier = Modifier.fillMaxWidth() ) { Spacer(modifier = Modifier.height(16.dp)) Text( @@ -126,7 +126,7 @@ fun CardItemRoom( fun CardItemRoomPreview() { Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { CardItemRoom( - title = "모임방 이름입니다. 모임방...", + title = "모임방 이름입니다. 모임방 이름입니다.", participants = 22, maxParticipants = 30, isRecruiting = true, @@ -134,7 +134,7 @@ fun CardItemRoomPreview() { imageRes = R.drawable.bookcover_sample ) CardItemRoom( - title = "모임방 이름입니다. 모임방...", + title = "모임방 이름입니다. 모임방 이름입니다.", participants = 22, maxParticipants = 30, isRecruiting = false, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt new file mode 100644 index 00000000..ee0bdc2d --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt @@ -0,0 +1,13 @@ +package com.texthip.thip.ui.myPage.myGroup + +import com.texthip.thip.R + +data class CardItemRoomData( + val title: String, + val participants: Int, + val maxParticipants: Int, + val isRecruiting: Boolean, + val endDate: Int, // 남은 일 수 + val imageRes: Int? = R.drawable.bookcover_sample +) + diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt new file mode 100644 index 00000000..99ecec88 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt @@ -0,0 +1,32 @@ +package com.texthip.thip.ui.myPage.myGroup + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.buttons.OptionChipButton + +@Composable +fun FilterRow( + selectedIndex: Int, + onSelect: (Int) -> Unit +) { + Row( + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + OptionChipButton( + text = stringResource(R.string.onGoing), + isFilled = true, + isSelected = selectedIndex == 0, + onClick = { onSelect(0) } + ) + OptionChipButton( + text = stringResource(R.string.recruiting), + isFilled = true, + isSelected = selectedIndex == 1, + onClick = { onSelect(1) } + ) + } +} diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupListFilterScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupListFilterScreen.kt new file mode 100644 index 00000000..61c36caf --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupListFilterScreen.kt @@ -0,0 +1,190 @@ +package com.texthip.thip.ui.myPage.myGroup + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.common.cards.CardItemRoom +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row +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.layout.width +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography +import androidx.compose.foundation.lazy.items + +@Composable +fun MyGroupListFilterScreen( + allDataList: List, + onCardClick: (CardItemRoomData) -> Unit = {} +) { + var selectedIndex by remember { mutableStateOf(0) } + + // 필터링 + val filteredList = remember(selectedIndex, allDataList) { + if (selectedIndex == 0) { + allDataList.filter { !it.isRecruiting } + } else { + allDataList.filter { it.isRecruiting } + } + } + + Column( + Modifier + .background(colors.Black) + .fillMaxSize() + .padding(horizontal = 20.dp) + ) { + Spacer(modifier = Modifier.height(16.dp)) + // 상단 타이틀 + Row( + Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_arrow_back), + contentDescription = null, + tint = colors.White + ) + Spacer(modifier = Modifier.width(95.dp)) + Text( + text = stringResource(R.string.myGroupRoom), + color = colors.White, + style = typography.bigtitle_b700_s22_h24 + ) + } + Spacer(modifier = Modifier.height(20.dp)) + + FilterRow(selectedIndex = selectedIndex, onSelect = { selectedIndex = it }) + + Spacer(modifier = Modifier.height(20.dp)) + + // 리스트 + LazyColumn( + verticalArrangement = Arrangement.spacedBy(20.dp), + modifier = Modifier.fillMaxSize() + ) { + items(filteredList) { item -> + CardItemRoom( + title = item.title, + participants = item.participants, + maxParticipants = item.maxParticipants, + isRecruiting = item.isRecruiting, + endDate = item.endDate, + imageRes = item.imageRes, + onClick = { onCardClick(item) } + ) + } + } + } +} + + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 800) +@Composable +fun MyGroupListFilterScreenPreview() { + val dataList = listOf( + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 30 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 1 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 30 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 1 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 30 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 1 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3 + ) + ) + MyGroupListFilterScreen(allDataList = dataList) +} diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt new file mode 100644 index 00000000..1a13a21c --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt @@ -0,0 +1,108 @@ +package com.texthip.thip.ui.myPage.myGroup + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +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.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.cards.CardItemRoom +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography +import androidx.compose.foundation.lazy.items + +@Composable +fun MyGroupListScreen( + dataList: List, + onCardClick: (CardItemRoomData) -> Unit = {} +) { + Column( + Modifier + .background(colors.Black) + .fillMaxSize() + .padding(horizontal = 20.dp) + ) { + Spacer(modifier = Modifier.height(16.dp)) + + // 상단 타이틀 (필요 시 아이콘 등 추가) + Row( + Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_arrow_back), + contentDescription = null, + tint = colors.White + ) + Spacer(modifier = Modifier.width(95.dp)) + Text( + text = stringResource(R.string.myGroupRoom), + color = colors.White, + style = typography.bigtitle_b700_s22_h24 + ) + } + Spacer(modifier = Modifier.height(20.dp)) + + // 리스트 + LazyColumn( + verticalArrangement = Arrangement.spacedBy(20.dp), + modifier = Modifier.fillMaxSize() + ) { + items(dataList) { item -> + CardItemRoom( + title = item.title, + participants = item.participants, + maxParticipants = item.maxParticipants, + isRecruiting = item.isRecruiting, + endDate = item.endDate, + imageRes = item.imageRes, + onClick = { onCardClick(item) } + ) + } + } + } +} + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 800) +@Composable +fun MyGroupListScreenPreview() { + val dataList = mutableListOf( + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 1 + ) + ) + MyGroupListScreen(dataList) +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a85018cb..df679a83 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,4 +44,9 @@ 해당 도서는 %1$dp까지만 있습니다. + + 진행중 + 모집중 + 내 모임방 + \ No newline at end of file From b9478bed327996a7c1c273587aeed6e7e5aedeba Mon Sep 17 00:00:00 2001 From: Gyubin Date: Sat, 28 Jun 2025 01:28:53 +0900 Subject: [PATCH 03/29] =?UTF-8?q?[UI]=20CardItemRoomSmall=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 + .../thip/ui/common/cards/CardItemRoomSmall.kt | 133 ++++++++++++ .../myPage/myGroup/MyGroupListFilterScreen.kt | 190 ------------------ .../thip/ui/myPage/myGroup/MyGroupScreen.kt | 118 +++++++++-- .../java/com/texthip/thip/ui/theme/Color.kt | 3 + .../res/drawable/bookcover_sample_small.png | Bin 0 -> 456 bytes app/src/main/res/values/strings.xml | 6 + gradle/libs.versions.toml | 2 + 8 files changed, 245 insertions(+), 208 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt delete mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupListFilterScreen.kt create mode 100644 app/src/main/res/drawable/bookcover_sample_small.png diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a776656f..82c1f330 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -50,6 +50,7 @@ dependencies { implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) implementation(libs.androidx.navigation.compose) + implementation(libs.androidx.navigation.runtime.android) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt new file mode 100644 index 00000000..eb444d6a --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt @@ -0,0 +1,133 @@ +package com.texthip.thip.ui.common.cards + +import androidx.compose.foundation.Image +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.Spacer +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.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun CardItemRoomSmall( + modifier: Modifier = Modifier, + title: String, + participants: Int, + maxParticipants: Int, + endDate: Int, // 남은 일 수 (예: 3) + imageRes: Int? = R.drawable.bookcover_sample_small, + onClick: () -> Unit = {} +) { + Card( + modifier = modifier + .size(width = 232.dp, height = 104.dp) + .clickable { onClick() }, + colors = CardDefaults.cardColors( + containerColor = colors.DarkGrey50 + ), + elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), + shape = RoundedCornerShape(12.dp) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(12.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth() + ) { + // 이미지 + Box( + modifier = Modifier + .size(width = 60.dp, height = 80.dp) + ) { + imageRes?.let { + Image( + painter = painterResource(id = it), + contentDescription = null, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } + } + + Spacer(modifier = Modifier.width(8.dp)) + + Column( + modifier = Modifier.fillMaxWidth() + ) { + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = title, + color = colors.White, + style = typography.menu_sb600_s14_h24, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(4.dp)) + + Row(verticalAlignment = Alignment.CenterVertically) { + Icon( + modifier = Modifier.size(20.dp), + painter = painterResource(id = R.drawable.ic_group), + contentDescription = "그룹 아이콘", + tint = Color.White + ) + Spacer(modifier = Modifier.width(4.dp)) + + Text ( + text = "$participants / ${maxParticipants}명", + color = colors.White, + style = typography.info_m500_s12 + ) + } + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = "${endDate}일 뒤 모집 마감", + color = colors.Red, + style = typography.menu_sb600_s12_h20 + ) + } + } + } + } +} + + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) +@Composable +fun CardItemRoomSmallPreview() { + Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { + CardItemRoomSmall( + title = "방 제목입니다 방 제목입니다", + participants = 22, + maxParticipants = 30, + endDate = 3, + imageRes = R.drawable.bookcover_sample + ) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupListFilterScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupListFilterScreen.kt deleted file mode 100644 index 61c36caf..00000000 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupListFilterScreen.kt +++ /dev/null @@ -1,190 +0,0 @@ -package com.texthip.thip.ui.myPage.myGroup - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.texthip.thip.ui.common.cards.CardItemRoom -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Row -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.layout.width -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import com.texthip.thip.R -import com.texthip.thip.ui.theme.ThipTheme.colors -import com.texthip.thip.ui.theme.ThipTheme.typography -import androidx.compose.foundation.lazy.items - -@Composable -fun MyGroupListFilterScreen( - allDataList: List, - onCardClick: (CardItemRoomData) -> Unit = {} -) { - var selectedIndex by remember { mutableStateOf(0) } - - // 필터링 - val filteredList = remember(selectedIndex, allDataList) { - if (selectedIndex == 0) { - allDataList.filter { !it.isRecruiting } - } else { - allDataList.filter { it.isRecruiting } - } - } - - Column( - Modifier - .background(colors.Black) - .fillMaxSize() - .padding(horizontal = 20.dp) - ) { - Spacer(modifier = Modifier.height(16.dp)) - // 상단 타이틀 - Row( - Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - Icon( - painter = painterResource(id = R.drawable.ic_arrow_back), - contentDescription = null, - tint = colors.White - ) - Spacer(modifier = Modifier.width(95.dp)) - Text( - text = stringResource(R.string.myGroupRoom), - color = colors.White, - style = typography.bigtitle_b700_s22_h24 - ) - } - Spacer(modifier = Modifier.height(20.dp)) - - FilterRow(selectedIndex = selectedIndex, onSelect = { selectedIndex = it }) - - Spacer(modifier = Modifier.height(20.dp)) - - // 리스트 - LazyColumn( - verticalArrangement = Arrangement.spacedBy(20.dp), - modifier = Modifier.fillMaxSize() - ) { - items(filteredList) { item -> - CardItemRoom( - title = item.title, - participants = item.participants, - maxParticipants = item.maxParticipants, - isRecruiting = item.isRecruiting, - endDate = item.endDate, - imageRes = item.imageRes, - onClick = { onCardClick(item) } - ) - } - } - } -} - - -@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 800) -@Composable -fun MyGroupListFilterScreenPreview() { - val dataList = listOf( - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 30 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 1 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 3 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 30 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 1 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 3 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 30 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 1 - ), - CardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 3 - ) - ) - MyGroupListFilterScreen(allDataList = dataList) -} diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt index 1a13a21c..30457b17 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt @@ -1,36 +1,51 @@ package com.texthip.thip.ui.myPage.myGroup -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.common.cards.CardItemRoom +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row 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.layout.width -import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.Icon import androidx.compose.material3.Text -import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import com.texthip.thip.R -import com.texthip.thip.ui.common.cards.CardItemRoom import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography import androidx.compose.foundation.lazy.items @Composable -fun MyGroupListScreen( - dataList: List, +fun MyGroupScreen( + allDataList: List, onCardClick: (CardItemRoomData) -> Unit = {} ) { + var selectedIndex by remember { mutableStateOf(0) } + + // 필터링 + val filteredList = remember(selectedIndex, allDataList) { + if (selectedIndex == 0) { + allDataList.filter { !it.isRecruiting } + } else { + allDataList.filter { it.isRecruiting } + } + } + Column( Modifier .background(colors.Black) @@ -38,8 +53,7 @@ fun MyGroupListScreen( .padding(horizontal = 20.dp) ) { Spacer(modifier = Modifier.height(16.dp)) - - // 상단 타이틀 (필요 시 아이콘 등 추가) + // 상단 타이틀 Row( Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically @@ -58,12 +72,16 @@ fun MyGroupListScreen( } Spacer(modifier = Modifier.height(20.dp)) + FilterRow(selectedIndex = selectedIndex, onSelect = { selectedIndex = it }) + + Spacer(modifier = Modifier.height(20.dp)) + // 리스트 LazyColumn( verticalArrangement = Arrangement.spacedBy(20.dp), modifier = Modifier.fillMaxSize() ) { - items(dataList) { item -> + items(filteredList) { item -> CardItemRoom( title = item.title, participants = item.participants, @@ -78,10 +96,39 @@ fun MyGroupListScreen( } } + @Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 800) @Composable -fun MyGroupListScreenPreview() { - val dataList = mutableListOf( +fun MyGroupListFilterScreenPreview() { + val dataList = listOf( + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 30 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 1 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3 + ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, @@ -89,6 +136,20 @@ fun MyGroupListScreenPreview() { isRecruiting = true, endDate = 3 ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 30 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 1 + ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, @@ -96,13 +157,34 @@ fun MyGroupListScreenPreview() { isRecruiting = false, endDate = 3 ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 30 + ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = true, endDate = 1 + ), + CardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3 ) ) - MyGroupListScreen(dataList) -} \ No newline at end of file + MyGroupScreen(allDataList = dataList) +} diff --git a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt index 3bbcdba8..10c70c2f 100644 --- a/app/src/main/java/com/texthip/thip/ui/theme/Color.kt +++ b/app/src/main/java/com/texthip/thip/ui/theme/Color.kt @@ -17,6 +17,7 @@ val Mint = Color(0xFFA0F8E8) val MintSub = Color(0xFF4FD9C0) val Orange = Color(0xFFFDB770) val OrangeSub = Color(0xFFFF8B17) +val genreColor = Color(0xFFB5B35D) val Skyblue = Color(0xFFA1D5FF) val SkyblueSub = Color(0xFF6DB5EE) val Lavendar = Color(0xFFC8A5FF) @@ -52,6 +53,7 @@ data class ThipColors( val MintSub: Color, val Orange: Color, val OrangeSub: Color, + val genreColor: Color, val Skyblue: Color, val SkyblueSub: Color, val Lavendar: Color, @@ -84,6 +86,7 @@ val defaultThipColors = ThipColors( MintSub = MintSub, Orange = Orange, OrangeSub = OrangeSub, + genreColor = genreColor, Skyblue = Skyblue, SkyblueSub = SkyblueSub, Lavendar = Lavendar, diff --git a/app/src/main/res/drawable/bookcover_sample_small.png b/app/src/main/res/drawable/bookcover_sample_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a59438f89af63acdce25f89739e57f612a903e04 GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5M}!3HE z9OUlAu&hekDZYu|i}@nSw{Uv`UreR*=~BlsrR9vGk8`e<{#&Xm zUMvw{c#ikQdA|Jxea&a)y3ckho z`Oub2{L5N1Sz|AsNsLlu0rFh}eYh`s+0PJLCR*Za+@3jA0LT||HPrRd{+kdrBkY3d zS(#;_P6oO@-Xcf07_9w5f}v%%&Hjrj&6KfI6@7fI)YM+p{$8}g*~!2tVPNod^>bP0 Hl+XkKmiM}F literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df679a83..1c49d888 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -48,5 +48,11 @@ 진행중 모집중 내 모임방 + 소개글 + 모임 활동 기간 + 참여 중인 독서 메이트 + 이런 모임방은 어때요? + "모집 " + "장르 " \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 261b2b00..1f20de5c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,6 +9,7 @@ lifecycleRuntimeKtx = "2.8.7" activityCompose = "1.10.1" composeBom = "2024.09.00" navigationCompose = "2.9.0" +navigationRuntimeAndroid = "2.9.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -26,6 +27,7 @@ androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-man androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } +androidx-navigation-runtime-android = { group = "androidx.navigation", name = "navigation-runtime-android", version.ref = "navigationRuntimeAndroid" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From f85d22050a51b1b4e6b0ca0853266ecf8fa97c8d Mon Sep 17 00:00:00 2001 From: Gyubin Date: Sat, 28 Jun 2025 01:30:19 +0900 Subject: [PATCH 04/29] =?UTF-8?q?[UI]=20GroupRoomScreen(=EB=AA=A8=EC=9E=84?= =?UTF-8?q?=EB=B0=A9=20=EB=82=B4=EB=B6=80=20=ED=8E=98=EC=9D=B4=EC=A7=80)?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/myPage/groupRoom/BookData.kt | 11 + .../thip/ui/myPage/groupRoom/GroupRoomData.kt | 18 + .../ui/myPage/groupRoom/GroupRoomScreen.kt | 371 ++++++++++++++++++ 3 files changed, 400 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/BookData.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/BookData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/BookData.kt new file mode 100644 index 00000000..01a7ba0d --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/BookData.kt @@ -0,0 +1,11 @@ +package com.texthip.thip.ui.myPage.groupRoom + +import com.texthip.thip.R + +data class BookData( + val title: String, + val author: String, + val publisher: String, + val description: String, + val imageRes: Int = R.drawable.bookcover_sample +) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt new file mode 100644 index 00000000..85540ca0 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt @@ -0,0 +1,18 @@ +package com.texthip.thip.ui.myPage.groupRoom + +import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData + +data class GroupRoomData( + val title: String, + val isSecret: Boolean, + val description: String, + val period: String, + val members: Int, + val maxMembers: Int, + val daysLeft: Int, + val genre: String, + val bookData: BookData, + val recommendations: List +) + +enum class BottomButtonType { JOIN, CANCEL, CLOSE } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt new file mode 100644 index 00000000..d9d9fe9f --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt @@ -0,0 +1,371 @@ +package com.texthip.thip.ui.myPage.groupRoom + +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.Spacer +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.layout.width +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.cards.CardItemRoomSmall +import com.texthip.thip.ui.common.cards.CardRoomBook +import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun GroupRoomScreen( + detail: GroupRoomData, + buttonType: BottomButtonType, + onBottomButtonClick: () -> Unit = {}, + onRecommendationClick: (CardItemRoomData) -> Unit = {} +) { + Box(Modifier.fillMaxSize()) { + Column( + Modifier + .background(colors.Black) + .fillMaxSize() + .padding(start = 20.dp, end = 20.dp, top = 16.dp) + ) { + // TODO: 배경 이미지 추가 + + Icon( + painter = painterResource(id = R.drawable.ic_arrow_back), + contentDescription = "뒤로가기", + tint = colors.White, + modifier = Modifier + .clickable { + // 뒤로가기 동작 구현 + } + ) + Spacer(modifier = Modifier.height(36.dp)) + + //타이틀 + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = detail.title, + style = typography.bigtitle_b700_s22_h24, + color = colors.White + ) + if (detail.isSecret) { + Spacer(Modifier.width(2.dp)) + Icon( + painter = painterResource(id = R.drawable.ic_lock), + contentDescription = "비밀방", + tint = colors.White + ) + } else { + Spacer(Modifier.width(2.dp)) + Icon( + painter = painterResource(id = R.drawable.ic_unlock), + contentDescription = "오픈방", + tint = colors.White + ) + } + } + Spacer(modifier = Modifier.height(32.dp)) + + //소개글 + Text( + text = stringResource(R.string.groupRoomDesc), + style = typography.menu_sb600_s14_h24, + color = colors.White, + ) + + Text( + text = detail.description, + style = typography.copy_r400_s12_h20, + color = colors.Grey, + modifier = Modifier + .padding(top = 4.dp, bottom = 18.dp) + ) + + + Row( + Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + //모집 기간 + Column { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_calendar), + contentDescription = "모임 활동기간", + tint = colors.White + ) + Text( + text = stringResource(R.string.groupPeroid), + style = typography.view_m500_s12_h20, + color = colors.White + ) + } + Spacer(Modifier.height(12.dp)) + Text( + text = detail.period, + style = typography.info_r400_s12, + color = colors.Grey + ) + } + + //참여 인원 + Column { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_group), + contentDescription = "참여 중인 독서 메이트", + tint = colors.White + ) + Text( + text = stringResource(R.string.groupMate), + style = typography.view_m500_s12_h20, + color = colors.White + ) + } + Spacer(Modifier.height(12.dp)) + Text( + text = "${detail.members} / ${detail.maxMembers}", + style = typography.info_r400_s12, + color = colors.White + ) + } + } + + Spacer(Modifier.height(16.dp)) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + // 모집 마감/장르 + Box( + Modifier + .background(colors.Grey03, shape = RoundedCornerShape(14.dp)) + .padding(horizontal = 12.dp, vertical = 8.dp) + ) { + Row { + Text( + text = stringResource(R.string.groupRecruiting), + style = typography.info_m500_s12, + color = colors.White + ) + Text( + text = "${detail.daysLeft}일 남음", + style = typography.info_m500_s12, + color = colors.NeonGreen + ) + } + + } + Spacer(Modifier.width(12.dp)) + Box( + Modifier + .background(colors.Grey03, shape = RoundedCornerShape(14.dp)) + .padding(horizontal = 12.dp, vertical = 8.dp) + ) { + Row { + Text( + text = stringResource(R.string.groupGenre), + style = typography.info_m500_s12, + color = colors.White + ) + Text( + text = detail.genre, + style = typography.info_m500_s12, + color = colors.genreColor + ) + } + + } + } + + Spacer(Modifier.height(62.dp)) + + //읽을 책 정보 + CardRoomBook( + title = detail.bookData.title, + author = detail.bookData.author, + publisher = detail.bookData.publisher, + description = detail.bookData.description, + imageRes = detail.bookData.imageRes + ) + + Spacer(Modifier.height(40.dp)) + Text( + text = stringResource(R.string.groupRecommend), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Spacer(Modifier.height(24.dp)) + + //추천 모임방 + LazyRow( + horizontalArrangement = Arrangement.spacedBy(20.dp) + ) { + items(detail.recommendations) { rec -> + CardItemRoomSmall( + title = rec.title, + participants = rec.participants, + maxParticipants = rec.maxParticipants, + endDate = rec.endDate, + imageRes = rec.imageRes, + onClick = { onRecommendationClick(rec) } + ) + } + } + + Spacer(Modifier.weight(1f)) + } + + // 하단 버튼 + val buttonText = when (buttonType) { + BottomButtonType.JOIN -> "참여하기" + BottomButtonType.CANCEL -> "참여 취소하기" + BottomButtonType.CLOSE -> "모집 마감하기" + } + val buttonColor = when (buttonType) { + BottomButtonType.JOIN -> colors.Purple + BottomButtonType.CANCEL -> colors.Red + BottomButtonType.CLOSE -> colors.Grey02 + } + + Button( + onClick = onBottomButtonClick, + colors = ButtonDefaults.buttonColors( + containerColor = buttonColor + ), + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth() + .height(50.dp), + shape = RoundedCornerShape(0.dp) + ) { + Text( + text = buttonText, + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + } + } +} + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 900) +@Composable +fun GroupRoomDetailScreenPreview_AllCases() { + val recommendations = listOf( + CardItemRoomData( + title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", + participants = 19, + maxParticipants = 25, + isRecruiting = true, + endDate = 2 + ), + CardItemRoomData( + title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", + participants = 12, + maxParticipants = 16, + isRecruiting = true, + endDate = 6 + ), + CardItemRoomData( + title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", + participants = 30, + maxParticipants = 30, + isRecruiting = false, + endDate = 0 + ), + CardItemRoomData( + title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", + participants = 10, + maxParticipants = 12, + isRecruiting = true, + endDate = 8 + ), + CardItemRoomData( + title = "에세이 나눔방", + participants = 14, + maxParticipants = 20, + isRecruiting = true, + endDate = 4 + ) + ) + + val bookData = BookData( + title = "심장보다 단단한 토마토 한 알", + author = "고선지", + publisher = "푸른출판사", + description = "‘시집만 읽는 사람들’ 3월 모임에서 읽는 시집. 상처받고 단단해진 마음을 담은 감동적인 시와 해설이 어우러진 책으로, 읽는 이로 하여금 자신의 이야기를 투영하게 하는 힘이 있다.", + imageRes = R.drawable.bookcover_sample + ) + + val detailJoin = GroupRoomData( + title = "시집만 읽는 사람들 3월", + isSecret = true, + description = "‘시집만 읽는 사람들’ 3월 모임입니다. 이번 달 모임에서는 심장보다 단단한 토마토 한 알을 함께 읽어요.", + period = "2025.01.12 ~ 2025.02.12", + members = 22, + maxMembers = 30, + daysLeft = 4, + genre = "고전 문학", + bookData = bookData, + recommendations = recommendations + ) + val detailCancel = detailJoin.copy( + title = "참여 중인 독서모임", + isSecret = false, + members = 17 + ) + val detailHost = detailJoin.copy( + title = "내가 호스트인 독서모임", + isSecret = false, + members = 30, + maxMembers = 30 + ) + + Column(verticalArrangement = Arrangement.spacedBy(32.dp)) { + // 1. 참여 가능한 경우(참여하기) + GroupRoomScreen( + detail = detailJoin, + buttonType = BottomButtonType.JOIN, + onBottomButtonClick = {} + ) + // 2. 참여 중인 경우(참여 취소하기) + GroupRoomScreen( + detail = detailCancel, + buttonType = BottomButtonType.CANCEL, + onBottomButtonClick = {} + ) + // 3. 내가 호스트인 경우(모집 마감하기) + GroupRoomScreen( + detail = detailHost, + buttonType = BottomButtonType.CLOSE, + onBottomButtonClick = {} + ) + } +} + + From b4ed51a9bc7e357bb2d423cfea643d302f25e38f Mon Sep 17 00:00:00 2001 From: Gyubin Date: Sat, 28 Jun 2025 06:56:55 +0900 Subject: [PATCH 05/29] =?UTF-8?q?[UI]=20GroupRoomScreen(=EB=AA=A8=EC=9E=84?= =?UTF-8?q?=EB=B0=A9=20=ED=8E=98=EC=9D=B4=EC=A7=80)=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20-=201=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/myPage/groupPage/DeadlineRoomData.kt | 8 +++ .../GroupPageScreen.kt} | 9 ++- .../ui/myPage/groupPage/MyGroupCardData.kt | 11 ++++ .../ui/myPage/viewModel/MyPageViewModel.kt | 57 +++++++++++++++++++ .../texthip/thip/ui/navigator/MainNavHost.kt | 4 +- 5 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomData.kt rename app/src/main/java/com/texthip/thip/ui/myPage/{screen/MyPageScreen.kt => groupPage/GroupPageScreen.kt} (63%) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupCardData.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomData.kt new file mode 100644 index 00000000..fef33b3d --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomData.kt @@ -0,0 +1,8 @@ +package com.texthip.thip.ui.myPage.groupPage + +import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData + +data class DeadlineRoomData( + val genre: String, + val rooms: List +) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/screen/MyPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt similarity index 63% rename from app/src/main/java/com/texthip/thip/ui/myPage/screen/MyPageScreen.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt index 9195747e..8407ba6a 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/screen/MyPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.screen +package com.texthip.thip.ui.myPage.groupPage import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize @@ -6,10 +6,15 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController +import com.texthip.thip.ui.myPage.viewModel.MyPageViewModel @Composable -fun MyPageScreen(navController: NavController) { +fun GroupPageScreen( + navController: NavController, + viewModel: MyPageViewModel = viewModel() +) { Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupCardData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupCardData.kt new file mode 100644 index 00000000..98e37e0e --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupCardData.kt @@ -0,0 +1,11 @@ +package com.texthip.thip.ui.myPage.groupPage + +import com.texthip.thip.R + +data class MyGroupCardData( + val title: String, + val members: Int, + val imageRes: Int = R.drawable.bookcover_sample, + val progress: Int, // 진행률 (0~100) + val nickname: String +) \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt b/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt new file mode 100644 index 00000000..026e144a --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt @@ -0,0 +1,57 @@ +package com.texthip.thip.ui.myPage.viewModel + +import androidx.lifecycle.ViewModel +import com.texthip.thip.ui.myPage.groupPage.MyGroupCardData +import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import com.texthip.thip.R + +class MyPageViewModel : ViewModel() { + + private val _myGroups = MutableStateFlow>(emptyList()) + val myGroups: StateFlow> = _myGroups + + private val _deadlineRooms = MutableStateFlow>(emptyList()) + val deadlineRooms: StateFlow> = _deadlineRooms + + private val _genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술") + val genres: List get() = _genres + + private val _selectedGenreIndex = MutableStateFlow(0) + val selectedGenreIndex: StateFlow = _selectedGenreIndex + + // 초기 데이터 세팅 (실제에선 repository/remote에서 받아옴) + init { + _myGroups.value = listOf( + MyGroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1") + ) + _deadlineRooms.value = listOf( + CardItemRoomData("시집만 읽는 사람들 3월", 22, 30, true, 3, R.drawable.bookcover_sample), + CardItemRoomData("일본 소설 좋아하는 사람들", 22, 30, true, 3, R.drawable.bookcover_sample), + CardItemRoomData("명작 같이 읽기방", 22, 30, true, 3, R.drawable.bookcover_sample) + ) + } + + // 선택 장르 변경 + fun selectGenre(index: Int) { + _selectedGenreIndex.value = index + // 필요하면 장르에 따라 _deadlineRooms 필터링도 여기서 처리 + } + + fun onMyGroupHeaderClick() { + // 내 모임방 리스트로 이동 (Nav 이벤트 트리거 등) + } + + fun onMyGroupCardClick(data: MyGroupCardData) { + // 내 모임방 카드 클릭 (상세 진입) + } + + fun onRoomCardClick(data: CardItemRoomData) { + // 마감임박 카드 클릭 (상세 진입) + } + + fun onFabClick() { + // FAB 클릭(모임방 생성 등) + } +} diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt b/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt index 16787c3f..cc690add 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt @@ -7,7 +7,7 @@ import androidx.navigation.NavHostController import com.texthip.thip.ui.bookSearch.screen.BookSearchScreen import com.texthip.thip.ui.feed.screen.FeedScreen import com.texthip.thip.ui.group.screen.GroupScreen -import com.texthip.thip.ui.myPage.screen.MyPageScreen +import com.texthip.thip.ui.myPage.groupPage.GroupPageScreen @Composable fun MainNavHost(navController: NavHostController) { @@ -15,6 +15,6 @@ fun MainNavHost(navController: NavHostController) { composable(Routes.Feed.route) { FeedScreen(navController) } composable(Routes.Group.route) { GroupScreen(navController) } composable(Routes.BookSearch.route) { BookSearchScreen(navController) } - composable(Routes.MyPage.route) { MyPageScreen(navController) } + composable(Routes.MyPage.route) { GroupPageScreen(navController) } } } \ No newline at end of file From 77a563e477415f475ac01c4ffb13b34db7ea2905 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Mon, 30 Jun 2025 16:15:46 +0900 Subject: [PATCH 06/29] =?UTF-8?q?[UI]=20GrpupPageScreen=20=EC=9E=84?= =?UTF-8?q?=EC=8B=9C=20TopBar=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20component=20=EA=B5=AC=ED=98=84=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetSelector.xml | 10 +-- .../thip/ui/myPage/groupPage/MainTopAppBar.kt | 59 ++++++++++++++ .../ui/myPage/groupPage/SearchTextField.kt | 79 +++++++++++++++++++ 3 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index a5f374e9..b268ef36 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -2,16 +2,8 @@ - + diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt new file mode 100644 index 00000000..603c492f --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt @@ -0,0 +1,59 @@ +package com.texthip.thip.ui.myPage.groupPage + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors + +@Composable +fun MainTopAppBar() { + Row( + Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + // 로고 (임시 박스) + + Text("THIP!", color = colors.NeonGreen) + + Spacer(Modifier.weight(1f)) + Icon( + painter = painterResource(id = R.drawable.ic_done), + contentDescription = "다 한거", + tint = colors.White, + modifier = Modifier.size(24.dp) + ) + + Spacer(Modifier.width(12.dp)) + Icon( + painter = painterResource(id = R.drawable.ic_notice), + contentDescription = "알림", + tint = colors.White, + modifier = Modifier.size(24.dp) + ) + } +} + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) +@Composable +fun PreviewMainTopAppBar() { + MainTopAppBar() +} + diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt new file mode 100644 index 00000000..bd1a49ef --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt @@ -0,0 +1,79 @@ +package com.texthip.thip.ui.myPage.groupPage + +import androidx.compose.foundation.layout.Box +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.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun SearchTextField( + onValueChange: (String) -> Unit +) { + var value by rememberSaveable { mutableStateOf("") } + + Box( + Modifier + .padding(horizontal = 20.dp) + .fillMaxWidth() + .height(48.dp) + ) { + OutlinedTextField( + value = value, + onValueChange = onValueChange, + modifier = Modifier + .fillMaxWidth(), + placeholder = { + Text( + text = "모임방 참여할 사람!", + color = colors.Grey02, + style = typography.menu_r400_s14_h24.copy(lineHeight = 2.sp) + ) + }, + singleLine = true, + shape = RoundedCornerShape(12.dp), + colors = TextFieldDefaults.colors( + focusedTextColor = colors.White, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + focusedContainerColor = colors.DarkGrey, + unfocusedContainerColor = colors.DarkGrey, + cursorColor = colors.NeonGreen + ), + trailingIcon = { + Icon( + painter = painterResource(id = R.drawable.ic_search), + contentDescription = "검색", + tint = colors.White, + modifier = Modifier.size(24.dp) + ) + } + ) + } +} + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) +@Composable +fun PreviewSearchTextField() { + SearchTextField(onValueChange = {}) +} + From e33d47170980ec9d97247eff9bcdb1ce7b103e65 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Mon, 30 Jun 2025 16:17:49 +0900 Subject: [PATCH 07/29] =?UTF-8?q?[UI]=20=EB=82=B4=20=EB=AA=A8=EC=9E=84?= =?UTF-8?q?=EB=B0=A9=20=ED=8E=98=EC=9D=B4=EC=A7=80,=20=EC=9E=A5=EB=A5=B4?= =?UTF-8?q?=20=EC=B9=A9=20=EB=B2=84=ED=8A=BC=20=EA=B5=AC=ED=98=84=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 5 + .../thip/ui/myPage/groupPage/GenreChipRow.kt | 42 +++++ .../ui/myPage/groupPage/MainSectionHeader.kt | 45 +++++ .../ui/myPage/groupPage/MyGroupMainCard.kt | 160 ++++++++++++++++++ .../thip/ui/myPage/groupPage/MyGroupPager.kt | 102 +++++++++++ .../myPage/groupPage/SimplePagerIndicator.kt | 39 +++++ 6 files changed, 393 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 82c1f330..9bd47908 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,5 @@ +import org.gradle.kotlin.dsl.implementation + plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) @@ -58,4 +60,7 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) + implementation ("com.google.accompanist:accompanist-pager:0.35.0-alpha") + implementation ("com.google.accompanist:accompanist-pager-indicators:0.35.0-alpha") + } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt new file mode 100644 index 00000000..1eee9326 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt @@ -0,0 +1,42 @@ +package com.texthip.thip.ui.myPage.groupPage + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.common.buttons.OptionChipButton + +@Composable +fun GenreChipRow( + genres: List, + selectedIndex: Int, + onSelect: (Int) -> Unit +) { + Row( + Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceEvenly + ) { + genres.forEachIndexed { idx, genre -> + OptionChipButton( + text = genre, + isFilled = true, + isSelected = selectedIndex == idx, + onClick = { onSelect(idx) } + ) + } + } +} + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) +@Composable +fun PreviewGenreChipRow() { + GenreChipRow( + genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술"), + selectedIndex = 0, + onSelect = {} + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt new file mode 100644 index 00000000..9c04d350 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt @@ -0,0 +1,45 @@ +package com.texthip.thip.ui.myPage.groupPage + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun MainSectionHeader(title: String, onClick: (() -> Unit)? = null) { + Row( + Modifier + .fillMaxWidth() + .clickable(enabled = onClick != null) { onClick?.invoke() } + .padding(horizontal = 20.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text(title, style = typography.title_b700_s20_h24, color = colors.White) + Spacer(Modifier.weight(1f)) + if (onClick != null) { + Icon( + painter = painterResource(id = R.drawable.ic_chevron_right), + contentDescription = null, + tint = colors.White + ) + } + } +} + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) +@Composable +fun PreviewMainSectionHeader() { + MainSectionHeader(title = "내 모임방", onClick = {}) +} diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt new file mode 100644 index 00000000..3508694f --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt @@ -0,0 +1,160 @@ +package com.texthip.thip.ui.myPage.groupPage + +import android.R.attr.data +import android.R.attr.onClick +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawWithCache +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.texthip.thip.R +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 MyGroupMainCard( + data: MyGroupCardData, + backgroundColor: Color = Color.White, + onClick: () -> Unit = {} +) { + // 그라데이션 + val gradient = Brush.linearGradient( + colors = listOf( + colors.White, + colors.Grey01 + ), + start = Offset(0f, 0f), + end = Offset(1000f, 1000f) + ) + + val progressState by remember { + mutableFloatStateOf(data.progress / 100f) + } + + Card( + modifier = Modifier + .width(320.dp) + .height(176.dp) + .clickable { onClick() }, + shape = RoundedCornerShape(18.dp), + colors = CardDefaults.cardColors(containerColor = backgroundColor), + elevation = CardDefaults.cardElevation(defaultElevation = 0.dp) + ) { + Box( + Modifier + .fillMaxSize() + .background(brush = gradient) + ) { + Row( + modifier = Modifier + .fillMaxSize() + .padding(start = 12.dp, end = 12.dp, top = 34.dp, bottom = 34.dp), + verticalAlignment = Alignment.CenterVertically + ) { + // 책 이미지 + Image( + painter = painterResource(id = data.imageRes), + contentDescription = "책 이미지", + modifier = Modifier + .size(width = 80.dp, height = 107.dp) + ) + Spacer(Modifier.width(12.dp)) + + Column( + verticalArrangement = Arrangement.Center + ) { + Spacer(Modifier.height(2.dp)) + // 제목 + Text( + text = data.title, + style = typography.smalltitle_sb600_s18_h24, + color = colors.Black, + maxLines = 1 + ) + Spacer(Modifier.height(4.dp)) + // 인원 + Row(verticalAlignment = Alignment.CenterVertically) { + Image( + painter = painterResource(id = R.drawable.ic_group), + contentDescription = null, + modifier = Modifier.size(20.dp) + ) + Spacer(Modifier.width(2.dp)) + Text( + text = "${data.members}명 참여", + color = colors.Grey02, + style = typography.menu_sb600_s12, + ) + } + Spacer(Modifier.height(16.dp)) + // 닉네임 + 진행도 + Row(verticalAlignment = Alignment.Bottom) { + Text( + text = "${data.nickname}의 진행도 ", + color = colors.Grey02, + style = typography.view_m500_s14 + ) + Text( + text = "${data.progress}%", + color = colors.Purple, + style = typography.view_m500_s14, + ) + } + Spacer(Modifier.height(10.dp)) + // ProgressBar + LinearProgressIndicator( + progress = { progressState }, + modifier = Modifier + .fillMaxWidth() + .height(7.dp), + color = colors.Purple, + trackColor = colors.Grey02, + gapSize = (-5).dp // 간격 제거 + ) + Spacer(Modifier.height(2.dp)) + } + } + } + } +} + + +@Preview(showBackground = true, backgroundColor = 0xFF222222, widthDp = 380, heightDp = 170) +@Composable +fun PreviewMyGroupMainCard() { + MyGroupMainCard( + data = MyGroupCardData( + title = "호르몬 체인지 완독하는 방", + members = 22, + imageRes = R.drawable.bookcover_sample, + progress = 42, + nickname = "uibowl님의" + ), + onClick = {} + ) +} diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt new file mode 100644 index 00000000..8cc88268 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt @@ -0,0 +1,102 @@ +package com.texthip.thip.ui.myPage.groupPage + +import android.R.attr.scaleX +import android.R.attr.scaleY +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.Alignment +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.tooling.preview.Preview +import com.texthip.thip.ui.theme.ThipTheme.colors + +@Composable +fun MyGroupPager( + groupCards: List, + onCardClick: (MyGroupCardData) -> Unit +) { + // Pager 상태 + val pagerState = rememberPagerState( + initialPage = 0, + pageCount = { groupCards.size } + ) + + Box( + modifier = Modifier + .fillMaxWidth() + .height(208.dp), + contentAlignment = Alignment.Center + ) { + HorizontalPager( + state = pagerState, + contentPadding = PaddingValues(horizontal = 20.dp), // peek 공간 + pageSpacing = (-10).dp, + modifier = Modifier.fillMaxWidth() + ) { page -> + + // 페이지와 현재페이지의 거리(0이면 중앙, 1/-1이면 peek) + val distanceFromCenter = (pagerState.currentPage - page).toFloat() + // scale 계산 (중앙은 1f, peek은 0.93~0.97f) + val scale = if (pagerState.currentPage == page) 1f else 0.86f + // 색상 변경 (peek이면 밝은 회색, 중앙이면 흰색) + val bgColor = if (pagerState.currentPage == page) colors.White else colors.DarkGrey + // alpha(살짝 흐리게)도 가능 + + Box( + modifier = Modifier + .graphicsLayer { + scaleX = scale + scaleY = scale + alpha = if (pagerState.currentPage == page) 1f else 0.7f + } + ) { + MyGroupMainCard( + data = groupCards[page], + onClick = { onCardClick(groupCards[page]) }, + backgroundColor = bgColor // Card에서 배경색 파라미터 추가 + ) + } + } + // 아래 Indicator + SimplePagerIndicator( + pageCount = groupCards.size, + currentPage = pagerState.currentPage, + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(top = 12.dp) + ) + } +} + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 220) +@Composable +fun PreviewMyGroupPager() { + val list = listOf( + MyGroupCardData( + title = "호르몬 체인지 완독하는 방", + members = 22, + imageRes = com.texthip.thip.R.drawable.bookcover_sample, + progress = 40, + nickname = "uibowl1님" + ), + MyGroupCardData( + title = "명작 읽기방", + members = 10, + imageRes = com.texthip.thip.R.drawable.bookcover_sample, + progress = 70, + nickname = "joyce님" + ), + MyGroupCardData( + title = "또 다른 방", + members = 13, + imageRes = com.texthip.thip.R.drawable.bookcover_sample, + progress = 10, + nickname = "other님" + ) + ) + MyGroupPager(groupCards = list, onCardClick = {}) +} + diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt new file mode 100644 index 00000000..b16da771 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt @@ -0,0 +1,39 @@ +package com.texthip.thip.ui.myPage.groupPage + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.theme.ThipTheme.colors + +@Composable +fun SimplePagerIndicator( + pageCount: Int, + currentPage: Int, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + repeat(pageCount) { index -> + Box( + modifier = Modifier + .padding(horizontal = 6.dp) + .size(4.dp) + .background( + color = if (currentPage == index) colors.White else colors.Grey02, + shape = RoundedCornerShape(50) + ) + ) + } + } +} \ No newline at end of file From ce38896cacc27733d8f428af2bc5f8dad041511e Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Mon, 30 Jun 2025 16:18:15 +0900 Subject: [PATCH 08/29] =?UTF-8?q?[UI]=20=EB=A7=88=EA=B0=90=20=EC=9E=84?= =?UTF-8?q?=EB=B0=95=ED=95=9C=20=EB=8F=85=EC=84=9C=20=EB=AA=A8=EC=9E=84?= =?UTF-8?q?=EB=B0=A9=20=EA=B5=AC=ED=98=84=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/cards/CardItemRoom.kt | 32 ++- .../myPage/groupPage/DeadlineRoomSection.kt | 187 ++++++++++++++++++ .../ui/myPage/groupRoom/GroupRoomScreen.kt | 15 +- .../ui/myPage/myGroup/CardItemRoomData.kt | 4 +- .../thip/ui/myPage/myGroup/MyGroupScreen.kt | 36 ++-- .../ui/myPage/viewModel/MyPageViewModel.kt | 14 +- 6 files changed, 266 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt index a550bf65..053a1df4 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt @@ -1,6 +1,7 @@ package com.texthip.thip.ui.common.cards import androidx.compose.foundation.Image +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -40,16 +41,26 @@ fun CardItemRoom( isRecruiting: Boolean, endDate: Int, // 남은 일 수 (예: 3) imageRes: Int? = R.drawable.bookcover_sample, + hasBorder: Boolean = false, // <-- 추가 onClick: () -> Unit = {} ) { Card( modifier = modifier .fillMaxWidth() + .then( + if (hasBorder) + Modifier + .border( + width = 1.dp, + color = colors.Grey02, + shape = RoundedCornerShape(12.dp) + ) + else Modifier + ) .clickable { onClick() }, colors = CardDefaults.cardColors( containerColor = colors.DarkGrey50 ), - elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), shape = RoundedCornerShape(12.dp) ) { Column( @@ -121,6 +132,7 @@ fun CardItemRoom( } + @Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) @Composable fun CardItemRoomPreview() { @@ -141,5 +153,23 @@ fun CardItemRoomPreview() { endDate = 3, imageRes = R.drawable.bookcover_sample ) + CardItemRoom( + title = "모임방 이름입니다. 모임방 이름입니다.", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + imageRes = R.drawable.bookcover_sample, + hasBorder = true + ) + CardItemRoom( + title = "모임방 이름입니다. 모임방 이름입니다.", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3, + imageRes = R.drawable.bookcover_sample, + hasBorder = true + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt new file mode 100644 index 00000000..a4988612 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt @@ -0,0 +1,187 @@ +package com.texthip.thip.ui.myPage.groupPage + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.common.cards.CardItemRoom +import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun DeadlineRoomSection( + rooms: List, + selectedGenre: Int, + onRoomClick: (CardItemRoomData) -> Unit, + genres: List, + onGenreSelect: (Int) -> Unit +) { + val pagerState = rememberPagerState(initialPage = selectedGenre, pageCount = { genres.size }) + + // pager <-> chip 연동 + LaunchedEffect(pagerState.currentPage) { + if (selectedGenre != pagerState.currentPage) { + onGenreSelect(pagerState.currentPage) + } + } + LaunchedEffect(selectedGenre) { + if (pagerState.currentPage != selectedGenre) { + pagerState.scrollToPage(selectedGenre) + } + } + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp) + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .background( + brush = Brush.verticalGradient( + colors = listOf(colors.Grey03, colors.DarkGrey, colors.Black) + ), + shape = RoundedCornerShape(14.dp) + ) + .padding(vertical = 20.dp, horizontal = 12.dp) + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = "마감 임박한 독서 모임방", + style = typography.title_b700_s20_h24, + color = colors.White + ) + Spacer(Modifier.height(40.dp)) + GenreChipRow( + genres = genres, + selectedIndex = selectedGenre, + onSelect = { idx -> onGenreSelect(idx) } + ) + Spacer(Modifier.height(20.dp)) + + HorizontalPager( + state = pagerState, + modifier = Modifier + .fillMaxWidth() + .height(434.dp), + pageSpacing = 20.dp // 각 페이지(장르) 사이의 간격! + ) { page -> + // page == genreIndex + val cards = rooms.filter { it.genreIndex == page }.take(3) + Column( + verticalArrangement = Arrangement.spacedBy(20.dp), + modifier = Modifier.fillMaxWidth() + ) { + cards.forEach { room -> + CardItemRoom( + title = room.title, + participants = room.participants, + maxParticipants = room.maxParticipants, + isRecruiting = room.isRecruiting, + endDate = room.endDate, + imageRes = room.imageRes, + onClick = { onRoomClick(room) }, + hasBorder = true, // 카드에 테두리 추가 + ) + } + // 카드가 3개보다 적을 때 Spacer를 아래에 추가 + if (cards.size < 3) { + Spacer( + modifier = Modifier + .weight(1f, fill = true) + .fillMaxWidth() + ) + } + } + } + // 아래 인디케이터 (장르 개수만큼) + SimplePagerIndicator( + pageCount = genres.size, + currentPage = pagerState.currentPage, + modifier = Modifier + .padding(top = 28.dp) + ) + } + } + } +} + + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 720) +@Composable +fun PreviewDeadlineRoomSection() { + val genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술") + val rooms = listOf( + CardItemRoomData( + title = "시집만 읽는 사람들 3월", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + genreIndex = 0 + ), + CardItemRoomData( + title = "일본 소설 좋아하는 사람들", + participants = 15, + maxParticipants = 20, + isRecruiting = true, + endDate = 2, + genreIndex = 0 + ), + CardItemRoomData( + title = "명작 같이 읽기방", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + genreIndex = 0 + ), + CardItemRoomData( + title = "물리책 읽는 방", + participants = 13, + maxParticipants = 20, + isRecruiting = true, + endDate = 1, + genreIndex = 1 + ), + CardItemRoomData( + title = "코딩 과학 동아리", + participants = 12, + maxParticipants = 15, + isRecruiting = true, + endDate = 5, + genreIndex = 1 + ), + CardItemRoomData( + title = "사회과학 인문 탐구", + participants = 8, + maxParticipants = 12, + isRecruiting = true, + endDate = 4, + genreIndex = 2 + ), + ) + var selectedGenre by remember { mutableStateOf(0) } + DeadlineRoomSection( + rooms = rooms, + selectedGenre = selectedGenre, + onRoomClick = {}, + genres = genres, + onGenreSelect = { selectedGenre = it } + ) +} + diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt index d9d9fe9f..0f6a4aac 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt @@ -282,35 +282,40 @@ fun GroupRoomDetailScreenPreview_AllCases() { participants = 19, maxParticipants = 25, isRecruiting = true, - endDate = 2 + endDate = 2, + genreIndex = 0 ), CardItemRoomData( title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", participants = 12, maxParticipants = 16, isRecruiting = true, - endDate = 6 + endDate = 6, + genreIndex = 0 ), CardItemRoomData( title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", participants = 30, maxParticipants = 30, isRecruiting = false, - endDate = 0 + endDate = 0, + genreIndex = 0 ), CardItemRoomData( title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", participants = 10, maxParticipants = 12, isRecruiting = true, - endDate = 8 + endDate = 8, + genreIndex = 0 ), CardItemRoomData( title = "에세이 나눔방", participants = 14, maxParticipants = 20, isRecruiting = true, - endDate = 4 + endDate = 4, + genreIndex = 0 ) ) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt index ee0bdc2d..e91bbfd2 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt @@ -8,6 +8,8 @@ data class CardItemRoomData( val maxParticipants: Int, val isRecruiting: Boolean, val endDate: Int, // 남은 일 수 - val imageRes: Int? = R.drawable.bookcover_sample + val imageRes: Int? = R.drawable.bookcover_sample, + val genreIndex: Int // 장르 인덱스 ) + diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt index 30457b17..575a37f7 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt @@ -106,84 +106,96 @@ fun MyGroupListFilterScreenPreview() { participants = 22, maxParticipants = 30, isRecruiting = true, - endDate = 3 + endDate = 3, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = false, - endDate = 30 + endDate = 30, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = true, - endDate = 1 + endDate = 1, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = false, - endDate = 3 + endDate = 3, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = true, - endDate = 3 + endDate = 3, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = false, - endDate = 30 + endDate = 30, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = true, - endDate = 1 + endDate = 1, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = false, - endDate = 3 + endDate = 3, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = true, - endDate = 3 + endDate = 3, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = false, - endDate = 30 + endDate = 30, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = true, - endDate = 1 + endDate = 1, + genreIndex = 0 ), CardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, isRecruiting = false, - endDate = 3 + endDate = 3, + genreIndex = 0 ) ) MyGroupScreen(allDataList = dataList) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt b/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt index 026e144a..10b6726d 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt @@ -24,13 +24,21 @@ class MyPageViewModel : ViewModel() { // 초기 데이터 세팅 (실제에선 repository/remote에서 받아옴) init { _myGroups.value = listOf( + MyGroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1"), + MyGroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1"), MyGroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1") ) _deadlineRooms.value = listOf( - CardItemRoomData("시집만 읽는 사람들 3월", 22, 30, true, 3, R.drawable.bookcover_sample), - CardItemRoomData("일본 소설 좋아하는 사람들", 22, 30, true, 3, R.drawable.bookcover_sample), - CardItemRoomData("명작 같이 읽기방", 22, 30, true, 3, R.drawable.bookcover_sample) + CardItemRoomData("시집만 읽는 사람들 3월", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 + CardItemRoomData("일본 소설 좋아하는 사람들", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 + CardItemRoomData("명작 같이 읽기방", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 + + CardItemRoomData("물리책 읽는 방", 13, 20, true, 1, R.drawable.bookcover_sample, 1), // 과학·IT + CardItemRoomData("코딩 과학 동아리", 12, 15, true, 5, R.drawable.bookcover_sample, 1), // 과학·IT + + CardItemRoomData("사회과학 인문 탐구", 8, 12, true, 4, R.drawable.bookcover_sample, 2), // 사회과학 ) + } // 선택 장르 변경 From 67d9bc13dcdc62e679eca4367702886b94985170 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Mon, 30 Jun 2025 16:18:42 +0900 Subject: [PATCH 09/29] =?UTF-8?q?[UI]=20=EB=84=A4=EB=B9=84=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EB=AA=A8=EC=9E=84=EC=97=90=20=ED=95=B4?= =?UTF-8?q?=EB=8B=B9=ED=95=98=EB=8A=94=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/myPage/groupPage/GroupPageScreen.kt | 99 +++++++++++++++++-- 1 file changed, 91 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt index 8407ba6a..93703970 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt @@ -1,24 +1,107 @@ package com.texthip.thip.ui.myPage.groupPage +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.Text +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.runtime.Composable -import androidx.compose.ui.Alignment +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import androidx.navigation.NavController +import androidx.navigation.NavHostController +import com.texthip.thip.ui.common.buttons.FloatingButton import com.texthip.thip.ui.myPage.viewModel.MyPageViewModel +import com.texthip.thip.ui.theme.ThipTheme.colors + @Composable fun GroupPageScreen( - navController: NavController, + navController: NavHostController? = null, viewModel: MyPageViewModel = viewModel() ) { + val myGroups by viewModel.myGroups.collectAsState() + val deadlineRooms by viewModel.deadlineRooms.collectAsState() + val selectedGenre by viewModel.selectedGenreIndex.collectAsState() + val genres = viewModel.genres + Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center + Modifier + .background(colors.Black) + .fillMaxSize() ) { - Text(text = "MyPage Screen") + LazyColumn( + Modifier + .fillMaxSize() + .padding(bottom = 32.dp), // FAB 공간 확보 + verticalArrangement = Arrangement.spacedBy(0.dp) + ) { + // 1. 상단바 + item { + MainTopAppBar() + Spacer(Modifier.height(16.dp)) + } + // 2. 검색창 + item { + SearchTextField(onValueChange = { }) + Spacer(Modifier.height(32.dp)) + } + // 3. 내 모임방 헤더 + 카드 + item { + MainSectionHeader( + title = "내 모임방", + onClick = { viewModel.onMyGroupHeaderClick() } + ) + Spacer(Modifier.height(20.dp)) + + MyGroupPager( + groupCards = myGroups, + onCardClick = { viewModel.onMyGroupCardClick(it) } + ) + Spacer(Modifier.height(40.dp)) + } + item { + Spacer( + Modifier + .height(10.dp) + .fillMaxWidth() + .background(color = colors.DarkGrey02) + ) + Spacer(Modifier.height(32.dp)) + } + // 4. 마감 임박한 독서 모임방 + item { + DeadlineRoomSection( + rooms = deadlineRooms, + selectedGenre = selectedGenre, + onRoomClick = { viewModel.onRoomCardClick(it) }, + genres = genres, + onGenreSelect = { viewModel.selectGenre(it) } + ) + } + } + // 오른쪽 하단 FAB (항상 화면 하단에 고정) + FloatingButton( + icon = painterResource(id = com.texthip.thip.R.drawable.ic_makegroup), + onClick = { viewModel.onFabClick() } + ) } -} \ No newline at end of file +} + + +@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 900) +@Composable +fun PreviewMainGroupScreen() { + val previewViewModel = remember { MyPageViewModel() } + GroupPageScreen(viewModel = previewViewModel) +} + From fc316b81bd9486e47bc4afeb220c45c3c42902fc Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Mon, 30 Jun 2025 16:24:05 +0900 Subject: [PATCH 10/29] =?UTF-8?q?[UI]=20import=20=EC=B5=9C=EC=A0=81?= =?UTF-8?q?=ED=99=94,=20stringResource=20=EC=B6=94=EC=B6=9C=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../myPage/groupPage/DeadlineRoomSection.kt | 20 ++++++++++--- .../thip/ui/myPage/groupPage/GenreChipRow.kt | 2 -- .../ui/myPage/groupPage/GroupPageScreen.kt | 11 ++++---- .../ui/myPage/groupPage/MainSectionHeader.kt | 11 ++++++-- .../thip/ui/myPage/groupPage/MainTopAppBar.kt | 6 +--- .../ui/myPage/groupPage/MyGroupMainCard.kt | 28 +++++++++---------- .../thip/ui/myPage/groupPage/MyGroupPager.kt | 14 ++++++---- .../ui/myPage/groupPage/SearchTextField.kt | 3 +- app/src/main/res/values/strings.xml | 5 ++++ 9 files changed, 59 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt index a4988612..81106adb 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt @@ -1,18 +1,30 @@ package com.texthip.thip.ui.myPage.groupPage import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color +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.cards.CardItemRoom import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData import com.texthip.thip.ui.theme.ThipTheme.colors @@ -61,7 +73,7 @@ fun DeadlineRoomSection( horizontalAlignment = Alignment.CenterHorizontally ) { Text( - text = "마감 임박한 독서 모임방", + text = stringResource(R.string.deadlineString), style = typography.title_b700_s20_h24, color = colors.White ) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt index 1eee9326..4ddf3292 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt @@ -3,11 +3,9 @@ package com.texthip.thip.ui.myPage.groupPage import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import com.texthip.thip.ui.common.buttons.OptionChipButton @Composable diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt index 93703970..6198c9d8 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt @@ -45,20 +45,19 @@ fun GroupPageScreen( .padding(bottom = 32.dp), // FAB 공간 확보 verticalArrangement = Arrangement.spacedBy(0.dp) ) { - // 1. 상단바 + // 상단바 item { MainTopAppBar() Spacer(Modifier.height(16.dp)) } - // 2. 검색창 + // 검색창 item { SearchTextField(onValueChange = { }) Spacer(Modifier.height(32.dp)) } - // 3. 내 모임방 헤더 + 카드 + // 내 모임방 헤더 + 카드 item { MainSectionHeader( - title = "내 모임방", onClick = { viewModel.onMyGroupHeaderClick() } ) Spacer(Modifier.height(20.dp)) @@ -78,7 +77,7 @@ fun GroupPageScreen( ) Spacer(Modifier.height(32.dp)) } - // 4. 마감 임박한 독서 모임방 + // 마감 임박한 독서 모임방 item { DeadlineRoomSection( rooms = deadlineRooms, @@ -89,7 +88,7 @@ fun GroupPageScreen( ) } } - // 오른쪽 하단 FAB (항상 화면 하단에 고정) + // 오른쪽 하단 FAB FloatingButton( icon = painterResource(id = com.texthip.thip.R.drawable.ic_makegroup), onClick = { viewModel.onFabClick() } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt index 9c04d350..8dca9de0 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R @@ -18,7 +19,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun MainSectionHeader(title: String, onClick: (() -> Unit)? = null) { +fun MainSectionHeader(onClick: (() -> Unit)? = null) { Row( Modifier .fillMaxWidth() @@ -26,7 +27,11 @@ fun MainSectionHeader(title: String, onClick: (() -> Unit)? = null) { .padding(horizontal = 20.dp), verticalAlignment = Alignment.CenterVertically ) { - Text(title, style = typography.title_b700_s20_h24, color = colors.White) + Text( + text = stringResource(R.string.myGroup), + style = typography.title_b700_s20_h24, + color = colors.White + ) Spacer(Modifier.weight(1f)) if (onClick != null) { Icon( @@ -41,5 +46,5 @@ fun MainSectionHeader(title: String, onClick: (() -> Unit)? = null) { @Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) @Composable fun PreviewMainSectionHeader() { - MainSectionHeader(title = "내 모임방", onClick = {}) + MainSectionHeader(){} } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt index 603c492f..a11d2e9f 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt @@ -1,15 +1,11 @@ package com.texthip.thip.ui.myPage.groupPage -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -29,7 +25,7 @@ fun MainTopAppBar() { .padding(horizontal = 16.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically ) { - // 로고 (임시 박스) + // 로고 (임시) Text("THIP!", color = colors.NeonGreen) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt index 3508694f..4d5aa014 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt @@ -1,11 +1,19 @@ package com.texthip.thip.ui.myPage.groupPage -import android.R.attr.data -import android.R.attr.onClick import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* +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.Spacer +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.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults @@ -14,25 +22,17 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.drawWithCache import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.buildAnnotatedString -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.withStyle +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import com.texthip.thip.R -import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -106,7 +106,7 @@ fun MyGroupMainCard( ) Spacer(Modifier.width(2.dp)) Text( - text = "${data.members}명 참여", + text = stringResource(R.string.groupParticipant, data.members), color = colors.Grey02, style = typography.menu_sb600_s12, ) @@ -115,7 +115,7 @@ fun MyGroupMainCard( // 닉네임 + 진행도 Row(verticalAlignment = Alignment.Bottom) { Text( - text = "${data.nickname}의 진행도 ", + text = stringResource(R.string.groupProgress, data.nickname), color = colors.Grey02, style = typography.view_m500_s14 ) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt index 8cc88268..45844122 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt @@ -1,16 +1,18 @@ package com.texthip.thip.ui.myPage.groupPage -import android.R.attr.scaleX -import android.R.attr.scaleY -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.runtime.* -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp +import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import com.texthip.thip.ui.theme.ThipTheme.colors @Composable diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt index bd1a49ef..bc5b8fe7 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -44,7 +45,7 @@ fun SearchTextField( .fillMaxWidth(), placeholder = { Text( - text = "모임방 참여할 사람!", + text = stringResource(R.string.groupSearchPlaceHolder), color = colors.Grey02, style = typography.menu_r400_s14_h24.copy(lineHeight = 2.sp) ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1c49d888..791b691a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -54,5 +54,10 @@ 이런 모임방은 어때요? "모집 " "장르 " + 마감 임박한 독서 모임방 + 내 모임방 + %1$s명 참여 + "%1$s의 진행도 " + 모임방 참여할 사람! \ No newline at end of file From 717d13cddcd738540abdf7f821a60b47ea4ffece Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Mon, 30 Jun 2025 16:47:37 +0900 Subject: [PATCH 11/29] =?UTF-8?q?[UI]=20TopAppBar=20=EC=88=98=EC=A0=95=20(?= =?UTF-8?q?#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/myPage/groupPage/GroupPageScreen.kt | 9 +- .../thip/ui/myPage/groupPage/MainTopAppBar.kt | 55 --- .../ui/myPage/groupRoom/GroupRoomScreen.kt | 335 +++++++++--------- .../thip/ui/myPage/myGroup/MyGroupScreen.kt | 66 ++-- 4 files changed, 204 insertions(+), 261 deletions(-) delete mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt index 6198c9d8..fb59a1f0 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt @@ -19,7 +19,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavHostController +import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.FloatingButton +import com.texthip.thip.ui.common.topappbar.LogoTopAppBar import com.texthip.thip.ui.myPage.viewModel.MyPageViewModel import com.texthip.thip.ui.theme.ThipTheme.colors @@ -47,7 +49,12 @@ fun GroupPageScreen( ) { // 상단바 item { - MainTopAppBar() + LogoTopAppBar( + leftIcon = painterResource(R.drawable.ic_done), + hasNotification = false, + onLeftClick = { }, + onRightClick = { } + ) Spacer(Modifier.height(16.dp)) } // 검색창 diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt deleted file mode 100644 index a11d2e9f..00000000 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainTopAppBar.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.texthip.thip.ui.myPage.groupPage - -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.texthip.thip.R -import com.texthip.thip.ui.theme.ThipTheme.colors - -@Composable -fun MainTopAppBar() { - Row( - Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 8.dp), - verticalAlignment = Alignment.CenterVertically - ) { - // 로고 (임시) - - Text("THIP!", color = colors.NeonGreen) - - Spacer(Modifier.weight(1f)) - Icon( - painter = painterResource(id = R.drawable.ic_done), - contentDescription = "다 한거", - tint = colors.White, - modifier = Modifier.size(24.dp) - ) - - Spacer(Modifier.width(12.dp)) - Icon( - painter = painterResource(id = R.drawable.ic_notice), - contentDescription = "알림", - tint = colors.White, - modifier = Modifier.size(24.dp) - ) - } -} - -@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) -@Composable -fun PreviewMainTopAppBar() { - MainTopAppBar() -} - diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt index 0f6a4aac..5a567a77 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.unit.dp import com.texthip.thip.R import com.texthip.thip.ui.common.cards.CardItemRoomSmall import com.texthip.thip.ui.common.cards.CardRoomBook +import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -41,204 +42,202 @@ fun GroupRoomScreen( onRecommendationClick: (CardItemRoomData) -> Unit = {} ) { Box(Modifier.fillMaxSize()) { - Column( - Modifier - .background(colors.Black) - .fillMaxSize() - .padding(start = 20.dp, end = 20.dp, top = 16.dp) - ) { - // TODO: 배경 이미지 추가 - - Icon( - painter = painterResource(id = R.drawable.ic_arrow_back), - contentDescription = "뒤로가기", - tint = colors.White, - modifier = Modifier - .clickable { - // 뒤로가기 동작 구현 - } + Column { + DefaultTopAppBar( + isRightIconVisible = false, + isTitleVisible = false, + onLeftClick = {}, ) - Spacer(modifier = Modifier.height(36.dp)) - //타이틀 - Row( - verticalAlignment = Alignment.CenterVertically + Column( + Modifier + .background(colors.Black) + .fillMaxSize() + .padding(start = 20.dp, end = 20.dp) ) { - Text( - text = detail.title, - style = typography.bigtitle_b700_s22_h24, - color = colors.White - ) - if (detail.isSecret) { - Spacer(Modifier.width(2.dp)) - Icon( - painter = painterResource(id = R.drawable.ic_lock), - contentDescription = "비밀방", - tint = colors.White - ) - } else { - Spacer(Modifier.width(2.dp)) - Icon( - painter = painterResource(id = R.drawable.ic_unlock), - contentDescription = "오픈방", - tint = colors.White - ) - } - } - Spacer(modifier = Modifier.height(32.dp)) + // TODO: 배경 이미지 추가 + Spacer(modifier = Modifier.height(20.dp)) - //소개글 - Text( - text = stringResource(R.string.groupRoomDesc), - style = typography.menu_sb600_s14_h24, - color = colors.White, - ) - - Text( - text = detail.description, - style = typography.copy_r400_s12_h20, - color = colors.Grey, - modifier = Modifier - .padding(top = 4.dp, bottom = 18.dp) - ) - - - Row( - Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - //모집 기간 - Column { - Row( - verticalAlignment = Alignment.CenterVertically - ) { - Icon( - painter = painterResource(id = R.drawable.ic_calendar), - contentDescription = "모임 활동기간", - tint = colors.White - ) - Text( - text = stringResource(R.string.groupPeroid), - style = typography.view_m500_s12_h20, - color = colors.White - ) - } - Spacer(Modifier.height(12.dp)) + //타이틀 + Row( + verticalAlignment = Alignment.CenterVertically + ) { Text( - text = detail.period, - style = typography.info_r400_s12, - color = colors.Grey + text = detail.title, + style = typography.bigtitle_b700_s22_h24, + color = colors.White ) - } - - //참여 인원 - Column { - Row( - verticalAlignment = Alignment.CenterVertically - ) { + if (detail.isSecret) { + Spacer(Modifier.width(2.dp)) Icon( - painter = painterResource(id = R.drawable.ic_group), - contentDescription = "참여 중인 독서 메이트", + painter = painterResource(id = R.drawable.ic_lock), + contentDescription = "비밀방", tint = colors.White ) - Text( - text = stringResource(R.string.groupMate), - style = typography.view_m500_s12_h20, - color = colors.White + } else { + Spacer(Modifier.width(2.dp)) + Icon( + painter = painterResource(id = R.drawable.ic_unlock), + contentDescription = "오픈방", + tint = colors.White ) } - Spacer(Modifier.height(12.dp)) - Text( - text = "${detail.members} / ${detail.maxMembers}", - style = typography.info_r400_s12, - color = colors.White - ) } - } + Spacer(modifier = Modifier.height(32.dp)) - Spacer(Modifier.height(16.dp)) - Row( - verticalAlignment = Alignment.CenterVertically - ) { - // 모집 마감/장르 - Box( - Modifier - .background(colors.Grey03, shape = RoundedCornerShape(14.dp)) - .padding(horizontal = 12.dp, vertical = 8.dp) + //소개글 + Text( + text = stringResource(R.string.groupRoomDesc), + style = typography.menu_sb600_s14_h24, + color = colors.White, + ) + + Text( + text = detail.description, + style = typography.copy_r400_s12_h20, + color = colors.Grey, + modifier = Modifier + .padding(top = 4.dp, bottom = 18.dp) + ) + + + Row( + Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween ) { - Row { - Text( - text = stringResource(R.string.groupRecruiting), - style = typography.info_m500_s12, - color = colors.White - ) + //모집 기간 + Column { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_calendar), + contentDescription = "모임 활동기간", + tint = colors.White + ) + Text( + text = stringResource(R.string.groupPeroid), + style = typography.view_m500_s12_h20, + color = colors.White + ) + } + Spacer(Modifier.height(12.dp)) Text( - text = "${detail.daysLeft}일 남음", - style = typography.info_m500_s12, - color = colors.NeonGreen + text = detail.period, + style = typography.info_r400_s12, + color = colors.Grey ) } - } - Spacer(Modifier.width(12.dp)) - Box( - Modifier - .background(colors.Grey03, shape = RoundedCornerShape(14.dp)) - .padding(horizontal = 12.dp, vertical = 8.dp) - ) { - Row { + //참여 인원 + Column { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_group), + contentDescription = "참여 중인 독서 메이트", + tint = colors.White + ) + Text( + text = stringResource(R.string.groupMate), + style = typography.view_m500_s12_h20, + color = colors.White + ) + } + Spacer(Modifier.height(12.dp)) Text( - text = stringResource(R.string.groupGenre), - style = typography.info_m500_s12, + text = "${detail.members} / ${detail.maxMembers}", + style = typography.info_r400_s12, color = colors.White ) - Text( - text = detail.genre, - style = typography.info_m500_s12, - color = colors.genreColor - ) } + } + Spacer(Modifier.height(16.dp)) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + // 모집 마감/장르 + Box( + Modifier + .background(colors.Grey03, shape = RoundedCornerShape(14.dp)) + .padding(horizontal = 12.dp, vertical = 8.dp) + ) { + Row { + Text( + text = stringResource(R.string.groupRecruiting), + style = typography.info_m500_s12, + color = colors.White + ) + Text( + text = "${detail.daysLeft}일 남음", + style = typography.info_m500_s12, + color = colors.NeonGreen + ) + } + + } + Spacer(Modifier.width(12.dp)) + Box( + Modifier + .background(colors.Grey03, shape = RoundedCornerShape(14.dp)) + .padding(horizontal = 12.dp, vertical = 8.dp) + ) { + Row { + Text( + text = stringResource(R.string.groupGenre), + style = typography.info_m500_s12, + color = colors.White + ) + Text( + text = detail.genre, + style = typography.info_m500_s12, + color = colors.genreColor + ) + } + + } } - } - Spacer(Modifier.height(62.dp)) + Spacer(Modifier.height(62.dp)) - //읽을 책 정보 - CardRoomBook( - title = detail.bookData.title, - author = detail.bookData.author, - publisher = detail.bookData.publisher, - description = detail.bookData.description, - imageRes = detail.bookData.imageRes - ) + //읽을 책 정보 + CardRoomBook( + title = detail.bookData.title, + author = detail.bookData.author, + publisher = detail.bookData.publisher, + description = detail.bookData.description, + imageRes = detail.bookData.imageRes + ) - Spacer(Modifier.height(40.dp)) - Text( - text = stringResource(R.string.groupRecommend), - style = typography.smalltitle_sb600_s18_h24, - color = colors.White - ) - Spacer(Modifier.height(24.dp)) + Spacer(Modifier.height(40.dp)) + Text( + text = stringResource(R.string.groupRecommend), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Spacer(Modifier.height(24.dp)) - //추천 모임방 - LazyRow( - horizontalArrangement = Arrangement.spacedBy(20.dp) - ) { - items(detail.recommendations) { rec -> - CardItemRoomSmall( - title = rec.title, - participants = rec.participants, - maxParticipants = rec.maxParticipants, - endDate = rec.endDate, - imageRes = rec.imageRes, - onClick = { onRecommendationClick(rec) } - ) + //추천 모임방 + LazyRow( + horizontalArrangement = Arrangement.spacedBy(20.dp) + ) { + items(detail.recommendations) { rec -> + CardItemRoomSmall( + title = rec.title, + participants = rec.participants, + maxParticipants = rec.maxParticipants, + endDate = rec.endDate, + imageRes = rec.imageRes, + onClick = { onRecommendationClick(rec) } + ) + } } - } - Spacer(Modifier.weight(1f)) + Spacer(Modifier.weight(1f)) + } } // 하단 버튼 diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt index 575a37f7..23291fc2 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt @@ -29,6 +29,7 @@ import com.texthip.thip.R import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography import androidx.compose.foundation.lazy.items +import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar @Composable fun MyGroupScreen( @@ -45,52 +46,43 @@ fun MyGroupScreen( allDataList.filter { it.isRecruiting } } } - Column( Modifier .background(colors.Black) .fillMaxSize() - .padding(horizontal = 20.dp) ) { - Spacer(modifier = Modifier.height(16.dp)) - // 상단 타이틀 - Row( - Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically + DefaultTopAppBar( + title = stringResource(R.string.myGroupRoom), + onLeftClick = {}, + ) + Column( + Modifier + .background(colors.Black) + .fillMaxSize() + .padding(horizontal = 20.dp) ) { - Icon( - painter = painterResource(id = R.drawable.ic_arrow_back), - contentDescription = null, - tint = colors.White - ) - Spacer(modifier = Modifier.width(95.dp)) - Text( - text = stringResource(R.string.myGroupRoom), - color = colors.White, - style = typography.bigtitle_b700_s22_h24 - ) - } - Spacer(modifier = Modifier.height(20.dp)) + Spacer(modifier = Modifier.height(20.dp)) - FilterRow(selectedIndex = selectedIndex, onSelect = { selectedIndex = it }) + FilterRow(selectedIndex = selectedIndex, onSelect = { selectedIndex = it }) - Spacer(modifier = Modifier.height(20.dp)) + Spacer(modifier = Modifier.height(20.dp)) - // 리스트 - LazyColumn( - verticalArrangement = Arrangement.spacedBy(20.dp), - modifier = Modifier.fillMaxSize() - ) { - items(filteredList) { item -> - CardItemRoom( - title = item.title, - participants = item.participants, - maxParticipants = item.maxParticipants, - isRecruiting = item.isRecruiting, - endDate = item.endDate, - imageRes = item.imageRes, - onClick = { onCardClick(item) } - ) + // 리스트 + LazyColumn( + verticalArrangement = Arrangement.spacedBy(20.dp), + modifier = Modifier.fillMaxSize() + ) { + items(filteredList) { item -> + CardItemRoom( + title = item.title, + participants = item.participants, + maxParticipants = item.maxParticipants, + isRecruiting = item.isRecruiting, + endDate = item.endDate, + imageRes = item.imageRes, + onClick = { onCardClick(item) } + ) + } } } } From acdbc13aef273ab593cd7545729cc4b30017a04d Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:57:18 +0900 Subject: [PATCH 12/29] =?UTF-8?q?[Refactor]=20FormTextFieldDefault?= =?UTF-8?q?=EC=97=90=EC=84=9C=20Boolean=20=EA=B0=92=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EC=BD=98=EA=B3=BC=20limit=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/forms/FormTextFieldDefault.kt | 124 ++++++++++++------ 1 file changed, 85 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt index 286bb8c8..a04f60ba 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/FormTextFieldDefault.kt @@ -2,6 +2,9 @@ package com.texthip.thip.ui.common.forms import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon @@ -27,51 +30,81 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun FormTextFieldDefault( modifier: Modifier = Modifier, - hint: String + hint: String, + showLimit: Boolean = false, + limit: Int = 10, + showIcon: Boolean = true ) { var text by rememberSaveable { mutableStateOf("") } val myStyle = typography.menu_r400_s14_h24.copy(lineHeight = 14.sp) - OutlinedTextField( - value = text, - onValueChange = { text = it }, - placeholder = { - Text( - text = hint, - color = colors.Grey02, - style = myStyle - ) - }, - textStyle = myStyle, - modifier = modifier.size(width = 320.dp, height = 48.dp), - shape = RoundedCornerShape(12.dp), - colors = TextFieldDefaults.colors( - focusedTextColor = colors.White, - focusedIndicatorColor = Color.Transparent, - unfocusedIndicatorColor = Color.Transparent, - focusedContainerColor = colors.Black, - unfocusedContainerColor = colors.Black, - cursorColor = colors.NeonGreen - ), - trailingIcon = { - if (text.isNotEmpty()) { - Icon( - painter = painterResource(id = R.drawable.ic_x_circle_white), - contentDescription = "Clear text", - modifier = Modifier.clickable { text = "" }, - tint = Color.Unspecified + // 글자수 제한 적용 + val displayText = if (showLimit && text.length > limit) text.substring(0, limit) else text + + Box(modifier = modifier) { + OutlinedTextField( + value = displayText, + onValueChange = { + // 글자수 제한 적용 + text = if (showLimit && it.length > limit) it.substring(0, limit) else it + }, + placeholder = { + Text( + text = hint, + color = colors.Grey02, + style = myStyle ) - } else { - Icon( - painter = painterResource(id = R.drawable.ic_x_circle), - contentDescription = "Clear text" + }, + textStyle = myStyle, + modifier = Modifier + .size(width = 320.dp, height = 48.dp), + shape = RoundedCornerShape(12.dp), + colors = TextFieldDefaults.colors( + focusedTextColor = colors.White, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + focusedContainerColor = colors.Black, + unfocusedContainerColor = colors.Black, + cursorColor = colors.NeonGreen + ), + trailingIcon = { + if (showIcon) { + if (text.isNotEmpty()) { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle_white), + contentDescription = "Clear text", + modifier = Modifier.clickable { text = "" }, + tint = Color.Unspecified + ) + } else { + Icon( + painter = painterResource(id = R.drawable.ic_x_circle), + contentDescription = "Clear text" + ) + } + } + }, + singleLine = true + ) + + // 글자수 제한 표시 (오른쪽 상단) + if (showLimit) { + Box( + modifier = Modifier + .align(Alignment.CenterEnd) + .padding(end = 14.dp) + ) { + Text( + text = "${text.length}/$limit", + color = colors.White, + style = typography.info_r400_s12_h24 ) } - }, - singleLine = true - ) + } + } } + @Composable @Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 200) fun FormTextFieldDefaultPreview() { @@ -79,8 +112,21 @@ fun FormTextFieldDefaultPreview() { modifier = Modifier.size(width = 360.dp, height = 200.dp), contentAlignment = Alignment.Center ) { - FormTextFieldDefault( - hint = "이곳에 텍스트를 입력하세요" - ) + Column { + FormTextFieldDefault( + hint = "이곳에 텍스트를 입력하세요", + showLimit = true, + limit = 20, + showIcon = false + ) + Spacer(modifier = Modifier.padding(vertical = 8.dp)) + + FormTextFieldDefault( + hint = "이곳에 텍스트를 입력하세요", + showLimit = false, + limit = 10, + showIcon = true + ) + } } } \ No newline at end of file From ff0a7d5b1e0167a24e2106015ada269ea5b6ff09 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Mon, 30 Jun 2025 21:07:12 +0900 Subject: [PATCH 13/29] =?UTF-8?q?[Refactor]=20NotificationCard=EC=9D=98=20?= =?UTF-8?q?Badge=20Text=EB=A5=BC=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/common/cards/CardAlarm.kt | 32 +++++++++++++++++-- app/src/main/res/values/strings.xml | 1 - 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt index afdeb777..8f367f51 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt @@ -36,6 +36,7 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun NotificationCard( modifier: Modifier = Modifier, + badgeText: String, title: String, message: String, timeAgo: String, @@ -65,7 +66,6 @@ fun NotificationCard( // 뱃지 Box( modifier = Modifier - .size(width = 40.dp, height = 24.dp) .clip(RoundedCornerShape(13.dp)) .border( width = 1.dp, @@ -75,7 +75,9 @@ fun NotificationCard( contentAlignment = Alignment.Center ) { Text( - text = stringResource(R.string.group), + modifier = Modifier + .padding(horizontal = 10.dp, vertical = 2.dp), + text = badgeText, color = if (isRead) colors.Grey01 else colors.Grey, style = typography.menu_sb600_s12_h20 ) @@ -149,6 +151,7 @@ fun PreviewNotificationCards() { // 안읽은 알림 NotificationCard( title = "같이 읽기를 시작했어요!", + badgeText = "모임", message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", timeAgo = "12", isRead = isRead @@ -159,10 +162,35 @@ fun PreviewNotificationCards() { // 읽은 알림 NotificationCard( title = "같이 읽기를 시작했어요!", + badgeText = "모임", message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", timeAgo = "12", isRead = true ) + + NotificationCard( + title = "같이 읽기를 시작했어요!", + badgeText = "피드", + message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", + timeAgo = "12", + isRead = false + ) + + NotificationCard( + title = "같이 읽기를 시작했어요!", + badgeText = "좋아요", + message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", + timeAgo = "12", + isRead = isRead + ) + + NotificationCard( + title = "같이 읽기를 시작했어요!", + badgeText = "댓글", + message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", + timeAgo = "12", + isRead = isRead + ) } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83ac96c6..43587275 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,7 +38,6 @@ 시간 전 - 모임 변경 From 621e9d8a2d088fdee153b5c4de8f63c8c91b3734 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Mon, 30 Jun 2025 22:15:13 +0900 Subject: [PATCH 14/29] =?UTF-8?q?[Refactor]=20CardAlam=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/common/cards/CardAlarm.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt index 8f367f51..a37fce8b 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt @@ -34,7 +34,7 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun NotificationCard( +fun CardAlarm( modifier: Modifier = Modifier, badgeText: String, title: String, @@ -149,7 +149,7 @@ fun PreviewNotificationCards() { verticalArrangement = Arrangement.spacedBy(8.dp) ) { // 안읽은 알림 - NotificationCard( + CardAlarm( title = "같이 읽기를 시작했어요!", badgeText = "모임", message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", @@ -160,7 +160,7 @@ fun PreviewNotificationCards() { } // 읽은 알림 - NotificationCard( + CardAlarm( title = "같이 읽기를 시작했어요!", badgeText = "모임", message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", @@ -168,7 +168,7 @@ fun PreviewNotificationCards() { isRead = true ) - NotificationCard( + CardAlarm( title = "같이 읽기를 시작했어요!", badgeText = "피드", message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", @@ -176,7 +176,7 @@ fun PreviewNotificationCards() { isRead = false ) - NotificationCard( + CardAlarm( title = "같이 읽기를 시작했어요!", badgeText = "좋아요", message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", @@ -184,7 +184,7 @@ fun PreviewNotificationCards() { isRead = isRead ) - NotificationCard( + CardAlarm( title = "같이 읽기를 시작했어요!", badgeText = "댓글", message = "한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다. 한줄만 입력이 가능합니다.", From 30a4423bd4adc296064d4efe9013ebcad6002a01 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Tue, 1 Jul 2025 16:28:54 +0900 Subject: [PATCH 15/29] =?UTF-8?q?[refactor]:=20PR=20=EA=B8=B0=EB=B0=98?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20StringResource=20=EC=B6=94=EC=B6=9C=20(#25?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/cards/CardItemRoom.kt | 18 ++++++++++++++---- .../thip/ui/common/cards/CardItemRoomSmall.kt | 3 ++- .../ui/myPage/groupRoom/GroupRoomScreen.kt | 17 ++++++++++++----- app/src/main/res/values/strings.xml | 11 +++++++++++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt index 053a1df4..741fc473 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt @@ -25,6 +25,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -110,9 +111,13 @@ fun CardItemRoom( Spacer(modifier = Modifier.width(4.dp)) Text( text = if (isRecruiting) { - "$participants / ${maxParticipants}명" + stringResource( + R.string.CardItemParicipantCount, + participants, + maxParticipants + ) } else { - "${participants}명 참여" + stringResource(R.string.CardItemParticipant, participants) }, color = colors.White, style = typography.info_m500_s12, @@ -120,7 +125,13 @@ fun CardItemRoom( } Spacer(modifier = Modifier.height(5.dp)) Text( - text = "${endDate}일 뒤 " + if (isRecruiting) "모집 마감" else "종료", + text = stringResource( + R.string.CardItemEndDate, + endDate + ) + if (isRecruiting) stringResource( + R.string.CardItemEnd + ) else stringResource(R.string.CardItemFinish), + color = if (isRecruiting) colors.Red else colors.Grey01, style = typography.menu_sb600_s12_h20, maxLines = 1 @@ -132,7 +143,6 @@ fun CardItemRoom( } - @Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) @Composable fun CardItemRoomPreview() { diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt index eb444d6a..0f92e95f 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -106,7 +107,7 @@ fun CardItemRoomSmall( } Spacer(modifier = Modifier.height(4.dp)) Text( - text = "${endDate}일 뒤 모집 마감", + text = stringResource(R.string.cardItemEndDate, endDate), color = colors.Red, style = typography.menu_sb600_s12_h20 ) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt index 5a567a77..54d3bf0e 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt @@ -148,7 +148,11 @@ fun GroupRoomScreen( } Spacer(Modifier.height(12.dp)) Text( - text = "${detail.members} / ${detail.maxMembers}", + text = stringResource( + R.string.GroupRoomScreenParticipantCount, + detail.members, + detail.maxMembers + ), style = typography.info_r400_s12, color = colors.White ) @@ -172,7 +176,10 @@ fun GroupRoomScreen( color = colors.White ) Text( - text = "${detail.daysLeft}일 남음", + text = stringResource( + R.string.GroupRoomScreenEndDate, + detail.daysLeft + ), style = typography.info_m500_s12, color = colors.NeonGreen ) @@ -242,9 +249,9 @@ fun GroupRoomScreen( // 하단 버튼 val buttonText = when (buttonType) { - BottomButtonType.JOIN -> "참여하기" - BottomButtonType.CANCEL -> "참여 취소하기" - BottomButtonType.CLOSE -> "모집 마감하기" + BottomButtonType.JOIN -> stringResource(R.string.GroupRoomScreenParticipant) + BottomButtonType.CANCEL -> stringResource(R.string.GroupRoomScreenCancle) + BottomButtonType.CLOSE -> stringResource(R.string.GroupRoomScreenEnd) } val buttonColor = when (buttonType) { BottomButtonType.JOIN -> colors.Purple diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 43587275..98356dac 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -39,6 +39,11 @@ 시간 전 변경 + "%1$s일 뒤 " + 모집 마감 + 종료 + %1$s명 참여 + %1$s / %2$s명 해당 도서는 %1$dp까지만 있습니다. @@ -63,6 +68,12 @@ %1$s명 참여 "%1$s의 진행도 " 모임방 참여할 사람! + %1$s일 뒤 모집 마감 + %1$s / %2$s + %1$s일 남음 + 참여하기 + 참여 취소하기 + 모집 마감하기 \ No newline at end of file From e49f2835201626c115890969af78d52c52cdc449 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Tue, 1 Jul 2025 16:48:13 +0900 Subject: [PATCH 16/29] =?UTF-8?q?[refactor]:=20Padding=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=83=81=ED=83=9C=EA=B0=92=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt | 3 +-- .../texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt | 2 +- .../com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt | 2 +- .../texthip/thip/ui/myPage/groupPage/SearchTextField.kt | 8 +++++++- .../thip/ui/myPage/groupPage/SimplePagerIndicator.kt | 4 ++-- .../com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt | 1 + 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt index fb59a1f0..e5792200 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt @@ -43,8 +43,7 @@ fun GroupPageScreen( ) { LazyColumn( Modifier - .fillMaxSize() - .padding(bottom = 32.dp), // FAB 공간 확보 + .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(0.dp) ) { // 상단바 diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt index 4d5aa014..5a49c801 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt @@ -52,7 +52,7 @@ fun MyGroupMainCard( end = Offset(1000f, 1000f) ) - val progressState by remember { + val progressState by remember(data.progress) { mutableFloatStateOf(data.progress / 100f) } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt index 45844122..038f0e20 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt @@ -23,7 +23,7 @@ fun MyGroupPager( // Pager 상태 val pagerState = rememberPagerState( initialPage = 0, - pageCount = { groupCards.size } + pageCount = { maxOf(1, groupCards.size) } ) Box( diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt index bc5b8fe7..5200b9f3 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt @@ -1,5 +1,6 @@ package com.texthip.thip.ui.myPage.groupPage +import android.R.attr.textStyle import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -31,6 +32,7 @@ fun SearchTextField( onValueChange: (String) -> Unit ) { var value by rememberSaveable { mutableStateOf("") } + val textStyle = typography.menu_r400_s14_h24.copy(lineHeight = 20.sp) // 기본값 제공 Box( Modifier @@ -40,7 +42,11 @@ fun SearchTextField( ) { OutlinedTextField( value = value, - onValueChange = onValueChange, + onValueChange = { newValue -> + value = newValue + onValueChange(newValue) + }, + textStyle = textStyle, modifier = Modifier .fillMaxWidth(), placeholder = { diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt index b16da771..9416cc24 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt @@ -15,9 +15,9 @@ import com.texthip.thip.ui.theme.ThipTheme.colors @Composable fun SimplePagerIndicator( + modifier: Modifier = Modifier, pageCount: Int, - currentPage: Int, - modifier: Modifier = Modifier + currentPage: Int ) { Row( modifier = modifier, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt index 23291fc2..77d56463 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt @@ -50,6 +50,7 @@ fun MyGroupScreen( Modifier .background(colors.Black) .fillMaxSize() + .padding(bottom = 20.dp) ) { DefaultTopAppBar( title = stringResource(R.string.myGroupRoom), From 448aa6e311df6b342361d5b0893bd1fd5a8bbfec Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Tue, 1 Jul 2025 16:48:33 +0900 Subject: [PATCH 17/29] =?UTF-8?q?[refactor]:=20=EC=83=89=EC=9D=84=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=EB=A1=9C=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EB=B0=9B=EC=9D=84=20=EC=88=98=20=EC=9E=88=EA=B2=8C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt index a37fce8b..cca99e99 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardAlarm.kt @@ -1,5 +1,6 @@ package com.texthip.thip.ui.common.cards +import androidx.compose.ui.graphics.Color import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable @@ -41,6 +42,8 @@ fun CardAlarm( message: String, timeAgo: String, isRead: Boolean = false, + containerColorUnread: Color = colors.DarkGrey, // 안읽음 상태의 배경색 + containerColorRead: Color = colors.DarkGrey02, // 읽음 상태의 배경색 onClick: () -> Unit = {} ) { Card( @@ -48,7 +51,7 @@ fun CardAlarm( .fillMaxWidth() .clickable { onClick() }, colors = CardDefaults.cardColors( - containerColor = if (isRead) colors.DarkGrey else colors.DarkGrey02 + containerColor = if (isRead) containerColorUnread else containerColorRead ), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), shape = RoundedCornerShape(12.dp) From 2f60da1523b49ad0f6ca1f7e09e546f533672e1d Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:00:19 +0900 Subject: [PATCH 18/29] =?UTF-8?q?[refactor]:=20dependency=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EC=88=98=EC=A0=95=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 5 ++--- gradle/libs.versions.toml | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9bd47908..b679eeb7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -53,6 +53,8 @@ dependencies { implementation(libs.androidx.material3) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.navigation.runtime.android) + implementation(libs.accompanist.pager) + implementation(libs.accompanist.pager.indicators) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) @@ -60,7 +62,4 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) - implementation ("com.google.accompanist:accompanist-pager:0.35.0-alpha") - implementation ("com.google.accompanist:accompanist-pager-indicators:0.35.0-alpha") - } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1f20de5c..e91013f9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,6 +10,8 @@ activityCompose = "1.10.1" composeBom = "2024.09.00" navigationCompose = "2.9.0" navigationRuntimeAndroid = "2.9.0" +accompanistPager = "0.36.0" +accompanistPagerIndicators = "0.36.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -28,6 +30,8 @@ androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } androidx-navigation-runtime-android = { group = "androidx.navigation", name = "navigation-runtime-android", version.ref = "navigationRuntimeAndroid" } +accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanistPager" } +accompanist-pager-indicators = { group = "com.google.accompanist", name = "accompanist-pager-indicators", version.ref = "accompanistPagerIndicators" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From a8c48a717bdb995f834f303d80ec81c9d83f6b44 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:10:18 +0900 Subject: [PATCH 19/29] =?UTF-8?q?[feat]:=20ChipButton=20=EB=B3=B5=EA=B5=AC?= =?UTF-8?q?=20=EB=B0=8F=20Screen=20=EB=B2=84=ED=8A=BC=20=EC=9E=91=EB=8F=99?= =?UTF-8?q?=20=EB=B0=A9=EC=8B=9D=20=EC=88=98=EC=A0=95=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/common/buttons/OptionChipButton.kt | 16 ++++++++----- .../thip/ui/myPage/myGroup/FilterRow.kt | 11 ++++----- .../thip/ui/myPage/myGroup/MyGroupScreen.kt | 24 +++++++++++++------ 3 files changed, 32 insertions(+), 19 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 5b6f4d6e..22069b2e 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 @@ -30,21 +30,22 @@ fun OptionChipButton( modifier: Modifier = Modifier, text: String, isFilled: Boolean = false, - isSelected: Boolean = false, onClick: () -> Unit, ) { + var isClicked by remember { mutableStateOf(false) } + val textColor = when { - isFilled && isSelected -> colors.White - isFilled -> colors.Grey01 + isFilled -> colors.White + isClicked -> colors.Purple else -> colors.Grey01 } val backgroundColor = when { - isFilled && isSelected -> colors.Purple + isFilled && isClicked -> colors.Purple isFilled -> colors.DarkGrey else -> Color.Transparent } val borderColor = when { - !isFilled && isSelected -> colors.Purple + !isFilled && isClicked -> colors.Purple !isFilled -> colors.Grey02 else -> Color.Transparent } @@ -60,7 +61,10 @@ fun OptionChipButton( color = borderColor, shape = RoundedCornerShape(20.dp) ) - .clickable { onClick() } + .clickable { + isClicked = !isClicked + onClick() + } .padding(vertical = 8.dp, horizontal = 12.dp), contentAlignment = Alignment.Center, ) { diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt index 99ecec88..ea638465 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt @@ -10,8 +10,8 @@ import com.texthip.thip.ui.common.buttons.OptionChipButton @Composable fun FilterRow( - selectedIndex: Int, - onSelect: (Int) -> Unit + selectedStates: BooleanArray, + onToggle: (Int) -> Unit ) { Row( horizontalArrangement = Arrangement.spacedBy(12.dp) @@ -19,14 +19,13 @@ fun FilterRow( OptionChipButton( text = stringResource(R.string.onGoing), isFilled = true, - isSelected = selectedIndex == 0, - onClick = { onSelect(0) } + onClick = { onToggle(0) } ) OptionChipButton( text = stringResource(R.string.recruiting), isFilled = true, - isSelected = selectedIndex == 1, - onClick = { onSelect(1) } + onClick = { onToggle(1) } ) } } + diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt index 77d56463..e5714ed2 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt @@ -36,16 +36,22 @@ fun MyGroupScreen( allDataList: List, onCardClick: (CardItemRoomData) -> Unit = {} ) { - var selectedIndex by remember { mutableStateOf(0) } + var selectedStates by remember { mutableStateOf(booleanArrayOf(false, false)) } + // [0] = 진행중, [1] = 모집중 - // 필터링 - val filteredList = remember(selectedIndex, allDataList) { - if (selectedIndex == 0) { + val filteredList = remember(selectedStates, allDataList) { + // 둘 다 false면 전체, 둘 다 true면 전체 + if (selectedStates.all { !it } || selectedStates.all { it }) { + allDataList + } else if (selectedStates[0]) { allDataList.filter { !it.isRecruiting } - } else { + } else if (selectedStates[1]) { allDataList.filter { it.isRecruiting } + } else { + allDataList // safety, but 위에서 이미 걸러짐 } } + Column( Modifier .background(colors.Black) @@ -64,11 +70,15 @@ fun MyGroupScreen( ) { Spacer(modifier = Modifier.height(20.dp)) - FilterRow(selectedIndex = selectedIndex, onSelect = { selectedIndex = it }) + FilterRow( + selectedStates = selectedStates, + onToggle = { idx -> + selectedStates = selectedStates.copyOf().also { it[idx] = !it[idx] } + } + ) Spacer(modifier = Modifier.height(20.dp)) - // 리스트 LazyColumn( verticalArrangement = Arrangement.spacedBy(20.dp), modifier = Modifier.fillMaxSize() From 836f60bf2db9461a5ba4b9887a901d621d059615 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:12:01 +0900 Subject: [PATCH 20/29] =?UTF-8?q?[refactor]:=20Preview=20ThipTheme?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=ED=95=B4=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/cards/CardItemRoom.kt | 75 ++++++++++--------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt index 741fc473..0185b1ea 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -143,43 +144,45 @@ fun CardItemRoom( } -@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) +@Preview() @Composable fun CardItemRoomPreview() { - Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { - CardItemRoom( - title = "모임방 이름입니다. 모임방 이름입니다.", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3, - imageRes = R.drawable.bookcover_sample - ) - CardItemRoom( - title = "모임방 이름입니다. 모임방 이름입니다.", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 3, - imageRes = R.drawable.bookcover_sample - ) - CardItemRoom( - title = "모임방 이름입니다. 모임방 이름입니다.", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3, - imageRes = R.drawable.bookcover_sample, - hasBorder = true - ) - CardItemRoom( - title = "모임방 이름입니다. 모임방 이름입니다.", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 3, - imageRes = R.drawable.bookcover_sample, - hasBorder = true - ) + ThipTheme { + Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { + CardItemRoom( + title = "모임방 이름입니다. 모임방 이름입니다.", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + imageRes = R.drawable.bookcover_sample + ) + CardItemRoom( + title = "모임방 이름입니다. 모임방 이름입니다.", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3, + imageRes = R.drawable.bookcover_sample + ) + CardItemRoom( + title = "모임방 이름입니다. 모임방 이름입니다.", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + imageRes = R.drawable.bookcover_sample, + hasBorder = true + ) + CardItemRoom( + title = "모임방 이름입니다. 모임방 이름입니다.", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3, + imageRes = R.drawable.bookcover_sample, + hasBorder = true + ) + } } } \ No newline at end of file From 1f4a11160d52c1f198c693c9d081ed679805aefc Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:48:25 +0900 Subject: [PATCH 21/29] =?UTF-8?q?[refactor]:=20=ED=8C=8C=EC=9D=BC=EB=AA=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20enum=20class=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/myPage/groupPage/DeadlineRoomData.kt | 8 ---- .../{MyGroupCardData.kt => GroupCardData.kt} | 2 +- .../myPage/groupPage/GroupDeadlineRoomData.kt | 8 ++++ .../{MyGroupMainCard.kt => GroupMainCard.kt} | 8 ++-- .../ui/myPage/groupPage/GroupPageScreen.kt | 9 ++-- .../{MyGroupPager.kt => GroupPager.kt} | 16 +++---- ...chTextField.kt => GroupSearchTextField.kt} | 5 +-- .../{BookData.kt => GroupBookData.kt} | 2 +- .../myPage/groupRoom/GroupBottomButtonType.kt | 3 ++ .../thip/ui/myPage/groupRoom/GroupRoomData.kt | 8 ++-- .../ui/myPage/groupRoom/GroupRoomScreen.kt | 37 ++++++++-------- ...emRoomData.kt => GroupCardItemRoomData.kt} | 2 +- .../{MyGroupScreen.kt => GroupMyScreen.kt} | 42 ++++++++----------- .../ui/myPage/viewModel/MyPageViewModel.kt | 34 +++++++-------- 14 files changed, 87 insertions(+), 97 deletions(-) delete mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomData.kt rename app/src/main/java/com/texthip/thip/ui/myPage/groupPage/{MyGroupCardData.kt => GroupCardData.kt} (89%) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomData.kt rename app/src/main/java/com/texthip/thip/ui/myPage/groupPage/{MyGroupMainCard.kt => GroupMainCard.kt} (98%) rename app/src/main/java/com/texthip/thip/ui/myPage/groupPage/{MyGroupPager.kt => GroupPager.kt} (92%) rename app/src/main/java/com/texthip/thip/ui/myPage/groupPage/{SearchTextField.kt => GroupSearchTextField.kt} (96%) rename app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/{BookData.kt => GroupBookData.kt} (89%) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBottomButtonType.kt rename app/src/main/java/com/texthip/thip/ui/myPage/myGroup/{CardItemRoomData.kt => GroupCardItemRoomData.kt} (90%) rename app/src/main/java/com/texthip/thip/ui/myPage/myGroup/{MyGroupScreen.kt => GroupMyScreen.kt} (87%) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomData.kt deleted file mode 100644 index fef33b3d..00000000 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomData.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.texthip.thip.ui.myPage.groupPage - -import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData - -data class DeadlineRoomData( - val genre: String, - val rooms: List -) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupCardData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupCardData.kt similarity index 89% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupCardData.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupCardData.kt index 98e37e0e..0a3794a5 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupCardData.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupCardData.kt @@ -2,7 +2,7 @@ package com.texthip.thip.ui.myPage.groupPage import com.texthip.thip.R -data class MyGroupCardData( +data class GroupCardData( val title: String, val members: Int, val imageRes: Int = R.drawable.bookcover_sample, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomData.kt new file mode 100644 index 00000000..4db539d8 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomData.kt @@ -0,0 +1,8 @@ +package com.texthip.thip.ui.myPage.groupPage + +import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData + +data class GroupDeadlineRoomData( + val genre: String, + val rooms: List +) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt similarity index 98% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt index 5a49c801..a1f8cbb0 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupMainCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt @@ -37,8 +37,8 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun MyGroupMainCard( - data: MyGroupCardData, +fun GroupMainCard( + data: GroupCardData, backgroundColor: Color = Color.White, onClick: () -> Unit = {} ) { @@ -147,8 +147,8 @@ fun MyGroupMainCard( @Preview(showBackground = true, backgroundColor = 0xFF222222, widthDp = 380, heightDp = 170) @Composable fun PreviewMyGroupMainCard() { - MyGroupMainCard( - data = MyGroupCardData( + GroupMainCard( + data = GroupCardData( title = "호르몬 체인지 완독하는 방", members = 22, imageRes = R.drawable.bookcover_sample, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt index e5792200..ef665b67 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Spacer 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.runtime.Composable import androidx.compose.runtime.collectAsState @@ -58,17 +57,17 @@ fun GroupPageScreen( } // 검색창 item { - SearchTextField(onValueChange = { }) + GroupSearchTextField(onValueChange = { }) Spacer(Modifier.height(32.dp)) } // 내 모임방 헤더 + 카드 item { - MainSectionHeader( + GroupMySectionHeader( onClick = { viewModel.onMyGroupHeaderClick() } ) Spacer(Modifier.height(20.dp)) - MyGroupPager( + GroupPager( groupCards = myGroups, onCardClick = { viewModel.onMyGroupCardClick(it) } ) @@ -85,7 +84,7 @@ fun GroupPageScreen( } // 마감 임박한 독서 모임방 item { - DeadlineRoomSection( + GroupDeadlineRoomSection( rooms = deadlineRooms, selectedGenre = selectedGenre, onRoomClick = { viewModel.onRoomCardClick(it) }, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt similarity index 92% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt index 038f0e20..ae3d55b7 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MyGroupPager.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt @@ -16,9 +16,9 @@ import androidx.compose.ui.unit.dp import com.texthip.thip.ui.theme.ThipTheme.colors @Composable -fun MyGroupPager( - groupCards: List, - onCardClick: (MyGroupCardData) -> Unit +fun GroupPager( + groupCards: List, + onCardClick: (GroupCardData) -> Unit ) { // Pager 상태 val pagerState = rememberPagerState( @@ -55,7 +55,7 @@ fun MyGroupPager( alpha = if (pagerState.currentPage == page) 1f else 0.7f } ) { - MyGroupMainCard( + GroupMainCard( data = groupCards[page], onClick = { onCardClick(groupCards[page]) }, backgroundColor = bgColor // Card에서 배경색 파라미터 추가 @@ -77,21 +77,21 @@ fun MyGroupPager( @Composable fun PreviewMyGroupPager() { val list = listOf( - MyGroupCardData( + GroupCardData( title = "호르몬 체인지 완독하는 방", members = 22, imageRes = com.texthip.thip.R.drawable.bookcover_sample, progress = 40, nickname = "uibowl1님" ), - MyGroupCardData( + GroupCardData( title = "명작 읽기방", members = 10, imageRes = com.texthip.thip.R.drawable.bookcover_sample, progress = 70, nickname = "joyce님" ), - MyGroupCardData( + GroupCardData( title = "또 다른 방", members = 13, imageRes = com.texthip.thip.R.drawable.bookcover_sample, @@ -99,6 +99,6 @@ fun PreviewMyGroupPager() { nickname = "other님" ) ) - MyGroupPager(groupCards = list, onCardClick = {}) + GroupPager(groupCards = list, onCardClick = {}) } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupSearchTextField.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupSearchTextField.kt index 5200b9f3..1747b94f 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SearchTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupSearchTextField.kt @@ -1,6 +1,5 @@ package com.texthip.thip.ui.myPage.groupPage -import android.R.attr.textStyle import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -28,7 +27,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun SearchTextField( +fun GroupSearchTextField( onValueChange: (String) -> Unit ) { var value by rememberSaveable { mutableStateOf("") } @@ -81,6 +80,6 @@ fun SearchTextField( @Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) @Composable fun PreviewSearchTextField() { - SearchTextField(onValueChange = {}) + GroupSearchTextField(onValueChange = {}) } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/BookData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBookData.kt similarity index 89% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/BookData.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBookData.kt index 01a7ba0d..48ffc9a5 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/BookData.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBookData.kt @@ -2,7 +2,7 @@ package com.texthip.thip.ui.myPage.groupRoom import com.texthip.thip.R -data class BookData( +data class GroupBookData( val title: String, val author: String, val publisher: String, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBottomButtonType.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBottomButtonType.kt new file mode 100644 index 00000000..31e2a113 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBottomButtonType.kt @@ -0,0 +1,3 @@ +package com.texthip.thip.ui.myPage.groupRoom + +enum class GroupBottomButtonType { JOIN, CANCEL, CLOSE } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt index 85540ca0..de07d96e 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt @@ -1,6 +1,6 @@ package com.texthip.thip.ui.myPage.groupRoom -import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData +import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData data class GroupRoomData( val title: String, @@ -11,8 +11,6 @@ data class GroupRoomData( val maxMembers: Int, val daysLeft: Int, val genre: String, - val bookData: BookData, - val recommendations: List + val bookData: GroupBookData, + val recommendations: List ) - -enum class BottomButtonType { JOIN, CANCEL, CLOSE } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt index 54d3bf0e..abc9a193 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt @@ -1,7 +1,6 @@ package com.texthip.thip.ui.myPage.groupRoom 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 @@ -30,16 +29,16 @@ import com.texthip.thip.R import com.texthip.thip.ui.common.cards.CardItemRoomSmall import com.texthip.thip.ui.common.cards.CardRoomBook import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar -import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData +import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun GroupRoomScreen( detail: GroupRoomData, - buttonType: BottomButtonType, + buttonType: GroupBottomButtonType, onBottomButtonClick: () -> Unit = {}, - onRecommendationClick: (CardItemRoomData) -> Unit = {} + onRecommendationClick: (GroupCardItemRoomData) -> Unit = {} ) { Box(Modifier.fillMaxSize()) { Column { @@ -249,14 +248,14 @@ fun GroupRoomScreen( // 하단 버튼 val buttonText = when (buttonType) { - BottomButtonType.JOIN -> stringResource(R.string.GroupRoomScreenParticipant) - BottomButtonType.CANCEL -> stringResource(R.string.GroupRoomScreenCancle) - BottomButtonType.CLOSE -> stringResource(R.string.GroupRoomScreenEnd) + GroupBottomButtonType.JOIN -> stringResource(R.string.GroupRoomScreenParticipant) + GroupBottomButtonType.CANCEL -> stringResource(R.string.GroupRoomScreenCancle) + GroupBottomButtonType.CLOSE -> stringResource(R.string.GroupRoomScreenEnd) } val buttonColor = when (buttonType) { - BottomButtonType.JOIN -> colors.Purple - BottomButtonType.CANCEL -> colors.Red - BottomButtonType.CLOSE -> colors.Grey02 + GroupBottomButtonType.JOIN -> colors.Purple + GroupBottomButtonType.CANCEL -> colors.Red + GroupBottomButtonType.CLOSE -> colors.Grey02 } Button( @@ -283,7 +282,7 @@ fun GroupRoomScreen( @Composable fun GroupRoomDetailScreenPreview_AllCases() { val recommendations = listOf( - CardItemRoomData( + GroupCardItemRoomData( title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", participants = 19, maxParticipants = 25, @@ -291,7 +290,7 @@ fun GroupRoomDetailScreenPreview_AllCases() { endDate = 2, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", participants = 12, maxParticipants = 16, @@ -299,7 +298,7 @@ fun GroupRoomDetailScreenPreview_AllCases() { endDate = 6, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", participants = 30, maxParticipants = 30, @@ -307,7 +306,7 @@ fun GroupRoomDetailScreenPreview_AllCases() { endDate = 0, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", participants = 10, maxParticipants = 12, @@ -315,7 +314,7 @@ fun GroupRoomDetailScreenPreview_AllCases() { endDate = 8, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "에세이 나눔방", participants = 14, maxParticipants = 20, @@ -325,7 +324,7 @@ fun GroupRoomDetailScreenPreview_AllCases() { ) ) - val bookData = BookData( + val bookData = GroupBookData( title = "심장보다 단단한 토마토 한 알", author = "고선지", publisher = "푸른출판사", @@ -361,19 +360,19 @@ fun GroupRoomDetailScreenPreview_AllCases() { // 1. 참여 가능한 경우(참여하기) GroupRoomScreen( detail = detailJoin, - buttonType = BottomButtonType.JOIN, + buttonType = GroupBottomButtonType.JOIN, onBottomButtonClick = {} ) // 2. 참여 중인 경우(참여 취소하기) GroupRoomScreen( detail = detailCancel, - buttonType = BottomButtonType.CANCEL, + buttonType = GroupBottomButtonType.CANCEL, onBottomButtonClick = {} ) // 3. 내가 호스트인 경우(모집 마감하기) GroupRoomScreen( detail = detailHost, - buttonType = BottomButtonType.CLOSE, + buttonType = GroupBottomButtonType.CLOSE, onBottomButtonClick = {} ) } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupCardItemRoomData.kt similarity index 90% rename from app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupCardItemRoomData.kt index e91bbfd2..68ed6038 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/CardItemRoomData.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupCardItemRoomData.kt @@ -2,7 +2,7 @@ package com.texthip.thip.ui.myPage.myGroup import com.texthip.thip.R -data class CardItemRoomData( +data class GroupCardItemRoomData( val title: String, val participants: Int, val maxParticipants: Int, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyScreen.kt similarity index 87% rename from app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyScreen.kt index e5714ed2..adf2aa31 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/MyGroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyScreen.kt @@ -9,32 +9,24 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -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 com.texthip.thip.ui.common.cards.CardItemRoom import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Row 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.layout.width -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.texthip.thip.R import com.texthip.thip.ui.theme.ThipTheme.colors -import com.texthip.thip.ui.theme.ThipTheme.typography import androidx.compose.foundation.lazy.items import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar @Composable -fun MyGroupScreen( - allDataList: List, - onCardClick: (CardItemRoomData) -> Unit = {} +fun GroupMyScreen( + allDataList: List, + onCardClick: (GroupCardItemRoomData) -> Unit = {} ) { var selectedStates by remember { mutableStateOf(booleanArrayOf(false, false)) } // [0] = 진행중, [1] = 모집중 @@ -70,7 +62,7 @@ fun MyGroupScreen( ) { Spacer(modifier = Modifier.height(20.dp)) - FilterRow( + GroupMyRoomFilterRow( selectedStates = selectedStates, onToggle = { idx -> selectedStates = selectedStates.copyOf().also { it[idx] = !it[idx] } @@ -104,7 +96,7 @@ fun MyGroupScreen( @Composable fun MyGroupListFilterScreenPreview() { val dataList = listOf( - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -112,7 +104,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 3, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -120,7 +112,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 30, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -128,7 +120,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 1, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -136,7 +128,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 3, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -144,7 +136,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 3, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -152,7 +144,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 30, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -160,7 +152,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 1, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -168,7 +160,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 3, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -176,7 +168,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 3, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -184,7 +176,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 30, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -192,7 +184,7 @@ fun MyGroupListFilterScreenPreview() { endDate = 1, genreIndex = 0 ), - CardItemRoomData( + GroupCardItemRoomData( title = "모임방 이름입니다. 모임방...", participants = 22, maxParticipants = 30, @@ -201,5 +193,5 @@ fun MyGroupListFilterScreenPreview() { genreIndex = 0 ) ) - MyGroupScreen(allDataList = dataList) + GroupMyScreen(allDataList = dataList) } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt b/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt index 10b6726d..bf02cb39 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt @@ -1,19 +1,19 @@ package com.texthip.thip.ui.myPage.viewModel import androidx.lifecycle.ViewModel -import com.texthip.thip.ui.myPage.groupPage.MyGroupCardData -import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData +import com.texthip.thip.ui.myPage.groupPage.GroupCardData +import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import com.texthip.thip.R class MyPageViewModel : ViewModel() { - private val _myGroups = MutableStateFlow>(emptyList()) - val myGroups: StateFlow> = _myGroups + private val _myGroups = MutableStateFlow>(emptyList()) + val myGroups: StateFlow> = _myGroups - private val _deadlineRooms = MutableStateFlow>(emptyList()) - val deadlineRooms: StateFlow> = _deadlineRooms + private val _deadlineRooms = MutableStateFlow>(emptyList()) + val deadlineRooms: StateFlow> = _deadlineRooms private val _genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술") val genres: List get() = _genres @@ -24,19 +24,19 @@ class MyPageViewModel : ViewModel() { // 초기 데이터 세팅 (실제에선 repository/remote에서 받아옴) init { _myGroups.value = listOf( - MyGroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1"), - MyGroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1"), - MyGroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1") + GroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1"), + GroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1"), + GroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1") ) _deadlineRooms.value = listOf( - CardItemRoomData("시집만 읽는 사람들 3월", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 - CardItemRoomData("일본 소설 좋아하는 사람들", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 - CardItemRoomData("명작 같이 읽기방", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 + GroupCardItemRoomData("시집만 읽는 사람들 3월", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 + GroupCardItemRoomData("일본 소설 좋아하는 사람들", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 + GroupCardItemRoomData("명작 같이 읽기방", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 - CardItemRoomData("물리책 읽는 방", 13, 20, true, 1, R.drawable.bookcover_sample, 1), // 과학·IT - CardItemRoomData("코딩 과학 동아리", 12, 15, true, 5, R.drawable.bookcover_sample, 1), // 과학·IT + GroupCardItemRoomData("물리책 읽는 방", 13, 20, true, 1, R.drawable.bookcover_sample, 1), // 과학·IT + GroupCardItemRoomData("코딩 과학 동아리", 12, 15, true, 5, R.drawable.bookcover_sample, 1), // 과학·IT - CardItemRoomData("사회과학 인문 탐구", 8, 12, true, 4, R.drawable.bookcover_sample, 2), // 사회과학 + GroupCardItemRoomData("사회과학 인문 탐구", 8, 12, true, 4, R.drawable.bookcover_sample, 2), // 사회과학 ) } @@ -51,11 +51,11 @@ class MyPageViewModel : ViewModel() { // 내 모임방 리스트로 이동 (Nav 이벤트 트리거 등) } - fun onMyGroupCardClick(data: MyGroupCardData) { + fun onMyGroupCardClick(data: GroupCardData) { // 내 모임방 카드 클릭 (상세 진입) } - fun onRoomCardClick(data: CardItemRoomData) { + fun onRoomCardClick(data: GroupCardItemRoomData) { // 마감임박 카드 클릭 (상세 진입) } From dee751b3c2d14331ac7f241af7041824d9781e5e Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:48:47 +0900 Subject: [PATCH 22/29] =?UTF-8?q?[refactor]:=20=ED=8C=8C=EC=9D=BC=EB=AA=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20enum=20class=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{MainSectionHeader.kt => GroupMySectionHeader.kt} | 4 ++-- .../myPage/myGroup/{FilterRow.kt => GroupMyRoomFilterRow.kt} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename app/src/main/java/com/texthip/thip/ui/myPage/groupPage/{MainSectionHeader.kt => GroupMySectionHeader.kt} (94%) rename app/src/main/java/com/texthip/thip/ui/myPage/myGroup/{FilterRow.kt => GroupMyRoomFilterRow.kt} (96%) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMySectionHeader.kt similarity index 94% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMySectionHeader.kt index 8dca9de0..27ddb760 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/MainSectionHeader.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMySectionHeader.kt @@ -19,7 +19,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun MainSectionHeader(onClick: (() -> Unit)? = null) { +fun GroupMySectionHeader(onClick: (() -> Unit)? = null) { Row( Modifier .fillMaxWidth() @@ -46,5 +46,5 @@ fun MainSectionHeader(onClick: (() -> Unit)? = null) { @Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360) @Composable fun PreviewMainSectionHeader() { - MainSectionHeader(){} + GroupMySectionHeader(){} } diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyRoomFilterRow.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt rename to app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyRoomFilterRow.kt index ea638465..afbb519d 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/FilterRow.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyRoomFilterRow.kt @@ -9,7 +9,7 @@ import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.OptionChipButton @Composable -fun FilterRow( +fun GroupMyRoomFilterRow( selectedStates: BooleanArray, onToggle: (Int) -> Unit ) { From bdb5e85cce9125580a4f175700b428e4e316d226 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:49:49 +0900 Subject: [PATCH 23/29] =?UTF-8?q?[feat]:=20Chip=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/common/buttons/OptionChipButton.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 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 22069b2e..1e492a6e 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 @@ -30,22 +30,24 @@ fun OptionChipButton( modifier: Modifier = Modifier, text: String, isFilled: Boolean = false, + isSelected: Boolean? = null, // 추가 onClick: () -> Unit, ) { var isClicked by remember { mutableStateOf(false) } + val checked = isSelected ?: isClicked val textColor = when { isFilled -> colors.White - isClicked -> colors.Purple + checked -> colors.Purple else -> colors.Grey01 } val backgroundColor = when { - isFilled && isClicked -> colors.Purple + isFilled && checked -> colors.Purple isFilled -> colors.DarkGrey else -> Color.Transparent } val borderColor = when { - !isFilled && isClicked -> colors.Purple + !isFilled && checked -> colors.Purple !isFilled -> colors.Grey02 else -> Color.Transparent } @@ -62,7 +64,7 @@ fun OptionChipButton( shape = RoundedCornerShape(20.dp) ) .clickable { - isClicked = !isClicked + if (isSelected == null) isClicked = !isClicked onClick() } .padding(vertical = 8.dp, horizontal = 12.dp), From bf69a77ad8b8f12a07693abf23b9cd353b6a262e Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:28:25 +0900 Subject: [PATCH 24/29] =?UTF-8?q?[UI]:=20=EB=8F=85=EC=84=9C=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=EB=B0=A9=EC=9D=84=20Pager=EB=A1=9C=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../myPage/groupPage/DeadlineRoomSection.kt | 199 ------------- .../groupPage/GroupDeadlineRoomSection.kt | 261 ++++++++++++++++++ .../thip/ui/myPage/groupPage/GroupMainCard.kt | 27 +- .../ui/myPage/groupPage/GroupPageScreen.kt | 25 +- .../thip/ui/myPage/groupPage/GroupPager.kt | 101 +++---- .../myPage/groupPage/GroupRoomSectionData.kt | 9 + .../ui/myPage/viewModel/MyPageViewModel.kt | 70 +++-- 7 files changed, 397 insertions(+), 295 deletions(-) delete mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomSection.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupRoomSectionData.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt deleted file mode 100644 index 81106adb..00000000 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/DeadlineRoomSection.kt +++ /dev/null @@ -1,199 +0,0 @@ -package com.texthip.thip.ui.myPage.groupPage - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.pager.HorizontalPager -import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Brush -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.cards.CardItemRoom -import com.texthip.thip.ui.myPage.myGroup.CardItemRoomData -import com.texthip.thip.ui.theme.ThipTheme.colors -import com.texthip.thip.ui.theme.ThipTheme.typography - -@Composable -fun DeadlineRoomSection( - rooms: List, - selectedGenre: Int, - onRoomClick: (CardItemRoomData) -> Unit, - genres: List, - onGenreSelect: (Int) -> Unit -) { - val pagerState = rememberPagerState(initialPage = selectedGenre, pageCount = { genres.size }) - - // pager <-> chip 연동 - LaunchedEffect(pagerState.currentPage) { - if (selectedGenre != pagerState.currentPage) { - onGenreSelect(pagerState.currentPage) - } - } - LaunchedEffect(selectedGenre) { - if (pagerState.currentPage != selectedGenre) { - pagerState.scrollToPage(selectedGenre) - } - } - - Column( - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp) - ) { - Box( - modifier = Modifier - .fillMaxWidth() - .background( - brush = Brush.verticalGradient( - colors = listOf(colors.Grey03, colors.DarkGrey, colors.Black) - ), - shape = RoundedCornerShape(14.dp) - ) - .padding(vertical = 20.dp, horizontal = 12.dp) - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text( - text = stringResource(R.string.deadlineString), - style = typography.title_b700_s20_h24, - color = colors.White - ) - Spacer(Modifier.height(40.dp)) - GenreChipRow( - genres = genres, - selectedIndex = selectedGenre, - onSelect = { idx -> onGenreSelect(idx) } - ) - Spacer(Modifier.height(20.dp)) - - HorizontalPager( - state = pagerState, - modifier = Modifier - .fillMaxWidth() - .height(434.dp), - pageSpacing = 20.dp // 각 페이지(장르) 사이의 간격! - ) { page -> - // page == genreIndex - val cards = rooms.filter { it.genreIndex == page }.take(3) - Column( - verticalArrangement = Arrangement.spacedBy(20.dp), - modifier = Modifier.fillMaxWidth() - ) { - cards.forEach { room -> - CardItemRoom( - title = room.title, - participants = room.participants, - maxParticipants = room.maxParticipants, - isRecruiting = room.isRecruiting, - endDate = room.endDate, - imageRes = room.imageRes, - onClick = { onRoomClick(room) }, - hasBorder = true, // 카드에 테두리 추가 - ) - } - // 카드가 3개보다 적을 때 Spacer를 아래에 추가 - if (cards.size < 3) { - Spacer( - modifier = Modifier - .weight(1f, fill = true) - .fillMaxWidth() - ) - } - } - } - // 아래 인디케이터 (장르 개수만큼) - SimplePagerIndicator( - pageCount = genres.size, - currentPage = pagerState.currentPage, - modifier = Modifier - .padding(top = 28.dp) - ) - } - } - } -} - - -@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 720) -@Composable -fun PreviewDeadlineRoomSection() { - val genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술") - val rooms = listOf( - CardItemRoomData( - title = "시집만 읽는 사람들 3월", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3, - genreIndex = 0 - ), - CardItemRoomData( - title = "일본 소설 좋아하는 사람들", - participants = 15, - maxParticipants = 20, - isRecruiting = true, - endDate = 2, - genreIndex = 0 - ), - CardItemRoomData( - title = "명작 같이 읽기방", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3, - genreIndex = 0 - ), - CardItemRoomData( - title = "물리책 읽는 방", - participants = 13, - maxParticipants = 20, - isRecruiting = true, - endDate = 1, - genreIndex = 1 - ), - CardItemRoomData( - title = "코딩 과학 동아리", - participants = 12, - maxParticipants = 15, - isRecruiting = true, - endDate = 5, - genreIndex = 1 - ), - CardItemRoomData( - title = "사회과학 인문 탐구", - participants = 8, - maxParticipants = 12, - isRecruiting = true, - endDate = 4, - genreIndex = 2 - ), - ) - var selectedGenre by remember { mutableStateOf(0) } - DeadlineRoomSection( - rooms = rooms, - selectedGenre = selectedGenre, - onRoomClick = {}, - genres = genres, - onGenreSelect = { selectedGenre = it } - ) -} - diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomSection.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomSection.kt new file mode 100644 index 00000000..819c4c67 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomSection.kt @@ -0,0 +1,261 @@ +package com.texthip.thip.ui.myPage.groupPage + +import android.annotation.SuppressLint +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.graphicsLayer +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.cards.CardItemRoom +import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData +import com.texthip.thip.ui.theme.ThipTheme +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@SuppressLint("UnusedBoxWithConstraintsScope") +@Composable +fun GroupRoomDeadlineSection( + roomSections: List, + onRoomClick: (GroupCardItemRoomData) -> Unit +) { + val cardWidth = 320.dp // 카드 폭 원하는 값으로 맞추기! + val pageSpacing = 12.dp + + val pagerState = rememberPagerState( + initialPage = 0, + pageCount = { roomSections.size } + ) + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + ) { + BoxWithConstraints( + modifier = Modifier + .fillMaxWidth() + .height(588.dp), + contentAlignment = Alignment.Center + ) { + val horizontalPadding = ((maxWidth - cardWidth) / 2).coerceAtLeast(0.dp) + + HorizontalPager( + state = pagerState, + contentPadding = PaddingValues(horizontal = horizontalPadding), + pageSpacing = pageSpacing, + modifier = Modifier.fillMaxWidth() + ) { page -> + val section = roomSections[page] + var selectedGenre by remember { mutableStateOf(0) } + + val isCurrent = pagerState.currentPage == page + val scale = if (isCurrent) 1f else 0.9f + + Box( + modifier = Modifier + .width(cardWidth) + .graphicsLayer { + scaleX = scale + scaleY = scale + } + .fillMaxHeight() + .background( + brush = Brush.verticalGradient( + colors = listOf( + colors.White.copy(alpha = if (isCurrent) 0.3f else 0.2f), + colors.Black.copy(alpha = if (isCurrent) 0.2f else 0.15f) + ) + ), + shape = RoundedCornerShape(14.dp) + ) + .padding(vertical = 20.dp, horizontal = 12.dp) + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = section.title, + style = typography.title_b700_s20_h24, + color = colors.White + ) + Spacer(Modifier.height(40.dp)) + + GenreChipRow( + genres = section.genres, + selectedIndex = selectedGenre, + onSelect = { idx -> selectedGenre = idx } + ) + Spacer(Modifier.height(20.dp)) + + val cards = section.rooms.filter { it.genreIndex == selectedGenre }.take(3) + Column( + verticalArrangement = Arrangement.spacedBy(20.dp), + modifier = Modifier.fillMaxWidth() + ) { + cards.forEach { room -> + CardItemRoom( + title = room.title, + participants = room.participants, + maxParticipants = room.maxParticipants, + isRecruiting = room.isRecruiting, + endDate = room.endDate, + imageRes = room.imageRes, + onClick = { onRoomClick(room) }, + hasBorder = true, + ) + } + if (cards.size < 3) { + Spacer( + modifier = Modifier + .weight(1f, fill = true) + .fillMaxWidth() + ) + } + } + } + } + } + } + + SimplePagerIndicator( + pageCount = roomSections.size, + currentPage = pagerState.currentPage, + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 8.dp) + ) + } +} + +@Preview() +@Composable +fun PreviewGroupRoomPagerSection() { + ThipTheme { + val genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술") + + // 마감 임박한 독서 모임방 + val deadlineRooms = listOf( + GroupCardItemRoomData( + title = "시집만 읽는 사람들 3월", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "일본 소설 좋아하는 사람들", + participants = 15, + maxParticipants = 20, + isRecruiting = true, + endDate = 2, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "명작 같이 읽기방", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "물리책 읽는 방", + participants = 13, + maxParticipants = 20, + isRecruiting = true, + endDate = 1, + genreIndex = 1 + ) + ) + + // 인기 있는 독서 모임방 + val popularRooms = listOf( + GroupCardItemRoomData( + title = "베스트셀러 토론방", + participants = 28, + maxParticipants = 30, + isRecruiting = true, + endDate = 7, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "인기 소설 완독방", + participants = 25, + maxParticipants = 25, + isRecruiting = false, + endDate = 5, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "트렌드 과학서 읽기", + participants = 20, + maxParticipants = 25, + isRecruiting = true, + endDate = 10, + genreIndex = 1 + ) + ) + + // 인플루언서, 작가 독서 모임방 + val influencerRooms = listOf( + GroupCardItemRoomData( + title = "작가와 함께하는 독서방", + participants = 30, + maxParticipants = 30, + isRecruiting = false, + endDate = 14, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "유명 북튜버와 읽기", + participants = 18, + maxParticipants = 20, + isRecruiting = true, + endDate = 8, + genreIndex = 2 + ), + GroupCardItemRoomData( + title = "작가 초청 인문학방", + participants = 15, + maxParticipants = 20, + isRecruiting = true, + endDate = 12, + genreIndex = 3 + ) + ) + + val roomSections = listOf( + GroupRoomSectionData( + title = stringResource(R.string.deadlineString), + rooms = deadlineRooms, + genres = genres + ), + GroupRoomSectionData( + title = "인기 있는 독서 모임방", + rooms = popularRooms, + genres = genres + ), + GroupRoomSectionData( + title = "인플루언서·작가 독서 모임방", + rooms = influencerRooms, + genres = genres + ) + ) + + GroupRoomDeadlineSection( + roomSections = roomSections, + onRoomClick = {} + ) + } +} diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt index a1f8cbb0..f93620dd 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt @@ -33,6 +33,7 @@ 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.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -144,17 +145,19 @@ fun GroupMainCard( } -@Preview(showBackground = true, backgroundColor = 0xFF222222, widthDp = 380, heightDp = 170) +@Preview() @Composable fun PreviewMyGroupMainCard() { - GroupMainCard( - data = GroupCardData( - title = "호르몬 체인지 완독하는 방", - members = 22, - imageRes = R.drawable.bookcover_sample, - progress = 42, - nickname = "uibowl님의" - ), - onClick = {} - ) -} + ThipTheme { + GroupMainCard( + data = GroupCardData( + title = "호르몬 체인지 완독하는 방", + members = 22, + imageRes = R.drawable.bookcover_sample, + progress = 42, + nickname = "uibowl님의" + ), + onClick = {} + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt index ef665b67..d39d733e 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Spacer 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.runtime.Composable import androidx.compose.runtime.collectAsState @@ -22,6 +23,7 @@ import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.FloatingButton import com.texthip.thip.ui.common.topappbar.LogoTopAppBar import com.texthip.thip.ui.myPage.viewModel.MyPageViewModel +import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors @@ -31,13 +33,12 @@ fun GroupPageScreen( viewModel: MyPageViewModel = viewModel() ) { val myGroups by viewModel.myGroups.collectAsState() - val deadlineRooms by viewModel.deadlineRooms.collectAsState() - val selectedGenre by viewModel.selectedGenreIndex.collectAsState() - val genres = viewModel.genres + val roomSections by viewModel.roomSections.collectAsState() Box( Modifier .background(colors.Black) + .padding(bottom = 32.dp) .fillMaxSize() ) { LazyColumn( @@ -84,12 +85,9 @@ fun GroupPageScreen( } // 마감 임박한 독서 모임방 item { - GroupDeadlineRoomSection( - rooms = deadlineRooms, - selectedGenre = selectedGenre, - onRoomClick = { viewModel.onRoomCardClick(it) }, - genres = genres, - onGenreSelect = { viewModel.selectGenre(it) } + GroupRoomDeadlineSection( + roomSections = roomSections, + onRoomClick = { viewModel.onRoomCardClick(it) } ) } } @@ -102,10 +100,11 @@ fun GroupPageScreen( } -@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 900) +@Preview() @Composable fun PreviewMainGroupScreen() { - val previewViewModel = remember { MyPageViewModel() } - GroupPageScreen(viewModel = previewViewModel) + ThipTheme { + val previewViewModel = remember { MyPageViewModel() } + GroupPageScreen(viewModel = previewViewModel) + } } - diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt index ae3d55b7..7d09b317 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt @@ -1,10 +1,7 @@ package com.texthip.thip.ui.myPage.groupPage -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.* import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable @@ -13,56 +10,59 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors +@SuppressLint("UnusedBoxWithConstraintsScope") @Composable fun GroupPager( groupCards: List, onCardClick: (GroupCardData) -> Unit ) { - // Pager 상태 - val pagerState = rememberPagerState( - initialPage = 0, - pageCount = { maxOf(1, groupCards.size) } - ) + val cardWidth = 320.dp + val pageSpacing = 6.dp - Box( + BoxWithConstraints( modifier = Modifier .fillMaxWidth() - .height(208.dp), + .height(210.dp), contentAlignment = Alignment.Center ) { + val screenWidth = maxWidth + val horizontalPadding = ((screenWidth - cardWidth) / 2).coerceAtLeast(0.dp) + + val pagerState = rememberPagerState( + initialPage = 0, + pageCount = { maxOf(1, groupCards.size) } + ) + HorizontalPager( state = pagerState, - contentPadding = PaddingValues(horizontal = 20.dp), // peek 공간 - pageSpacing = (-10).dp, + contentPadding = PaddingValues(start = horizontalPadding, end = horizontalPadding), + pageSpacing = pageSpacing, modifier = Modifier.fillMaxWidth() ) { page -> - - // 페이지와 현재페이지의 거리(0이면 중앙, 1/-1이면 peek) - val distanceFromCenter = (pagerState.currentPage - page).toFloat() - // scale 계산 (중앙은 1f, peek은 0.93~0.97f) - val scale = if (pagerState.currentPage == page) 1f else 0.86f - // 색상 변경 (peek이면 밝은 회색, 중앙이면 흰색) - val bgColor = if (pagerState.currentPage == page) colors.White else colors.DarkGrey - // alpha(살짝 흐리게)도 가능 + val isCurrent = pagerState.currentPage == page + val scale = if (isCurrent) 1f else 0.86f + val bgColor = if (isCurrent) colors.White else colors.DarkGrey Box( modifier = Modifier + .width(cardWidth) .graphicsLayer { scaleX = scale scaleY = scale - alpha = if (pagerState.currentPage == page) 1f else 0.7f + alpha = if (isCurrent) 1f else 0.7f } ) { GroupMainCard( data = groupCards[page], onClick = { onCardClick(groupCards[page]) }, - backgroundColor = bgColor // Card에서 배경색 파라미터 추가 + backgroundColor = bgColor ) } } - // 아래 Indicator + SimplePagerIndicator( pageCount = groupCards.size, currentPage = pagerState.currentPage, @@ -73,32 +73,33 @@ fun GroupPager( } } -@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 220) +@Preview() @Composable fun PreviewMyGroupPager() { - val list = listOf( - GroupCardData( - title = "호르몬 체인지 완독하는 방", - members = 22, - imageRes = com.texthip.thip.R.drawable.bookcover_sample, - progress = 40, - nickname = "uibowl1님" - ), - GroupCardData( - title = "명작 읽기방", - members = 10, - imageRes = com.texthip.thip.R.drawable.bookcover_sample, - progress = 70, - nickname = "joyce님" - ), - GroupCardData( - title = "또 다른 방", - members = 13, - imageRes = com.texthip.thip.R.drawable.bookcover_sample, - progress = 10, - nickname = "other님" + ThipTheme { + val list = listOf( + GroupCardData( + title = "호르몬 체인지 완독하는 방", + members = 22, + imageRes = com.texthip.thip.R.drawable.bookcover_sample, + progress = 40, + nickname = "uibowl1님" + ), + GroupCardData( + title = "명작 읽기방", + members = 10, + imageRes = com.texthip.thip.R.drawable.bookcover_sample, + progress = 70, + nickname = "joyce님" + ), + GroupCardData( + title = "또 다른 방", + members = 13, + imageRes = com.texthip.thip.R.drawable.bookcover_sample, + progress = 10, + nickname = "other님" + ) ) - ) - GroupPager(groupCards = list, onCardClick = {}) + GroupPager(groupCards = list, onCardClick = {}) + } } - diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupRoomSectionData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupRoomSectionData.kt new file mode 100644 index 00000000..c36270aa --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupRoomSectionData.kt @@ -0,0 +1,9 @@ +package com.texthip.thip.ui.myPage.groupPage + +import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData + +data class GroupRoomSectionData( + val title: String, + val rooms: List, + val genres: List +) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt b/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt index bf02cb39..7c3a06a4 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt @@ -2,6 +2,7 @@ package com.texthip.thip.ui.myPage.viewModel import androidx.lifecycle.ViewModel import com.texthip.thip.ui.myPage.groupPage.GroupCardData +import com.texthip.thip.ui.myPage.groupPage.GroupRoomSectionData import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -12,39 +13,66 @@ class MyPageViewModel : ViewModel() { private val _myGroups = MutableStateFlow>(emptyList()) val myGroups: StateFlow> = _myGroups - private val _deadlineRooms = MutableStateFlow>(emptyList()) - val deadlineRooms: StateFlow> = _deadlineRooms + private val _roomSections = MutableStateFlow>(emptyList()) + val roomSections: StateFlow> = _roomSections private val _genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술") val genres: List get() = _genres - private val _selectedGenreIndex = MutableStateFlow(0) - val selectedGenreIndex: StateFlow = _selectedGenreIndex - // 초기 데이터 세팅 (실제에선 repository/remote에서 받아옴) init { _myGroups.value = listOf( GroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1"), - GroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1"), - GroupCardData("호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1") + GroupCardData("명작 읽기방", 10, R.drawable.bookcover_sample, 70, "joyce"), + GroupCardData("또 다른 방", 13, R.drawable.bookcover_sample, 10, "other") ) - _deadlineRooms.value = listOf( - GroupCardItemRoomData("시집만 읽는 사람들 3월", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 - GroupCardItemRoomData("일본 소설 좋아하는 사람들", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 - GroupCardItemRoomData("명작 같이 읽기방", 22, 30, true, 3, R.drawable.bookcover_sample, 0), // 문학 - GroupCardItemRoomData("물리책 읽는 방", 13, 20, true, 1, R.drawable.bookcover_sample, 1), // 과학·IT - GroupCardItemRoomData("코딩 과학 동아리", 12, 15, true, 5, R.drawable.bookcover_sample, 1), // 과학·IT + // 마감 임박한 독서 모임방 + val deadlineRooms = listOf( + GroupCardItemRoomData("시집만 읽는 사람들 3월", 22, 30, true, 3, R.drawable.bookcover_sample, 0), + GroupCardItemRoomData("일본 소설 좋아하는 사람들", 15, 20, true, 2, R.drawable.bookcover_sample, 0), + GroupCardItemRoomData("명작 같이 읽기방", 22, 30, true, 3, R.drawable.bookcover_sample, 0), + GroupCardItemRoomData("물리책 읽는 방", 13, 20, true, 1, R.drawable.bookcover_sample, 1), + GroupCardItemRoomData("코딩 과학 동아리", 12, 15, true, 5, R.drawable.bookcover_sample, 1), + GroupCardItemRoomData("사회과학 인문 탐구", 8, 12, true, 4, R.drawable.bookcover_sample, 2) + ) - GroupCardItemRoomData("사회과학 인문 탐구", 8, 12, true, 4, R.drawable.bookcover_sample, 2), // 사회과학 + // 인기 있는 독서 모임방 + val popularRooms = listOf( + GroupCardItemRoomData("베스트셀러 토론방", 28, 30, true, 7, R.drawable.bookcover_sample, 0), + GroupCardItemRoomData("인기 소설 완독방", 25, 25, false, 5, R.drawable.bookcover_sample, 0), + GroupCardItemRoomData("트렌드 과학서 읽기", 20, 25, true, 10, R.drawable.bookcover_sample, 1), + GroupCardItemRoomData("화제의 경영서", 18, 20, true, 8, R.drawable.bookcover_sample, 2), + GroupCardItemRoomData("인기 철학서 모임", 15, 18, true, 12, R.drawable.bookcover_sample, 3), + GroupCardItemRoomData("예술서 베스트", 12, 15, true, 6, R.drawable.bookcover_sample, 4) ) - } + // 인플루언서, 작가 독서 모임방 + val influencerRooms = listOf( + GroupCardItemRoomData("작가와 함께하는 독서방", 30, 30, false, 14, R.drawable.bookcover_sample, 0), + GroupCardItemRoomData("유명 북튜버와 읽기", 18, 20, true, 8, R.drawable.bookcover_sample, 2), + GroupCardItemRoomData("작가 초청 인문학방", 15, 20, true, 12, R.drawable.bookcover_sample, 3), + GroupCardItemRoomData("인플루언서 과학책", 22, 25, true, 9, R.drawable.bookcover_sample, 1), + GroupCardItemRoomData("유명작가 예술론", 16, 18, true, 11, R.drawable.bookcover_sample, 4) + ) - // 선택 장르 변경 - fun selectGenre(index: Int) { - _selectedGenreIndex.value = index - // 필요하면 장르에 따라 _deadlineRooms 필터링도 여기서 처리 + _roomSections.value = listOf( + GroupRoomSectionData( + title = "마감 임박한 독서 모임방", + rooms = deadlineRooms, + genres = _genres + ), + GroupRoomSectionData( + title = "인기 있는 독서 모임방", + rooms = popularRooms, + genres = _genres + ), + GroupRoomSectionData( + title = "인플루언서·작가 독서 모임방", + rooms = influencerRooms, + genres = _genres + ) + ) } fun onMyGroupHeaderClick() { @@ -56,10 +84,10 @@ class MyPageViewModel : ViewModel() { } fun onRoomCardClick(data: GroupCardItemRoomData) { - // 마감임박 카드 클릭 (상세 진입) + // 방 카드 클릭 (상세 진입) } fun onFabClick() { // FAB 클릭(모임방 생성 등) } -} +} \ No newline at end of file From 8e005c4a57c0a9ac673c956479438245c8bb3ced Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 15:04:15 +0900 Subject: [PATCH 25/29] =?UTF-8?q?[refactor]:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../myroom/component}/GenreChipRow.kt | 2 +- .../component}/GroupDeadlineRoomSection.kt | 9 +- .../myroom/component}/GroupMainCard.kt | 3 +- .../myroom/component}/GroupMyRoomFilterRow.kt | 2 +- .../myroom/component}/GroupMySectionHeader.kt | 2 +- .../myroom/component}/GroupPager.kt | 10 +- .../myroom/component}/GroupSearchTextField.kt | 2 +- .../myroom/component}/SimplePagerIndicator.kt | 2 +- .../myroom/mock}/GroupBookData.kt | 2 +- .../myroom/mock}/GroupBottomButtonType.kt | 2 +- .../myroom/mock}/GroupCardData.kt | 2 +- .../myroom/mock}/GroupCardItemRoomData.kt | 2 +- .../myroom/mock/GroupDeadlineRoomData.kt | 6 + .../myroom/mock}/GroupRoomData.kt | 4 +- .../myroom/mock}/GroupRoomSectionData.kt | 4 +- .../myroom/mock/GroupViewModel.kt} | 9 +- .../myroom/screen}/GroupMyScreen.kt | 4 +- .../myroom/screen}/GroupRoomScreen.kt | 7 +- .../thip/ui/group/screen/GroupScreen.kt | 111 ++++++++++++++++-- .../texthip/thip/ui/myPage/MyPageScreen.kt | 19 +++ .../myPage/groupPage/GroupDeadlineRoomData.kt | 8 -- .../ui/myPage/groupPage/GroupPageScreen.kt | 110 ----------------- .../texthip/thip/ui/navigator/MainNavHost.kt | 4 +- 23 files changed, 165 insertions(+), 161 deletions(-) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupPage => group/myroom/component}/GenreChipRow.kt (95%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupPage => group/myroom/component}/GroupDeadlineRoomSection.kt (96%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupPage => group/myroom/component}/GroupMainCard.kt (98%) rename app/src/main/java/com/texthip/thip/ui/{myPage/myGroup => group/myroom/component}/GroupMyRoomFilterRow.kt (94%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupPage => group/myroom/component}/GroupMySectionHeader.kt (96%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupPage => group/myroom/component}/GroupPager.kt (91%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupPage => group/myroom/component}/GroupSearchTextField.kt (98%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupPage => group/myroom/component}/SimplePagerIndicator.kt (96%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupRoom => group/myroom/mock}/GroupBookData.kt (82%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupRoom => group/myroom/mock}/GroupBottomButtonType.kt (55%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupPage => group/myroom/mock}/GroupCardData.kt (82%) rename app/src/main/java/com/texthip/thip/ui/{myPage/myGroup => group/myroom/mock}/GroupCardItemRoomData.kt (87%) create mode 100644 app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupDeadlineRoomData.kt rename app/src/main/java/com/texthip/thip/ui/{myPage/groupRoom => group/myroom/mock}/GroupRoomData.kt (73%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupPage => group/myroom/mock}/GroupRoomSectionData.kt (54%) rename app/src/main/java/com/texthip/thip/ui/{myPage/viewModel/MyPageViewModel.kt => group/myroom/mock/GroupViewModel.kt} (94%) rename app/src/main/java/com/texthip/thip/ui/{myPage/myGroup => group/myroom/screen}/GroupMyScreen.kt (97%) rename app/src/main/java/com/texthip/thip/ui/{myPage/groupRoom => group/myroom/screen}/GroupRoomScreen.kt (97%) create mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt delete mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomData.kt delete mode 100644 app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GenreChipRow.kt similarity index 95% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GenreChipRow.kt index 4ddf3292..ae3fa69a 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GenreChipRow.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GenreChipRow.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupPage +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomSection.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomSection.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt index 819c4c67..d1ceb23b 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupPage +package com.texthip.thip.ui.group.myroom.component import android.annotation.SuppressLint import androidx.compose.foundation.background @@ -17,7 +17,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R import com.texthip.thip.ui.common.cards.CardItemRoom -import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData +import com.texthip.thip.ui.group.myroom.mock.GroupRoomSectionData +import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -72,8 +73,8 @@ fun GroupRoomDeadlineSection( .background( brush = Brush.verticalGradient( colors = listOf( - colors.White.copy(alpha = if (isCurrent) 0.3f else 0.2f), - colors.Black.copy(alpha = if (isCurrent) 0.2f else 0.15f) + colors.White.copy(0.25f), + colors.Black.copy(0.2f) ) ), shape = RoundedCornerShape(14.dp) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt similarity index 98% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt index f93620dd..bccf2043 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMainCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupPage +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -33,6 +33,7 @@ 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.group.myroom.mock.GroupCardData import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyRoomFilterRow.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt similarity index 94% rename from app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyRoomFilterRow.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt index afbb519d..db70b2ef 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyRoomFilterRow.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.myGroup +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMySectionHeader.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMySectionHeader.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt index 27ddb760..685f00e9 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupMySectionHeader.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupPage +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Row diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt similarity index 91% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt index 7d09b317..5268b5f6 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPager.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupPage +package com.texthip.thip.ui.group.myroom.component import android.annotation.SuppressLint import androidx.compose.foundation.layout.* @@ -10,6 +10,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.group.myroom.mock.GroupCardData import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors @@ -81,21 +83,21 @@ fun PreviewMyGroupPager() { GroupCardData( title = "호르몬 체인지 완독하는 방", members = 22, - imageRes = com.texthip.thip.R.drawable.bookcover_sample, + imageRes = R.drawable.bookcover_sample, progress = 40, nickname = "uibowl1님" ), GroupCardData( title = "명작 읽기방", members = 10, - imageRes = com.texthip.thip.R.drawable.bookcover_sample, + imageRes = R.drawable.bookcover_sample, progress = 70, nickname = "joyce님" ), GroupCardData( title = "또 다른 방", members = 13, - imageRes = com.texthip.thip.R.drawable.bookcover_sample, + imageRes = R.drawable.bookcover_sample, progress = 10, nickname = "other님" ) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupSearchTextField.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt similarity index 98% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupSearchTextField.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt index 1747b94f..dd2aa17d 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupSearchTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupPage +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/SimplePagerIndicator.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/SimplePagerIndicator.kt index 9416cc24..983c8fe1 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/SimplePagerIndicator.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/SimplePagerIndicator.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupPage +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBookData.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupBookData.kt similarity index 82% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBookData.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupBookData.kt index 48ffc9a5..ee24be4c 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBookData.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupBookData.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupRoom +package com.texthip.thip.ui.group.myroom.mock import com.texthip.thip.R diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBottomButtonType.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupBottomButtonType.kt similarity index 55% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBottomButtonType.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupBottomButtonType.kt index 31e2a113..90ca8e0f 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupBottomButtonType.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupBottomButtonType.kt @@ -1,3 +1,3 @@ -package com.texthip.thip.ui.myPage.groupRoom +package com.texthip.thip.ui.group.myroom.mock enum class GroupBottomButtonType { JOIN, CANCEL, CLOSE } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupCardData.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardData.kt similarity index 82% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupCardData.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardData.kt index 0a3794a5..dab51e6b 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupCardData.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardData.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupPage +package com.texthip.thip.ui.group.myroom.mock import com.texthip.thip.R diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupCardItemRoomData.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardItemRoomData.kt similarity index 87% rename from app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupCardItemRoomData.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardItemRoomData.kt index 68ed6038..b3fcedc2 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupCardItemRoomData.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardItemRoomData.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.myGroup +package com.texthip.thip.ui.group.myroom.mock import com.texthip.thip.R diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupDeadlineRoomData.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupDeadlineRoomData.kt new file mode 100644 index 00000000..a83fe0e5 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupDeadlineRoomData.kt @@ -0,0 +1,6 @@ +package com.texthip.thip.ui.group.myroom.mock + +data class GroupDeadlineRoomData( + val genre: String, + val rooms: List +) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomData.kt similarity index 73% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomData.kt index de07d96e..925273ec 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomData.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomData.kt @@ -1,6 +1,4 @@ -package com.texthip.thip.ui.myPage.groupRoom - -import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData +package com.texthip.thip.ui.group.myroom.mock data class GroupRoomData( val title: String, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupRoomSectionData.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomSectionData.kt similarity index 54% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupRoomSectionData.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomSectionData.kt index c36270aa..756f33b7 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupRoomSectionData.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomSectionData.kt @@ -1,6 +1,4 @@ -package com.texthip.thip.ui.myPage.groupPage - -import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData +package com.texthip.thip.ui.group.myroom.mock data class GroupRoomSectionData( val title: String, diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupViewModel.kt similarity index 94% rename from app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupViewModel.kt index 7c3a06a4..79139a7b 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/viewModel/MyPageViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupViewModel.kt @@ -1,14 +1,11 @@ -package com.texthip.thip.ui.myPage.viewModel +package com.texthip.thip.ui.group.myroom.mock import androidx.lifecycle.ViewModel -import com.texthip.thip.ui.myPage.groupPage.GroupCardData -import com.texthip.thip.ui.myPage.groupPage.GroupRoomSectionData -import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData +import com.texthip.thip.R import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import com.texthip.thip.R -class MyPageViewModel : ViewModel() { +class GroupViewModel : ViewModel() { private val _myGroups = MutableStateFlow>(emptyList()) val myGroups: StateFlow> = _myGroups diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt similarity index 97% rename from app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt index adf2aa31..8d10f168 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/myGroup/GroupMyScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.myGroup +package com.texthip.thip.ui.group.myroom.screen import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -22,6 +22,8 @@ import com.texthip.thip.R import com.texthip.thip.ui.theme.ThipTheme.colors import androidx.compose.foundation.lazy.items import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData +import com.texthip.thip.ui.group.myroom.component.GroupMyRoomFilterRow @Composable fun GroupMyScreen( diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt similarity index 97% rename from app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt index abc9a193..52991f37 100644 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupRoom/GroupRoomScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.myPage.groupRoom +package com.texthip.thip.ui.group.myroom.screen import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -29,7 +29,10 @@ import com.texthip.thip.R import com.texthip.thip.ui.common.cards.CardItemRoomSmall import com.texthip.thip.ui.common.cards.CardRoomBook import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar -import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData +import com.texthip.thip.ui.group.myroom.mock.GroupBookData +import com.texthip.thip.ui.group.myroom.mock.GroupBottomButtonType +import com.texthip.thip.ui.group.myroom.mock.GroupRoomData +import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography diff --git a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt index e33da902..e3423352 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt @@ -1,19 +1,114 @@ package com.texthip.thip.ui.group.screen +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.Text +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.runtime.Composable -import androidx.compose.ui.Alignment +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.navigation.NavController +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavHostController +import com.texthip.thip.R +import com.texthip.thip.ui.common.buttons.FloatingButton +import com.texthip.thip.ui.common.topappbar.LogoTopAppBar +import com.texthip.thip.ui.group.myroom.component.GroupMySectionHeader +import com.texthip.thip.ui.group.myroom.component.GroupPager +import com.texthip.thip.ui.group.myroom.component.GroupRoomDeadlineSection +import com.texthip.thip.ui.group.myroom.component.GroupSearchTextField +import com.texthip.thip.ui.group.myroom.mock.GroupViewModel +import com.texthip.thip.ui.theme.ThipTheme +import com.texthip.thip.ui.theme.ThipTheme.colors + @Composable -fun GroupScreen(navController: NavController) { +fun GroupScreen( + navController: NavHostController? = null, + viewModel: GroupViewModel = viewModel() +) { + val myGroups by viewModel.myGroups.collectAsState() + val roomSections by viewModel.roomSections.collectAsState() + Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center + Modifier + .background(colors.Black) + .padding(bottom = 32.dp) + .fillMaxSize() ) { - Text(text = "Group Screen") + LazyColumn( + Modifier + .fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(0.dp) + ) { + // 상단바 + item { + LogoTopAppBar( + leftIcon = painterResource(R.drawable.ic_done), + hasNotification = false, + onLeftClick = { }, + onRightClick = { } + ) + Spacer(Modifier.height(16.dp)) + } + // 검색창 + item { + GroupSearchTextField(onValueChange = { }) + Spacer(Modifier.height(32.dp)) + } + // 내 모임방 헤더 + 카드 + item { + GroupMySectionHeader( + onClick = { viewModel.onMyGroupHeaderClick() } + ) + Spacer(Modifier.height(20.dp)) + + GroupPager( + groupCards = myGroups, + onCardClick = { viewModel.onMyGroupCardClick(it) } + ) + Spacer(Modifier.height(40.dp)) + } + item { + Spacer( + Modifier + .height(10.dp) + .fillMaxWidth() + .background(color = colors.DarkGrey02) + ) + Spacer(Modifier.height(32.dp)) + } + // 마감 임박한 독서 모임방 + item { + GroupRoomDeadlineSection( + roomSections = roomSections, + onRoomClick = { viewModel.onRoomCardClick(it) } + ) + } + } + // 오른쪽 하단 FAB + FloatingButton( + icon = painterResource(id = R.drawable.ic_makegroup), + onClick = { viewModel.onFabClick() } + ) + } +} + + +@Preview() +@Composable +fun PreviewGroupScreen() { + ThipTheme { + val previewViewModel = remember { GroupViewModel() } + GroupScreen(viewModel = previewViewModel) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt new file mode 100644 index 00000000..0f35fe9a --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/myPage/MyPageScreen.kt @@ -0,0 +1,19 @@ +package com.texthip.thip.ui.myPage + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.navigation.NavController + +@Composable +fun MyPageScreen(navController: NavController) { + Box( + modifier = Modifier.Companion.fillMaxSize(), + contentAlignment = Alignment.Companion.Center + ) { + Text(text = "MyPage Screen") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomData.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomData.kt deleted file mode 100644 index 4db539d8..00000000 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupDeadlineRoomData.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.texthip.thip.ui.myPage.groupPage - -import com.texthip.thip.ui.myPage.myGroup.GroupCardItemRoomData - -data class GroupDeadlineRoomData( - val genre: String, - val rooms: List -) diff --git a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt b/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt deleted file mode 100644 index d39d733e..00000000 --- a/app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt +++ /dev/null @@ -1,110 +0,0 @@ -package com.texthip.thip.ui.myPage.groupPage - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Spacer -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.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel -import androidx.navigation.NavHostController -import com.texthip.thip.R -import com.texthip.thip.ui.common.buttons.FloatingButton -import com.texthip.thip.ui.common.topappbar.LogoTopAppBar -import com.texthip.thip.ui.myPage.viewModel.MyPageViewModel -import com.texthip.thip.ui.theme.ThipTheme -import com.texthip.thip.ui.theme.ThipTheme.colors - - -@Composable -fun GroupPageScreen( - navController: NavHostController? = null, - viewModel: MyPageViewModel = viewModel() -) { - val myGroups by viewModel.myGroups.collectAsState() - val roomSections by viewModel.roomSections.collectAsState() - - Box( - Modifier - .background(colors.Black) - .padding(bottom = 32.dp) - .fillMaxSize() - ) { - LazyColumn( - Modifier - .fillMaxSize(), - verticalArrangement = Arrangement.spacedBy(0.dp) - ) { - // 상단바 - item { - LogoTopAppBar( - leftIcon = painterResource(R.drawable.ic_done), - hasNotification = false, - onLeftClick = { }, - onRightClick = { } - ) - Spacer(Modifier.height(16.dp)) - } - // 검색창 - item { - GroupSearchTextField(onValueChange = { }) - Spacer(Modifier.height(32.dp)) - } - // 내 모임방 헤더 + 카드 - item { - GroupMySectionHeader( - onClick = { viewModel.onMyGroupHeaderClick() } - ) - Spacer(Modifier.height(20.dp)) - - GroupPager( - groupCards = myGroups, - onCardClick = { viewModel.onMyGroupCardClick(it) } - ) - Spacer(Modifier.height(40.dp)) - } - item { - Spacer( - Modifier - .height(10.dp) - .fillMaxWidth() - .background(color = colors.DarkGrey02) - ) - Spacer(Modifier.height(32.dp)) - } - // 마감 임박한 독서 모임방 - item { - GroupRoomDeadlineSection( - roomSections = roomSections, - onRoomClick = { viewModel.onRoomCardClick(it) } - ) - } - } - // 오른쪽 하단 FAB - FloatingButton( - icon = painterResource(id = com.texthip.thip.R.drawable.ic_makegroup), - onClick = { viewModel.onFabClick() } - ) - } -} - - -@Preview() -@Composable -fun PreviewMainGroupScreen() { - ThipTheme { - val previewViewModel = remember { MyPageViewModel() } - GroupPageScreen(viewModel = previewViewModel) - } -} diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt b/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt index cc690add..19102a72 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt @@ -7,7 +7,7 @@ import androidx.navigation.NavHostController import com.texthip.thip.ui.bookSearch.screen.BookSearchScreen import com.texthip.thip.ui.feed.screen.FeedScreen import com.texthip.thip.ui.group.screen.GroupScreen -import com.texthip.thip.ui.myPage.groupPage.GroupPageScreen +import com.texthip.thip.ui.myPage.MyPageScreen @Composable fun MainNavHost(navController: NavHostController) { @@ -15,6 +15,6 @@ fun MainNavHost(navController: NavHostController) { composable(Routes.Feed.route) { FeedScreen(navController) } composable(Routes.Group.route) { GroupScreen(navController) } composable(Routes.BookSearch.route) { BookSearchScreen(navController) } - composable(Routes.MyPage.route) { GroupPageScreen(navController) } + composable(Routes.MyPage.route) { MyPageScreen(navController) } } } \ No newline at end of file From 3e8bf5cdf7dc9fae2d7ae32d7f58f13cbcb46af4 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 15:21:41 +0900 Subject: [PATCH 26/29] =?UTF-8?q?[ui]:=20String=20=EC=B6=94=EC=B6=9C=20?= =?UTF-8?q?=EB=B0=8F=20LazyColumn=EC=9D=84=20Column=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/myroom/component/GroupMainCard.kt | 2 +- .../ui/group/myroom/component/GroupPager.kt | 3 +- .../thip/ui/group/screen/GroupScreen.kt | 87 +++++++++---------- app/src/main/res/values/strings.xml | 2 +- 4 files changed, 45 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt index bccf2043..eb0ef457 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt @@ -156,7 +156,7 @@ fun PreviewMyGroupMainCard() { members = 22, imageRes = R.drawable.bookcover_sample, progress = 42, - nickname = "uibowl님의" + nickname = "uibowl" ), onClick = {} ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt index 5268b5f6..69147a66 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt @@ -27,8 +27,7 @@ fun GroupPager( BoxWithConstraints( modifier = Modifier .fillMaxWidth() - .height(210.dp), - contentAlignment = Alignment.Center + .height(192.dp) ) { val screenWidth = maxWidth val horizontalPadding = ((screenWidth - cardWidth) / 2).coerceAtLeast(0.dp) diff --git a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt index e3423352..cfd918e8 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt @@ -3,12 +3,14 @@ package com.texthip.thip.ui.group.screen import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer 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.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -38,62 +40,57 @@ fun GroupScreen( ) { val myGroups by viewModel.myGroups.collectAsState() val roomSections by viewModel.roomSections.collectAsState() + val scrollState = rememberScrollState() Box( Modifier .background(colors.Black) - .padding(bottom = 32.dp) .fillMaxSize() ) { - LazyColumn( + Column( Modifier - .fillMaxSize(), - verticalArrangement = Arrangement.spacedBy(0.dp) + .fillMaxSize() + .verticalScroll(scrollState) ) { // 상단바 - item { - LogoTopAppBar( - leftIcon = painterResource(R.drawable.ic_done), - hasNotification = false, - onLeftClick = { }, - onRightClick = { } - ) - Spacer(Modifier.height(16.dp)) - } + LogoTopAppBar( + leftIcon = painterResource(R.drawable.ic_done), + hasNotification = false, + onLeftClick = { }, + onRightClick = { } + ) + Spacer(Modifier.height(16.dp)) + // 검색창 - item { - GroupSearchTextField(onValueChange = { }) - Spacer(Modifier.height(32.dp)) - } + GroupSearchTextField(onValueChange = { }) + Spacer(Modifier.height(32.dp)) + // 내 모임방 헤더 + 카드 - item { - GroupMySectionHeader( - onClick = { viewModel.onMyGroupHeaderClick() } - ) - Spacer(Modifier.height(20.dp)) + GroupMySectionHeader( + onClick = { viewModel.onMyGroupHeaderClick() } + ) + Spacer(Modifier.height(20.dp)) + + GroupPager( + groupCards = myGroups, + onCardClick = { viewModel.onMyGroupCardClick(it) } + ) + Spacer(Modifier.height(40.dp)) + + Spacer( + Modifier + .height(10.dp) + .fillMaxWidth() + .background(color = colors.DarkGrey02) + ) + Spacer(Modifier.height(32.dp)) - GroupPager( - groupCards = myGroups, - onCardClick = { viewModel.onMyGroupCardClick(it) } - ) - Spacer(Modifier.height(40.dp)) - } - item { - Spacer( - Modifier - .height(10.dp) - .fillMaxWidth() - .background(color = colors.DarkGrey02) - ) - Spacer(Modifier.height(32.dp)) - } // 마감 임박한 독서 모임방 - item { - GroupRoomDeadlineSection( - roomSections = roomSections, - onRoomClick = { viewModel.onRoomCardClick(it) } - ) - } + GroupRoomDeadlineSection( + roomSections = roomSections, + onRoomClick = { viewModel.onRoomCardClick(it) } + ) + Spacer(Modifier.height(32.dp)) } // 오른쪽 하단 FAB FloatingButton( @@ -111,4 +108,4 @@ fun PreviewGroupScreen() { val previewViewModel = remember { GroupViewModel() } GroupScreen(viewModel = previewViewModel) } -} +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98356dac..a3ddf569 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,7 +66,7 @@ 마감 임박한 독서 모임방 내 모임방 %1$s명 참여 - "%1$s의 진행도 " + "%1$s님의 진행도 " 모임방 참여할 사람! %1$s일 뒤 모집 마감 %1$s / %2$s From 59e7cda0c114353f7d0799a311ef024e438fc07f Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 15:22:23 +0900 Subject: [PATCH 27/29] =?UTF-8?q?[refactor]:=20preview=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../myroom/mock/GroupDeadlineRoomData.kt | 6 - .../ui/group/myroom/screen/GroupMyScreen.kt | 209 +++++++++--------- .../ui/group/myroom/screen/GroupRoomScreen.kt | 181 +++++++-------- 3 files changed, 199 insertions(+), 197 deletions(-) delete mode 100644 app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupDeadlineRoomData.kt diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupDeadlineRoomData.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupDeadlineRoomData.kt deleted file mode 100644 index a83fe0e5..00000000 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupDeadlineRoomData.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.texthip.thip.ui.group.myroom.mock - -data class GroupDeadlineRoomData( - val genre: String, - val rooms: List -) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt index 8d10f168..3301b9ee 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.ui.common.cards.CardItemRoom import androidx.compose.foundation.background +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -24,6 +25,7 @@ import androidx.compose.foundation.lazy.items import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData import com.texthip.thip.ui.group.myroom.component.GroupMyRoomFilterRow +import com.texthip.thip.ui.theme.ThipTheme @Composable fun GroupMyScreen( @@ -50,7 +52,6 @@ fun GroupMyScreen( Modifier .background(colors.Black) .fillMaxSize() - .padding(bottom = 20.dp) ) { DefaultTopAppBar( title = stringResource(R.string.myGroupRoom), @@ -75,7 +76,9 @@ fun GroupMyScreen( LazyColumn( verticalArrangement = Arrangement.spacedBy(20.dp), - modifier = Modifier.fillMaxSize() + contentPadding = PaddingValues(bottom = 20.dp), + modifier = Modifier + .fillMaxSize() ) { items(filteredList) { item -> CardItemRoom( @@ -94,106 +97,108 @@ fun GroupMyScreen( } -@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 800) +@Preview() @Composable fun MyGroupListFilterScreenPreview() { - val dataList = listOf( - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 30, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 1, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 3, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 30, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 1, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 3, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 3, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 30, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = true, - endDate = 1, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "모임방 이름입니다. 모임방...", - participants = 22, - maxParticipants = 30, - isRecruiting = false, - endDate = 3, - genreIndex = 0 + ThipTheme { + val dataList = listOf( + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 30, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 1, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 30, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 1, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 3, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 30, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = true, + endDate = 1, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "모임방 이름입니다. 모임방...", + participants = 22, + maxParticipants = 30, + isRecruiting = false, + endDate = 3, + genreIndex = 0 + ) ) - ) - GroupMyScreen(allDataList = dataList) -} + GroupMyScreen(allDataList = dataList) + } +} \ No newline at end of file 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/myroom/screen/GroupRoomScreen.kt index 52991f37..53e06909 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/myroom/screen/GroupRoomScreen.kt @@ -33,6 +33,7 @@ import com.texthip.thip.ui.group.myroom.mock.GroupBookData import com.texthip.thip.ui.group.myroom.mock.GroupBottomButtonType import com.texthip.thip.ui.group.myroom.mock.GroupRoomData import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData +import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -281,103 +282,105 @@ fun GroupRoomScreen( } } -@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360, heightDp = 900) +@Preview() @Composable fun GroupRoomDetailScreenPreview_AllCases() { - val recommendations = listOf( - GroupCardItemRoomData( - title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", - participants = 19, - maxParticipants = 25, - isRecruiting = true, - endDate = 2, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", - participants = 12, - maxParticipants = 16, - isRecruiting = true, - endDate = 6, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", - participants = 30, - maxParticipants = 30, - isRecruiting = false, - endDate = 0, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", - participants = 10, - maxParticipants = 12, - isRecruiting = true, - endDate = 8, - genreIndex = 0 - ), - GroupCardItemRoomData( - title = "에세이 나눔방", - participants = 14, - maxParticipants = 20, - isRecruiting = true, - endDate = 4, - genreIndex = 0 + ThipTheme { + val recommendations = listOf( + GroupCardItemRoomData( + title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", + participants = 19, + maxParticipants = 25, + isRecruiting = true, + endDate = 2, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", + participants = 12, + maxParticipants = 16, + isRecruiting = true, + endDate = 6, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", + participants = 30, + maxParticipants = 30, + isRecruiting = false, + endDate = 0, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "일본 소설 좋아하는 사람들 일본 소설 좋아하는 사람들", + participants = 10, + maxParticipants = 12, + isRecruiting = true, + endDate = 8, + genreIndex = 0 + ), + GroupCardItemRoomData( + title = "에세이 나눔방", + participants = 14, + maxParticipants = 20, + isRecruiting = true, + endDate = 4, + genreIndex = 0 + ) ) - ) - - val bookData = GroupBookData( - title = "심장보다 단단한 토마토 한 알", - author = "고선지", - publisher = "푸른출판사", - description = "‘시집만 읽는 사람들’ 3월 모임에서 읽는 시집. 상처받고 단단해진 마음을 담은 감동적인 시와 해설이 어우러진 책으로, 읽는 이로 하여금 자신의 이야기를 투영하게 하는 힘이 있다.", - imageRes = R.drawable.bookcover_sample - ) - val detailJoin = GroupRoomData( - title = "시집만 읽는 사람들 3월", - isSecret = true, - description = "‘시집만 읽는 사람들’ 3월 모임입니다. 이번 달 모임에서는 심장보다 단단한 토마토 한 알을 함께 읽어요.", - period = "2025.01.12 ~ 2025.02.12", - members = 22, - maxMembers = 30, - daysLeft = 4, - genre = "고전 문학", - bookData = bookData, - recommendations = recommendations - ) - val detailCancel = detailJoin.copy( - title = "참여 중인 독서모임", - isSecret = false, - members = 17 - ) - val detailHost = detailJoin.copy( - title = "내가 호스트인 독서모임", - isSecret = false, - members = 30, - maxMembers = 30 - ) + val bookData = GroupBookData( + title = "심장보다 단단한 토마토 한 알", + author = "고선지", + publisher = "푸른출판사", + description = "‘시집만 읽는 사람들’ 3월 모임에서 읽는 시집. 상처받고 단단해진 마음을 담은 감동적인 시와 해설이 어우러진 책으로, 읽는 이로 하여금 자신의 이야기를 투영하게 하는 힘이 있다.", + imageRes = R.drawable.bookcover_sample + ) - Column(verticalArrangement = Arrangement.spacedBy(32.dp)) { - // 1. 참여 가능한 경우(참여하기) - GroupRoomScreen( - detail = detailJoin, - buttonType = GroupBottomButtonType.JOIN, - onBottomButtonClick = {} + val detailJoin = GroupRoomData( + title = "시집만 읽는 사람들 3월", + isSecret = true, + description = "‘시집만 읽는 사람들’ 3월 모임입니다. 이번 달 모임에서는 심장보다 단단한 토마토 한 알을 함께 읽어요.", + period = "2025.01.12 ~ 2025.02.12", + members = 22, + maxMembers = 30, + daysLeft = 4, + genre = "고전 문학", + bookData = bookData, + recommendations = recommendations ) - // 2. 참여 중인 경우(참여 취소하기) - GroupRoomScreen( - detail = detailCancel, - buttonType = GroupBottomButtonType.CANCEL, - onBottomButtonClick = {} + val detailCancel = detailJoin.copy( + title = "참여 중인 독서모임", + isSecret = false, + members = 17 ) - // 3. 내가 호스트인 경우(모집 마감하기) - GroupRoomScreen( - detail = detailHost, - buttonType = GroupBottomButtonType.CLOSE, - onBottomButtonClick = {} + val detailHost = detailJoin.copy( + title = "내가 호스트인 독서모임", + isSecret = false, + members = 30, + maxMembers = 30 ) + + Column(verticalArrangement = Arrangement.spacedBy(32.dp)) { + // 1. 참여 가능한 경우(참여하기) + GroupRoomScreen( + detail = detailJoin, + buttonType = GroupBottomButtonType.JOIN, + onBottomButtonClick = {} + ) + // 2. 참여 중인 경우(참여 취소하기) + GroupRoomScreen( + detail = detailCancel, + buttonType = GroupBottomButtonType.CANCEL, + onBottomButtonClick = {} + ) + // 3. 내가 호스트인 경우(모집 마감하기) + GroupRoomScreen( + detail = detailHost, + buttonType = GroupBottomButtonType.CLOSE, + onBottomButtonClick = {} + ) + } } } From b879c35bf33fad90afb4749bc84d6ffff19537ff Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 15:37:05 +0900 Subject: [PATCH 28/29] =?UTF-8?q?[refactor]:=20StringResource=EB=A5=BC=20s?= =?UTF-8?q?nake=5Fcase=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/cards/CardItemRoom.kt | 10 ++-- .../thip/ui/common/cards/CardItemRoomSmall.kt | 2 +- .../component/GroupDeadlineRoomSection.kt | 2 +- .../group/myroom/component/GroupMainCard.kt | 4 +- .../myroom/component/GroupMyRoomFilterRow.kt | 2 +- .../myroom/component/GroupMySectionHeader.kt | 2 +- .../myroom/component/GroupSearchTextField.kt | 2 +- .../ui/group/myroom/screen/GroupMyScreen.kt | 2 +- .../ui/group/myroom/screen/GroupRoomScreen.kt | 22 ++++---- app/src/main/res/values/strings.xml | 50 +++++++++---------- 10 files changed, 49 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt index 0185b1ea..8e4a8457 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt @@ -113,12 +113,12 @@ fun CardItemRoom( Text( text = if (isRecruiting) { stringResource( - R.string.CardItemParicipantCount, + R.string.card_item_participant_count, participants, maxParticipants ) } else { - stringResource(R.string.CardItemParticipant, participants) + stringResource(R.string.card_item_participant, participants) }, color = colors.White, style = typography.info_m500_s12, @@ -127,11 +127,11 @@ fun CardItemRoom( Spacer(modifier = Modifier.height(5.dp)) Text( text = stringResource( - R.string.CardItemEndDate, + R.string.card_item_end_date, endDate ) + if (isRecruiting) stringResource( - R.string.CardItemEnd - ) else stringResource(R.string.CardItemFinish), + R.string.card_item_end + ) else stringResource(R.string.card_item_finish), color = if (isRecruiting) colors.Red else colors.Grey01, style = typography.menu_sb600_s12_h20, diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt index 0f92e95f..4e35ce6e 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt @@ -107,7 +107,7 @@ fun CardItemRoomSmall( } Spacer(modifier = Modifier.height(4.dp)) Text( - text = stringResource(R.string.cardItemEndDate, endDate), + text = stringResource(R.string.card_item_end_date_recruit, endDate), color = colors.Red, style = typography.menu_sb600_s12_h20 ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt index d1ceb23b..33b3c408 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt @@ -238,7 +238,7 @@ fun PreviewGroupRoomPagerSection() { val roomSections = listOf( GroupRoomSectionData( - title = stringResource(R.string.deadlineString), + title = stringResource(R.string.deadline_string), rooms = deadlineRooms, genres = genres ), diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt index eb0ef457..6e80f31b 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt @@ -108,7 +108,7 @@ fun GroupMainCard( ) Spacer(Modifier.width(2.dp)) Text( - text = stringResource(R.string.groupParticipant, data.members), + text = stringResource(R.string.group_participant, data.members), color = colors.Grey02, style = typography.menu_sb600_s12, ) @@ -117,7 +117,7 @@ fun GroupMainCard( // 닉네임 + 진행도 Row(verticalAlignment = Alignment.Bottom) { Text( - text = stringResource(R.string.groupProgress, data.nickname), + text = stringResource(R.string.group_progress, data.nickname), color = colors.Grey02, style = typography.view_m500_s14 ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt index db70b2ef..dfa8e3d6 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt @@ -17,7 +17,7 @@ fun GroupMyRoomFilterRow( horizontalArrangement = Arrangement.spacedBy(12.dp) ) { OptionChipButton( - text = stringResource(R.string.onGoing), + text = stringResource(R.string.on_going), isFilled = true, onClick = { onToggle(0) } ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt index 685f00e9..2148e1f1 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt @@ -28,7 +28,7 @@ fun GroupMySectionHeader(onClick: (() -> Unit)? = null) { verticalAlignment = Alignment.CenterVertically ) { Text( - text = stringResource(R.string.myGroup), + text = stringResource(R.string.my_group), style = typography.title_b700_s20_h24, color = colors.White ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt index dd2aa17d..b5d2bbcf 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt @@ -50,7 +50,7 @@ fun GroupSearchTextField( .fillMaxWidth(), placeholder = { Text( - text = stringResource(R.string.groupSearchPlaceHolder), + text = stringResource(R.string.group_search_placeholder), color = colors.Grey02, style = typography.menu_r400_s14_h24.copy(lineHeight = 2.sp) ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt index 3301b9ee..722ab1b8 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt @@ -54,7 +54,7 @@ fun GroupMyScreen( .fillMaxSize() ) { DefaultTopAppBar( - title = stringResource(R.string.myGroupRoom), + title = stringResource(R.string.my_group_room), onLeftClick = {}, ) Column( 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/myroom/screen/GroupRoomScreen.kt index 53e06909..863e73db 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/myroom/screen/GroupRoomScreen.kt @@ -90,7 +90,7 @@ fun GroupRoomScreen( //소개글 Text( - text = stringResource(R.string.groupRoomDesc), + text = stringResource(R.string.group_room_desc), style = typography.menu_sb600_s14_h24, color = colors.White, ) @@ -120,7 +120,7 @@ fun GroupRoomScreen( tint = colors.White ) Text( - text = stringResource(R.string.groupPeroid), + text = stringResource(R.string.group_period), style = typography.view_m500_s12_h20, color = colors.White ) @@ -144,7 +144,7 @@ fun GroupRoomScreen( tint = colors.White ) Text( - text = stringResource(R.string.groupMate), + text = stringResource(R.string.group_mate), style = typography.view_m500_s12_h20, color = colors.White ) @@ -152,7 +152,7 @@ fun GroupRoomScreen( Spacer(Modifier.height(12.dp)) Text( text = stringResource( - R.string.GroupRoomScreenParticipantCount, + R.string.group_room_screen_participant_count, detail.members, detail.maxMembers ), @@ -174,13 +174,13 @@ fun GroupRoomScreen( ) { Row { Text( - text = stringResource(R.string.groupRecruiting), + text = stringResource(R.string.group_recruiting), style = typography.info_m500_s12, color = colors.White ) Text( text = stringResource( - R.string.GroupRoomScreenEndDate, + R.string.group_room_screen_end_date, detail.daysLeft ), style = typography.info_m500_s12, @@ -197,7 +197,7 @@ fun GroupRoomScreen( ) { Row { Text( - text = stringResource(R.string.groupGenre), + text = stringResource(R.string.group_genre), style = typography.info_m500_s12, color = colors.White ) @@ -224,7 +224,7 @@ fun GroupRoomScreen( Spacer(Modifier.height(40.dp)) Text( - text = stringResource(R.string.groupRecommend), + text = stringResource(R.string.group_recommend), style = typography.smalltitle_sb600_s18_h24, color = colors.White ) @@ -252,9 +252,9 @@ fun GroupRoomScreen( // 하단 버튼 val buttonText = when (buttonType) { - GroupBottomButtonType.JOIN -> stringResource(R.string.GroupRoomScreenParticipant) - GroupBottomButtonType.CANCEL -> stringResource(R.string.GroupRoomScreenCancle) - GroupBottomButtonType.CLOSE -> stringResource(R.string.GroupRoomScreenEnd) + GroupBottomButtonType.JOIN -> stringResource(R.string.group_room_screen_participant) + GroupBottomButtonType.CANCEL -> stringResource(R.string.group_room_screen_cancel) + GroupBottomButtonType.CLOSE -> stringResource(R.string.group_room_screen_end) } val buttonColor = when (buttonType) { GroupBottomButtonType.JOIN -> colors.Purple diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a3ddf569..2660834c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -39,11 +39,12 @@ 시간 전 변경 - "%1$s일 뒤 " - 모집 마감 - 종료 - %1$s명 참여 - %1$s / %2$s명 + "%1$s일 뒤 " + 모집 마감 + 종료 + %1$s명 참여 + %1$s / %2$s명 + %1$s일 뒤 모집 마감 해당 도서는 %1$dp까지만 있습니다. @@ -53,27 +54,26 @@ 다음 페이지명 - - 진행중 + + 진행중 모집중 - 내 모임방 - 소개글 - 모임 활동 기간 - 참여 중인 독서 메이트 - 이런 모임방은 어때요? - "모집 " - "장르 " - 마감 임박한 독서 모임방 - 내 모임방 - %1$s명 참여 - "%1$s님의 진행도 " - 모임방 참여할 사람! - %1$s일 뒤 모집 마감 - %1$s / %2$s - %1$s일 남음 - 참여하기 - 참여 취소하기 - 모집 마감하기 + 내 모임방 + 소개글 + 모임 활동 기간 + 참여 중인 독서 메이트 + 이런 모임방은 어때요? + "모집 " + "장르 " + 마감 임박한 독서 모임방 + 내 모임방 + %1$s명 참여 + "%1$s님의 진행도 " + 모임방 참여할 사람! + %1$s / %2$s + %1$s일 남음 + 참여하기 + 참여 취소하기 + 모집 마감하기 \ No newline at end of file From f46d9db9328b12f67fdea26d6c601f429c5b31a9 Mon Sep 17 00:00:00 2001 From: JoGyuBin <128724038+rbqks529@users.noreply.github.com> Date: Wed, 2 Jul 2025 16:43:37 +0900 Subject: [PATCH 29/29] =?UTF-8?q?[ui]:=20=EC=84=B8=EB=B6=80=EC=A0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20stringResource=20=EC=B6=94=EC=B6=9C=20?= =?UTF-8?q?=EB=B0=8F=20ui=20=EB=94=94=ED=85=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/cards/CardInputBook.kt | 2 +- .../thip/ui/common/cards/CardItemRoom.kt | 58 ++++++++++++++----- .../thip/ui/common/cards/CardItemRoomSmall.kt | 29 ++++++++-- .../thip/ui/common/cards/CardRoomBook.kt | 31 ++++++++-- .../component/GroupDeadlineRoomSection.kt | 2 +- .../group/myroom/component/GroupMainCard.kt | 48 +++++++++------ .../myroom/component/GroupSearchTextField.kt | 2 +- .../ui/group/myroom/mock/GroupRoomData.kt | 3 +- .../ui/group/myroom/screen/GroupMyScreen.kt | 4 +- .../ui/group/myroom/screen/GroupRoomScreen.kt | 47 ++++++++++----- app/src/main/res/values/strings.xml | 20 +++++-- 11 files changed, 177 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt index e6b322af..5a59a36f 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardInputBook.kt @@ -74,7 +74,7 @@ fun CardInputBook( ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "$author 저", + text = stringResource(R.string.card_input_author, author), style = typography.view_m500_s12_h20, color = colors.Grey01 ) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt index 8e4a8457..5a7b8137 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt @@ -41,9 +41,9 @@ fun CardItemRoom( participants: Int, maxParticipants: Int, isRecruiting: Boolean, - endDate: Int, // 남은 일 수 (예: 3) + endDate: Int, imageRes: Int? = R.drawable.bookcover_sample, - hasBorder: Boolean = false, // <-- 추가 + hasBorder: Boolean = false, onClick: () -> Unit = {} ) { Card( @@ -110,21 +110,51 @@ fun CardItemRoom( tint = Color.White ) Spacer(modifier = Modifier.width(4.dp)) - Text( - text = if (isRecruiting) { - stringResource( - R.string.card_item_participant_count, - participants, - maxParticipants + + if (isRecruiting) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource( + R.string.card_item_participant_count, + participants, + ), + style = typography.menu_sb600_s12, + color = colors.White ) - } else { - stringResource(R.string.card_item_participant, participants) - }, - color = colors.White, - style = typography.info_m500_s12, - ) + Spacer(modifier = Modifier.width(2.dp)) + + Text( + text = stringResource( + R.string.card_item_participant_count_max, + maxParticipants + ), + style = typography.info_m500_s12, + color = colors.Grey + ) + } + } else { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource(R.string.card_item_participant, participants), + style = typography.menu_sb600_s12, + color = colors.White + ) + Spacer(modifier = Modifier.width(2.dp)) + + Text( + text = stringResource(R.string.card_item_participant_string), + style = typography.info_m500_s12, + color = colors.Grey + ) + } + } } Spacer(modifier = Modifier.height(5.dp)) + Text( text = stringResource( R.string.card_item_end_date, diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt index 4e35ce6e..8cac5e5b 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt @@ -38,7 +38,7 @@ fun CardItemRoomSmall( title: String, participants: Int, maxParticipants: Int, - endDate: Int, // 남은 일 수 (예: 3) + endDate: Int, imageRes: Int? = R.drawable.bookcover_sample_small, onClick: () -> Unit = {} ) { @@ -99,11 +99,28 @@ fun CardItemRoomSmall( ) Spacer(modifier = Modifier.width(4.dp)) - Text ( - text = "$participants / ${maxParticipants}명", - color = colors.White, - style = typography.info_m500_s12 - ) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource( + R.string.card_item_participant_count, + participants, + ), + style = typography.menu_sb600_s12, + color = colors.White + ) + Spacer(modifier = Modifier.width(2.dp)) + + Text( + text = stringResource( + R.string.card_item_participant_count_max, + maxParticipants + ), + style = typography.info_m500_s12, + color = colors.Grey + ) + } } Spacer(modifier = Modifier.height(4.dp)) Text( diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt index 109a37c4..80c68feb 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardRoomBook.kt @@ -25,6 +25,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview @@ -109,16 +110,34 @@ fun CardRoomBook( ) { Spacer(modifier = Modifier.height(7.dp)) - Text( - text = "$author 저 · $publisher", - color = colors.White, - style = typography.info_m500_s12, - ) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource(R.string.card_author, author), + color = colors.White, + style = typography.info_m500_s12, + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = "·", + color = colors.Grey02, + style = typography.info_m500_s12, + ) + Spacer(modifier = Modifier.width(4.dp)) + + Text( + text = publisher, + color = colors.White, + style = typography.info_m500_s12, + ) + + } Spacer(modifier = Modifier.height(21.dp)) Text( - text = "도서 소개", + text = stringResource(R.string.card_book_explain), color = colors.White, style = typography.info_m500_s12, ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt index 33b3c408..c7e3f7a8 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt @@ -29,7 +29,7 @@ fun GroupRoomDeadlineSection( roomSections: List, onRoomClick: (GroupCardItemRoomData) -> Unit ) { - val cardWidth = 320.dp // 카드 폭 원하는 값으로 맞추기! + val cardWidth = 320.dp val pageSpacing = 12.dp val pagerState = rememberPagerState( diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt index 6e80f31b..98ac640b 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -54,10 +55,6 @@ fun GroupMainCard( end = Offset(1000f, 1000f) ) - val progressState by remember(data.progress) { - mutableFloatStateOf(data.progress / 100f) - } - Card( modifier = Modifier .width(320.dp) @@ -107,11 +104,22 @@ fun GroupMainCard( modifier = Modifier.size(20.dp) ) Spacer(Modifier.width(2.dp)) - Text( - text = stringResource(R.string.group_participant, data.members), - color = colors.Grey02, - style = typography.menu_sb600_s12, - ) + + Row ( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource(R.string.group_participant, data.members), + color = colors.Grey02, + style = typography.menu_sb600_s12, + ) + Spacer(Modifier.width(2.dp)) + Text( + text = stringResource(R.string.group_participant_string), + color = colors.Grey02, + style = typography.info_m500_s12, + ) + } } Spacer(Modifier.height(16.dp)) // 닉네임 + 진행도 @@ -121,6 +129,7 @@ fun GroupMainCard( color = colors.Grey02, style = typography.view_m500_s14 ) + Spacer(Modifier.width(4.dp)) Text( text = "${data.progress}%", color = colors.Purple, @@ -128,16 +137,21 @@ fun GroupMainCard( ) } Spacer(Modifier.height(10.dp)) - // ProgressBar - LinearProgressIndicator( - progress = { progressState }, + + val percentage = data.progress.toFloat() + Box( modifier = Modifier .fillMaxWidth() - .height(7.dp), - color = colors.Purple, - trackColor = colors.Grey02, - gapSize = (-5).dp // 간격 제거 - ) + .height(8.dp) + .background(color = colors.Grey02, shape = RoundedCornerShape(12.dp)) + ) { + Box( + modifier = Modifier + .fillMaxWidth(fraction = percentage / 100f) + .fillMaxHeight() + .background(color = colors.Purple, shape = RoundedCornerShape(12.dp)) + ) + } Spacer(Modifier.height(2.dp)) } } diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt index b5d2bbcf..073a08c8 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt @@ -31,7 +31,7 @@ fun GroupSearchTextField( onValueChange: (String) -> Unit ) { var value by rememberSaveable { mutableStateOf("") } - val textStyle = typography.menu_r400_s14_h24.copy(lineHeight = 20.sp) // 기본값 제공 + val textStyle = typography.menu_r400_s14_h24.copy(lineHeight = 20.sp) Box( Modifier diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomData.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomData.kt index 925273ec..55468f20 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomData.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupRoomData.kt @@ -4,7 +4,8 @@ data class GroupRoomData( val title: String, val isSecret: Boolean, val description: String, - val period: String, + val startDate: String, + val endDate: String, val members: Int, val maxMembers: Int, val daysLeft: Int, diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt index 722ab1b8..1938fbe2 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt @@ -33,10 +33,8 @@ fun GroupMyScreen( onCardClick: (GroupCardItemRoomData) -> Unit = {} ) { var selectedStates by remember { mutableStateOf(booleanArrayOf(false, false)) } - // [0] = 진행중, [1] = 모집중 val filteredList = remember(selectedStates, allDataList) { - // 둘 다 false면 전체, 둘 다 true면 전체 if (selectedStates.all { !it } || selectedStates.all { it }) { allDataList } else if (selectedStates[0]) { @@ -44,7 +42,7 @@ fun GroupMyScreen( } else if (selectedStates[1]) { allDataList.filter { it.isRecruiting } } else { - allDataList // safety, but 위에서 이미 걸러짐 + allDataList } } 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/myroom/screen/GroupRoomScreen.kt index 863e73db..8fa6adf6 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/myroom/screen/GroupRoomScreen.kt @@ -100,7 +100,7 @@ fun GroupRoomScreen( style = typography.copy_r400_s12_h20, color = colors.Grey, modifier = Modifier - .padding(top = 4.dp, bottom = 18.dp) + .padding(top = 5.dp, bottom = 18.dp) ) @@ -119,6 +119,7 @@ fun GroupRoomScreen( contentDescription = "모임 활동기간", tint = colors.White ) + Spacer(Modifier.width(2.dp)) Text( text = stringResource(R.string.group_period), style = typography.view_m500_s12_h20, @@ -127,7 +128,11 @@ fun GroupRoomScreen( } Spacer(Modifier.height(12.dp)) Text( - text = detail.period, + text = stringResource( + R.string.group_room_period, + detail.startDate, + detail.endDate + ), style = typography.info_r400_s12, color = colors.Grey ) @@ -143,6 +148,7 @@ fun GroupRoomScreen( contentDescription = "참여 중인 독서 메이트", tint = colors.White ) + Spacer(Modifier.width(2.dp)) Text( text = stringResource(R.string.group_mate), style = typography.view_m500_s12_h20, @@ -150,15 +156,27 @@ fun GroupRoomScreen( ) } Spacer(Modifier.height(12.dp)) - Text( - text = stringResource( - R.string.group_room_screen_participant_count, - detail.members, - detail.maxMembers - ), - style = typography.info_r400_s12, - color = colors.White - ) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource( + R.string.group_room_screen_participant_count, + detail.members + ), + style = typography.info_r400_s12, + color = colors.White + ) + Spacer(Modifier.width(2.dp)) + Text( + text = stringResource( + R.string.group_room_screen_participant_count_max, + detail.maxMembers + ), + style = typography.info_m500_s12, + color = colors.Grey + ) + } } } @@ -178,6 +196,7 @@ fun GroupRoomScreen( style = typography.info_m500_s12, color = colors.White ) + Spacer(Modifier.width(4.dp)) Text( text = stringResource( R.string.group_room_screen_end_date, @@ -201,6 +220,7 @@ fun GroupRoomScreen( style = typography.info_m500_s12, color = colors.White ) + Spacer(Modifier.width(4.dp)) Text( text = detail.genre, style = typography.info_m500_s12, @@ -211,7 +231,7 @@ fun GroupRoomScreen( } } - Spacer(Modifier.height(62.dp)) + Spacer(Modifier.height(30.dp)) //읽을 책 정보 CardRoomBook( @@ -341,7 +361,8 @@ fun GroupRoomDetailScreenPreview_AllCases() { title = "시집만 읽는 사람들 3월", isSecret = true, description = "‘시집만 읽는 사람들’ 3월 모임입니다. 이번 달 모임에서는 심장보다 단단한 토마토 한 알을 함께 읽어요.", - period = "2025.01.12 ~ 2025.02.12", + startDate = "2025.01.12", + endDate = "2025.02.12", members = 22, maxMembers = 30, daysLeft = 4, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2660834c..c52a7af8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,9 +42,13 @@ "%1$s일 뒤 " 모집 마감 종료 - %1$s명 참여 - %1$s / %2$s명 + %1$s명 + 참여 + %1$s + / %1$s명 %1$s일 뒤 모집 마감 + 도서 소개 + %1$s 저 해당 도서는 %1$dp까지만 있습니다. @@ -62,18 +66,22 @@ 모임 활동 기간 참여 중인 독서 메이트 이런 모임방은 어때요? - "모집 " - "장르 " + "모집" + "장르" 마감 임박한 독서 모임방 내 모임방 - %1$s명 참여 + %1$s명 + 참여 "%1$s님의 진행도 " 모임방 참여할 사람! - %1$s / %2$s + %1$s + / %1$s명 %1$s일 남음 참여하기 참여 취소하기 모집 마감하기 + %1$s ~ %2$s + %1$s 저 \ No newline at end of file