From 637f5d6427649f9bd088f9a44bfd233644fb66b7 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 17:02:00 +0900 Subject: [PATCH 01/19] =?UTF-8?q?[ui]:=20=EA=B8=B0=EC=A1=B4=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A5=BC=20=EC=9E=AC=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/common/cards/CardBookList.kt | 5 +++-- .../texthip/thip/ui/common/cards/CardBookSearch.kt | 11 +++++++++++ .../{makeroom => }/screen/GroupRegisterBookScreen.kt | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) rename app/src/main/java/com/texthip/thip/ui/group/{makeroom => }/screen/GroupRegisterBookScreen.kt (97%) diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookList.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookList.kt index 544a6555..864ca8ef 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookList.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookList.kt @@ -89,7 +89,8 @@ fun CardBookList( Spacer(modifier = Modifier.width(12.dp)) - IconButton( + // 북마크 아이콘 제거(쓰는 화면이 안보임) + /*IconButton( onClick = onBookmarkClick, modifier = Modifier.size(24.dp) ) { @@ -98,7 +99,7 @@ fun CardBookList( contentDescription = "북마크", tint = if (isBookmarked) colors.Purple else colors.Grey01 ) - } + }*/ } } diff --git a/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookSearch.kt b/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookSearch.kt index e9cdb408..3f66b388 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookSearch.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/cards/CardBookSearch.kt @@ -28,6 +28,7 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun CardBookSearch( modifier: Modifier = Modifier, + number: Int? = null, title: String, imageRes: Int? = R.drawable.bookcover_sample, // 기본 이미지 리소스 onClick: () -> Unit = {} @@ -38,6 +39,15 @@ fun CardBookSearch( .clickable { onClick() }, verticalAlignment = Alignment.CenterVertically ) { + number?.let { + Text( + text = "$it. ", + style = typography.menu_m500_s16_h24, + color = colors.White, + modifier = Modifier.padding(end = 4.dp) + ) + } + // 이미지 Box( modifier = Modifier @@ -74,6 +84,7 @@ fun CardBookSearchPreview() { verticalArrangement = Arrangement.spacedBy(8.dp) ) { CardBookSearch( + number = 1, title = "단 한번의 삶" ) } diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/screen/GroupRegisterBookScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupRegisterBookScreen.kt similarity index 97% rename from app/src/main/java/com/texthip/thip/ui/group/makeroom/screen/GroupRegisterBookScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/screen/GroupRegisterBookScreen.kt index f9ec8805..2003e77d 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/screen/GroupRegisterBookScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupRegisterBookScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.makeroom.screen +package com.texthip.thip.ui.group.screen import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column From 6032cbe76ffe9b651f5f1bcf99c76fde3e8854c1 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 17:03:08 +0900 Subject: [PATCH 02/19] =?UTF-8?q?[ui]:=20=EA=B8=B0=EC=A1=B4=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A5=BC=20=EC=9E=AC=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/RegisterBookScreen.kt} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename app/src/main/java/com/texthip/thip/ui/{group/screen/GroupRegisterBookScreen.kt => common/screen/RegisterBookScreen.kt} (93%) diff --git a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupRegisterBookScreen.kt b/app/src/main/java/com/texthip/thip/ui/common/screen/RegisterBookScreen.kt similarity index 93% rename from app/src/main/java/com/texthip/thip/ui/group/screen/GroupRegisterBookScreen.kt rename to app/src/main/java/com/texthip/thip/ui/common/screen/RegisterBookScreen.kt index 2003e77d..819328e2 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupRegisterBookScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/screen/RegisterBookScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.screen +package com.texthip.thip.ui.common.screen import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -19,7 +19,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun GroupRegisterBookScreen(modifier: Modifier = Modifier) { +fun RegisterBookScreen(modifier: Modifier = Modifier) { Column( modifier = modifier .fillMaxSize(), @@ -61,6 +61,6 @@ fun GroupRegisterBookScreen(modifier: Modifier = Modifier) { @Composable private fun GroupRegisterBookPreview() { ThipTheme { - GroupRegisterBookScreen() + RegisterBookScreen() } } From 73d60bb72c37f06e900af0a0ea5ba14e4fd769fd Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 18:11:09 +0900 Subject: [PATCH 03/19] =?UTF-8?q?[refactor]:=20=EA=B8=B0=EC=A1=B4=20Group?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B0=8F=20divider=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GroupEmptyResult.kt} | 4 +-- .../GroupFilteredSearchResult.kt} | 35 +++++++++---------- .../GroupLiveSearchResult.kt} | 22 ++++++------ .../GroupRecentSearch.kt} | 4 +-- .../group/myroom/screen/GroupSearchScreen.kt | 14 +++++--- .../thip/ui/group/screen/GroupScreen.kt | 3 -- 6 files changed, 42 insertions(+), 40 deletions(-) rename app/src/main/java/com/texthip/thip/ui/group/myroom/{screen/GroupEmptyResultScreen.kt => component/GroupEmptyResult.kt} (93%) rename app/src/main/java/com/texthip/thip/ui/group/myroom/{screen/GroupFilteredSearchResultScreen.kt => component/GroupFilteredSearchResult.kt} (74%) rename app/src/main/java/com/texthip/thip/ui/group/myroom/{screen/GroupLiveSearchResultScreen.kt => component/GroupLiveSearchResult.kt} (70%) rename app/src/main/java/com/texthip/thip/ui/group/myroom/{screen/GroupRecentSearchScreen.kt => component/GroupRecentSearch.kt} (95%) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupEmptyResultScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt similarity index 93% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupEmptyResultScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt index 0cf28824..a0392e85 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupEmptyResultScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -12,7 +12,7 @@ import androidx.compose.ui.unit.dp import com.texthip.thip.ui.theme.ThipTheme @Composable -fun GroupEmptyResultScreen( +fun GroupEmptyResult( mainText: String, subText: String ) { diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupFilteredSearchResult.kt similarity index 74% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupFilteredSearchResult.kt index f18ac4c3..ca254329 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupFilteredSearchResult.kt @@ -1,15 +1,9 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -23,7 +17,7 @@ import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData import com.texthip.thip.ui.theme.ThipTheme @Composable -fun GroupFilteredSearchResultScreen( +fun GroupFilteredSearchResult( genres: List, selectedGenreIndex: Int, onGenreSelect: (Int) -> Unit, @@ -32,6 +26,7 @@ fun GroupFilteredSearchResultScreen( ) { val colors = ThipTheme.colors val typography = ThipTheme.typography + GenreChipRow( modifier = Modifier.width(20.dp), genres = genres, @@ -57,8 +52,9 @@ fun GroupFilteredSearchResultScreen( .height(1.dp) .background(colors.DarkGrey02) ) + if (roomList.isEmpty()) { - GroupEmptyResultScreen( + GroupEmptyResult( mainText = stringResource(R.string.group_no_search_result1), subText = stringResource(R.string.group_no_search_result2) ) @@ -66,7 +62,7 @@ fun GroupFilteredSearchResultScreen( LazyColumn( verticalArrangement = Arrangement.spacedBy(16.dp) ) { - items(roomList) { room -> + itemsIndexed(roomList) { index, room -> CardItemRoomSmall( title = room.title, participants = room.participants, @@ -76,13 +72,16 @@ fun GroupFilteredSearchResultScreen( isWide = true, isSecret = room.isSecret ) - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(colors.DarkGrey02) - ) + if (index < roomList.size - 1) { + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background(colors.DarkGrey02) + ) + } } } } } + diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupLiveSearchResult.kt similarity index 70% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupLiveSearchResult.kt index abf2ea50..33a56139 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupLiveSearchResult.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -6,7 +6,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -15,13 +15,13 @@ import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData import com.texthip.thip.ui.theme.ThipTheme.colors @Composable -fun GroupLiveSearchResultScreen( +fun GroupLiveSearchResult( roomList: List ) { LazyColumn( verticalArrangement = Arrangement.spacedBy(16.dp) ) { - items(roomList) { room -> + itemsIndexed(roomList) { index, room -> CardItemRoomSmall( title = room.title, participants = room.participants, @@ -31,12 +31,14 @@ fun GroupLiveSearchResultScreen( isWide = true, isSecret = room.isSecret ) - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(colors.DarkGrey02) - ) + if (index < roomList.size - 1) { + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background(colors.DarkGrey02) + ) + } } } } diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRecentSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupRecentSearch.kt similarity index 95% rename from app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRecentSearchScreen.kt rename to app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupRecentSearch.kt index 1958776f..3e01963d 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRecentSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupRecentSearch.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.group.myroom.screen +package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.material3.Text @@ -14,7 +14,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height @Composable -fun GroupRecentSearchScreen( +fun GroupRecentSearch( recentSearches: List, onSearchClick: (String) -> Unit, onRemove: (String) -> Unit diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt index 43ec959c..1c41ea6f 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt @@ -28,6 +28,10 @@ import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.FilterButton import com.texthip.thip.ui.common.forms.SearchBookTextField import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.group.myroom.component.GroupEmptyResult +import com.texthip.thip.ui.group.myroom.component.GroupFilteredSearchResult +import com.texthip.thip.ui.group.myroom.component.GroupLiveSearchResult +import com.texthip.thip.ui.group.myroom.component.GroupRecentSearch import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData import com.texthip.thip.ui.theme.ThipTheme @@ -132,14 +136,14 @@ fun GroupSearchScreen( when { searchText.isBlank() && !isSearched && recentSearches.isEmpty() -> { - GroupRecentSearchScreen( + GroupRecentSearch( recentSearches = emptyList(), onSearchClick = {}, onRemove = {} ) } searchText.isBlank() && !isSearched && recentSearches.isNotEmpty() -> { - GroupRecentSearchScreen( + GroupRecentSearch( recentSearches = recentSearches, onSearchClick = { keyword -> searchText = keyword @@ -152,18 +156,18 @@ fun GroupSearchScreen( } searchText.isNotBlank() && !isSearched -> { if (liveFilteredRoomList.isEmpty()) { - GroupEmptyResultScreen( + GroupEmptyResult( mainText = stringResource(R.string.group_no_search_result1), subText = stringResource(R.string.group_no_search_result2) ) } else { - GroupLiveSearchResultScreen( + GroupLiveSearchResult( roomList = liveFilteredRoomList ) } } isSearched -> { - GroupFilteredSearchResultScreen( + GroupFilteredSearchResult( genres = genres, selectedGenreIndex = selectedGenreIndex, onGenreSelect = { selectedGenreIndex = it }, 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 ca393b6e..a7a97c9f 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,14 +1,12 @@ 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.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable @@ -34,7 +32,6 @@ 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: NavHostController? = null, From 51e971e34d5d0d4dece701f94c6d2ae62385b7d2 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 18:17:53 +0900 Subject: [PATCH 04/19] =?UTF-8?q?[refactor]:=20=EA=B8=B0=EC=A1=B4=20Group?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B0=8F=20divider=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/group/myroom/component/GroupEmptyResult.kt | 4 ++-- .../ui/group/myroom/component/GroupFilteredSearchResult.kt | 5 ++--- .../thip/ui/group/myroom/component/GroupRecentSearch.kt | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt index a0392e85..ac2112f1 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt @@ -10,14 +10,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp 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 GroupEmptyResult( mainText: String, subText: String ) { - val colors = ThipTheme.colors - val typography = ThipTheme.typography Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupFilteredSearchResult.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupFilteredSearchResult.kt index ca254329..27eec17a 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupFilteredSearchResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupFilteredSearchResult.kt @@ -15,6 +15,8 @@ import com.texthip.thip.ui.common.buttons.GenreChipRow import com.texthip.thip.ui.common.cards.CardItemRoomSmall 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 @Composable fun GroupFilteredSearchResult( @@ -24,9 +26,6 @@ fun GroupFilteredSearchResult( resultCount: Int, roomList: List ) { - val colors = ThipTheme.colors - val typography = ThipTheme.typography - GenreChipRow( modifier = Modifier.width(20.dp), genres = genres, diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupRecentSearch.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupRecentSearch.kt index 3e01963d..373e868a 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupRecentSearch.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupRecentSearch.kt @@ -12,6 +12,8 @@ import com.texthip.thip.ui.theme.ThipTheme import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun GroupRecentSearch( @@ -19,8 +21,6 @@ fun GroupRecentSearch( onSearchClick: (String) -> Unit, onRemove: (String) -> Unit ) { - val colors = ThipTheme.colors - val typography = ThipTheme.typography Text( text = stringResource(R.string.group_recent_search), color = colors.White, From 49f63ad0e082b4795d7b77ff04479a577409c22f Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 18:31:19 +0900 Subject: [PATCH 05/19] =?UTF-8?q?[refactor]:=20=EA=B8=B0=EC=A1=B4=20Group?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=ED=8C=A8=EB=94=A9=20=EB=B0=8F=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20=EC=88=98=EC=A0=95=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../myroom/component/GroupEmptyResult.kt | 1 - .../group/myroom/screen/GroupSearchScreen.kt | 29 ++++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt index ac2112f1..52fbb14f 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt @@ -25,7 +25,6 @@ fun GroupEmptyResult( ) { Text( text = mainText, - modifier = Modifier.padding(top = 20.dp), color = colors.White, style = typography.smalltitle_sb600_s18_h24 ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt index 1c41ea6f..1e9e0f33 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt @@ -37,7 +37,8 @@ import com.texthip.thip.ui.theme.ThipTheme @Composable fun GroupSearchScreen( - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + roomList: List ) { var recentSearches by rememberSaveable { mutableStateOf(listOf("user.02", "ㅇㅇ", "훽후ㅣㅣ", "검색4", "검색5", "검색6")) @@ -49,21 +50,10 @@ fun GroupSearchScreen( val focusRequester = remember { FocusRequester() } val focusManager = LocalFocusManager.current - // 샘플 장르, 정렬 옵션 + // 장르, 정렬 옵션 val genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술") val sortOptions = listOf("마감임박순", "최신순", "참여많은순") - // 샘플 모임방 리스트 - val roomList = listOf( - GroupCardItemRoomData("aaa", 22, 30, true, 3, R.drawable.bookcover_sample, 0), - GroupCardItemRoomData("bbb", 15, 20, true, 7, R.drawable.bookcover_sample, 1, true), - GroupCardItemRoomData("ccc", 10, 15, true, 5, R.drawable.bookcover_sample, 2, true), - GroupCardItemRoomData("ddd", 8, 12, false, 2, R.drawable.bookcover_sample, 3, true), - GroupCardItemRoomData("eee", 18, 25, true, 4, R.drawable.bookcover_sample, 4), - GroupCardItemRoomData("fff", 12, 20, true, 1, R.drawable.bookcover_sample, 0), - GroupCardItemRoomData("ggg", 10, 14, true, 6, R.drawable.bookcover_sample, 1), - ) - val liveFilteredRoomList by remember(searchText) { derivedStateOf { if (searchText.isBlank()) emptyList() else @@ -192,10 +182,21 @@ fun GroupSearchScreen( } } + @Preview @Composable fun PreviewGroupSearchScreen() { ThipTheme { - GroupSearchScreen() + GroupSearchScreen( + roomList = listOf( + GroupCardItemRoomData("aaa", 22, 30, true, 3, R.drawable.bookcover_sample, 0), + GroupCardItemRoomData("abc", 15, 20, true, 7, R.drawable.bookcover_sample, 1, true), + GroupCardItemRoomData("abcd", 10, 15, true, 5, R.drawable.bookcover_sample, 2, true), + GroupCardItemRoomData("abcde", 8, 12, false, 2, R.drawable.bookcover_sample, 3, true), + GroupCardItemRoomData("abcdef", 18, 25, true, 4, R.drawable.bookcover_sample, 4), + GroupCardItemRoomData("abcdefg", 12, 20, true, 1, R.drawable.bookcover_sample, 0), + GroupCardItemRoomData("abcdefgh", 10, 14, true, 6, R.drawable.bookcover_sample, 1) + ) + ) } } From cc0f376024226c66ec0c46e5f339722f5a258b55 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 18:33:44 +0900 Subject: [PATCH 06/19] =?UTF-8?q?[refactor]:=20=EC=B1=85=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20Mock=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EC=B4=88=EA=B8=B0=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../booksearch/component/BookEmptyResult.kt | 55 +++++ .../booksearch/component/BookRecentSearch.kt | 191 ++++++++++++++++++ .../thip/ui/booksearch/mock/BookData.kt | 10 + 3 files changed, 256 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/component/BookEmptyResult.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/mock/BookData.kt diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookEmptyResult.kt b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookEmptyResult.kt new file mode 100644 index 00000000..4d65d476 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookEmptyResult.kt @@ -0,0 +1,55 @@ +package com.texthip.thip.ui.booksearch.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +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.stringResource +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.buttons.ActionMediumButton +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@Composable +fun BookEmptyResult( + mainText: String, + subText: String, + onRequestBook: () -> Unit +) { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = mainText, + color = colors.White, + style = typography.smalltitle_sb600_s18_h24 + ) + Text( + text = subText, + modifier = Modifier.padding(top = 8.dp), + color = colors.Grey, + style = typography.copy_r400_s14 + ) + Spacer(Modifier.height(20.dp)) + + ActionMediumButton( + text = stringResource(R.string.group_register_book), + contentColor = colors.White, + backgroundColor = colors.Purple, + modifier = Modifier + .width(97.dp) + .height(44.dp), + onClick = { onRequestBook() }, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt new file mode 100644 index 00000000..1a556060 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt @@ -0,0 +1,191 @@ +package com.texthip.thip.ui.booksearch.component + +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.FlowRow +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.lazy.LazyColumn +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.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.booksearch.mock.BookData +import com.texthip.thip.ui.common.buttons.GenreChipButton +import com.texthip.thip.ui.common.cards.CardBookSearch +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 BookRecentSearch( + recentSearches: List, + popularBooks: List, + popularBookDate: String, + onSearchClick: (String) -> Unit, + onRemove: (String) -> Unit, + onBookClick: (BookData) -> Unit +) { + Column(modifier = Modifier.fillMaxSize()) { + // 최근 검색어 + Text( + text = stringResource(R.string.group_recent_search), + color = colors.White, + style = typography.menu_r400_s14_h24 + ) + Spacer(modifier = Modifier.height(16.dp)) + + if (recentSearches.isEmpty()) { + Text( + text = stringResource(R.string.group_no_recent_search), + color = colors.Grey01, + style = typography.menu_r400_s14_h24 + ) + } else { + FlowRow( + verticalArrangement = Arrangement.spacedBy(12.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + maxLines = 2, + ) { + recentSearches.take(9).forEach { keyword -> + GenreChipButton( + text = keyword, + onClick = { onSearchClick(keyword) }, + onCloseClick = { onRemove(keyword) } + ) + } + } + } + + Spacer(modifier = Modifier.height(32.dp)) + + // 가장 많이 검색된 책 헤더 + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = stringResource(R.string.book_popular_search), + color = colors.White, + style = typography.menu_r400_s14_h24 + ) + Text( + text = stringResource(R.string.book_search_date, popularBookDate), + color = colors.Grey02, + style = typography.timedate_r400_s11 + ) + } + Spacer(modifier = Modifier.height(16.dp)) + + // 인기책 리스트만 LazyColumn, 나머지는 고정 + Box(modifier = Modifier + .fillMaxWidth() + .weight(1f, fill = true) + ) { + if (popularBooks.isEmpty()) { + Column( + modifier = Modifier + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = stringResource(R.string.book_no_most_search_result_comment_1), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(R.string.book_no_most_search_result_comment_2), + style = typography.copy_r400_s14, + color = colors.Grey + ) + } + } else { + LazyColumn( + modifier = Modifier.fillMaxSize() + ) { + items(popularBooks.size) { index -> + val book = popularBooks[index] + CardBookSearch( + number = index + 1, + title = book.title, + imageRes = book.imageRes, + onClick = { onBookClick(book) } + ) + if (index < popularBooks.size - 1) { + Spacer( + modifier = Modifier + .padding(top = 12.dp, bottom = 12.dp) + .fillMaxWidth() + .height(1.dp) + .background(ThipTheme.colors.DarkGrey02) + ) + } + } + } + } + } + } +} + + +@Preview +@Composable +fun PreviewBookRecentSearch() { + ThipTheme { + BookRecentSearch( + recentSearches = listOf("소설", "심리학", "철학", "역사", "과학", "에세이"), + popularBooks = listOf( + BookData( + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사", + imageRes = R.drawable.bookcover_sample + ), + BookData( + title = "코스모스", + author = "칼 세이건", + publisher = "사이언스북스", + imageRes = R.drawable.bookcover_sample + ), + BookData( + title = "총, 균, 쇠", + author = "재레드 다이아몬드", + publisher = "문학사상사", + imageRes = R.drawable.bookcover_sample + ) + ), + popularBookDate = "01.12", + onSearchClick = {}, + onRemove = {}, + onBookClick = {} + ) + } +} + +@Preview(showBackground = true) +@Composable +fun PreviewBookRecentSearch_EmptyPopular() { + ThipTheme { + BookRecentSearch( + recentSearches = emptyList(), + popularBooks = emptyList(), + popularBookDate = "01.12.", + onSearchClick = {}, + onRemove = {}, + onBookClick = {} + ) + } +} diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/mock/BookData.kt b/app/src/main/java/com/texthip/thip/ui/booksearch/mock/BookData.kt new file mode 100644 index 00000000..ae839da1 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/booksearch/mock/BookData.kt @@ -0,0 +1,10 @@ +package com.texthip.thip.ui.booksearch.mock + +import com.texthip.thip.R + +data class BookData( + val title: String, + val author: String = "", + val publisher: String = "", + val imageRes: Int = R.drawable.bookcover_sample +) From 87ad17ae50aaa3ffb6781f91b78ed9f7252c4825 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 18:33:57 +0900 Subject: [PATCH 07/19] =?UTF-8?q?[refactor]:=20=EC=B1=85=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=EC=A4=91,=20=EA=B2=80=EC=83=89=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=ED=99=94=EB=A9=B4=20=EA=B5=AC=ED=98=84=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/BookFilteredSearchResult.kt | 102 ++++++++++++++++++ .../component/BookLiveSearchResult.kt | 43 ++++++++ 2 files changed, 145 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/component/BookFilteredSearchResult.kt create mode 100644 app/src/main/java/com/texthip/thip/ui/booksearch/component/BookLiveSearchResult.kt diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookFilteredSearchResult.kt b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookFilteredSearchResult.kt new file mode 100644 index 00000000..da4743ef --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookFilteredSearchResult.kt @@ -0,0 +1,102 @@ +package com.texthip.thip.ui.booksearch.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +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.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.booksearch.mock.BookData +import com.texthip.thip.ui.common.cards.CardBookList +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 BookFilteredSearchResult( + resultCount: Int, + bookList: List +) { + Column { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource(R.string.group_searched_room_size, resultCount), + color = colors.Grey, + style = typography.menu_m500_s14_h24 + ) + } + Spacer( + modifier = Modifier + .padding(top = 4.dp, bottom = 20.dp) + .fillMaxWidth() + .height(1.dp) + .background(colors.DarkGrey02) + ) + + if (bookList.isEmpty()) { + BookEmptyResult( + mainText = stringResource(R.string.book_no_search_result1), + subText = stringResource(R.string.book_no_search_result2), + onRequestBook = { /*책 요청 처리*/ } + ) + } else { + LazyColumn( + verticalArrangement = Arrangement.Center + ) { + itemsIndexed(bookList) { index, book -> + CardBookList( + title = book.title, + author = book.author, + publisher = book.publisher, + imageRes = book.imageRes + ) + if (index < bookList.size - 1) { + Spacer( + modifier = Modifier + .padding(top = 12.dp, bottom = 12.dp) + .fillMaxWidth() + .height(1.dp) + .background(colors.DarkGrey02) + ) + } + } + } + } + } +} + +@Preview +@Composable +fun PreviewBookFilteredSearchResult() { + ThipTheme { + BookFilteredSearchResult( + resultCount = 3, + bookList = listOf( + BookData( + title = "이기적 유전자", + author = "리처드 도킨스", + publisher = "을유문화사" + ), + BookData( + title = "총, 균, 쇠", + author = "재레드 다이아몬드", + publisher = "문학사상사" + ), + BookData( + title = "코스모스", + author = "칼 세이건", + publisher = "사이언스북스" + ) + ) + ) + } +} diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookLiveSearchResult.kt b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookLiveSearchResult.kt new file mode 100644 index 00000000..06213f48 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookLiveSearchResult.kt @@ -0,0 +1,43 @@ +package com.texthip.thip.ui.booksearch.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +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.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.booksearch.mock.BookData +import com.texthip.thip.ui.common.cards.CardBookList +import com.texthip.thip.ui.theme.ThipTheme.colors + +@Composable +fun BookLiveSearchResult( + bookList: List +) { + LazyColumn( + verticalArrangement = Arrangement.Center + ) { + itemsIndexed(bookList) { index, book -> + CardBookList( + title = book.title, + author = book.author, + publisher = book.publisher, + imageRes = book.imageRes + ) + if (index < bookList.size - 1) { + Spacer( + modifier = Modifier + .padding(top = 12.dp, bottom = 12.dp) + .fillMaxWidth() + .height(1.dp) + .background(colors.DarkGrey02) + ) + } + } + } +} \ No newline at end of file From 237e03601087caeaa98c51b7d54d9b94f2016f8f Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 18:34:11 +0900 Subject: [PATCH 08/19] =?UTF-8?q?[refactor]:=20String=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=B0=8F=20=EC=B1=85=20=EA=B2=80=EC=83=89=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/booksearch/screen/BookSearchScreen.kt | 203 +++++++++++++++++- .../texthip/thip/ui/navigator/MainNavHost.kt | 2 +- app/src/main/res/values/strings.xml | 10 + 3 files changed, 206 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt index 9411645c..a670ce53 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt @@ -1,19 +1,206 @@ package com.texthip.thip.ui.booksearch.screen 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.material3.Text +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.navigation.NavController +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import com.texthip.thip.R +import com.texthip.thip.ui.common.forms.SearchBookTextField +import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar +import com.texthip.thip.ui.booksearch.component.BookEmptyResult +import com.texthip.thip.ui.booksearch.component.BookFilteredSearchResult +import com.texthip.thip.ui.booksearch.component.BookLiveSearchResult +import com.texthip.thip.ui.booksearch.component.BookRecentSearch +import com.texthip.thip.ui.booksearch.mock.BookData +import com.texthip.thip.ui.theme.ThipTheme @Composable -fun BookSearchScreen(navController: NavController) { +fun BookSearchScreen( + modifier: Modifier = Modifier, + navController: NavHostController? = null, + bookList: List = emptyList(), + popularBooks: List = emptyList() +) { + var recentSearches by rememberSaveable { + mutableStateOf(listOf("asd", "qwe", "xcv", "dfggfd", "asdasd", "gfhjghj")) + } + var searchText by rememberSaveable { mutableStateOf("") } + var isSearched by rememberSaveable { mutableStateOf(false) } + val focusRequester = remember { FocusRequester() } + val focusManager = LocalFocusManager.current + + val liveFilteredBookList by remember(searchText) { + derivedStateOf { + if (searchText.isBlank()) emptyList() else + bookList.filter { book -> + book.title.contains(searchText, ignoreCase = true) || + book.author.contains(searchText, ignoreCase = true) || + book.publisher.contains(searchText, ignoreCase = true) + } + } + } + + val filteredBookList by remember(searchText, isSearched) { + derivedStateOf { + if (!isSearched) emptyList() + else { + bookList.filter { book -> + searchText.isBlank() || + book.title.contains(searchText, ignoreCase = true) || + book.author.contains(searchText, ignoreCase = true) || + book.publisher.contains(searchText, ignoreCase = true) + } + } + } + } + + LaunchedEffect(isSearched) { + if (isSearched) { + focusManager.clearFocus() + } + } + Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center + modifier = modifier.fillMaxSize() ) { - Text(text = "Book Search Screen") + Column( + modifier = Modifier.fillMaxSize() + ) { + DefaultTopAppBar( + title = stringResource(R.string.book_search_topappbar), + onLeftClick = {}, + ) + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 20.dp) + ) { + Spacer(modifier = Modifier.height(16.dp)) + + SearchBookTextField( + modifier = Modifier + .fillMaxWidth() + .focusRequester(focusRequester), + hint = stringResource(R.string.book_search_hint), + text = searchText, + onValueChange = { + searchText = it + isSearched = false + }, + onSearch = { query -> + if (query.isNotBlank() && !recentSearches.contains(query)) { + recentSearches = listOf(query) + recentSearches + } + isSearched = true + } + ) + Spacer(modifier = Modifier.height(16.dp)) + + when { + searchText.isBlank() && !isSearched -> { + BookRecentSearch( + recentSearches = recentSearches, + popularBooks = popularBooks, + popularBookDate = "01.12", // TODO: 서버로 날짜를 받아 오게 수정 + onSearchClick = { keyword -> + searchText = keyword + isSearched = true + }, + onRemove = { keyword -> + recentSearches = recentSearches.filterNot { it == keyword } + }, + onBookClick = { book -> + // 책 클릭 시 처리 + } + ) + } + + searchText.isNotBlank() && !isSearched -> { + if (liveFilteredBookList.isEmpty()) { + BookEmptyResult( + mainText = stringResource(R.string.book_no_search_result1), + subText = stringResource(R.string.book_no_search_result2), + onRequestBook = { /*책 요청 처리*/ } + ) + } else { + BookLiveSearchResult( + bookList = liveFilteredBookList + ) + } + } + + isSearched -> { + BookFilteredSearchResult( + resultCount = filteredBookList.size, + bookList = filteredBookList, + ) + } + } + } + } + } +} + + +@Preview(showBackground = true) +@Composable +fun PreviewBookSearchScreen_Default() { + ThipTheme { + BookSearchScreen( + bookList = listOf( + BookData("aaa", "리처드 도킨스", "을유문화사", R.drawable.bookcover_sample), + BookData("abc", "마틴 셀리그만", "물푸레", R.drawable.bookcover_sample), + BookData("abcd", "빅터 프랭클", "청림출판", R.drawable.bookcover_sample), + BookData("abcde", "칼 융", "문학과지성사", R.drawable.bookcover_sample), + BookData("abcdef", "에릭 프롬", "까치글방", R.drawable.bookcover_sample), + BookData("abcedfg", "알베르 카뮈", "민음사", R.drawable.bookcover_sample), + BookData("abcdefgh", "장 폴 사르트르", "문학동네", R.drawable.bookcover_sample), + ), + popularBooks = listOf( + BookData("단 한번의 삶", "리처드 도킨스", "을유문화사", R.drawable.bookcover_sample), + BookData("사랑", "마틴 셀리그만", "물푸레", R.drawable.bookcover_sample), + BookData("호모 사피엔스", "빅터 프랭클", "청림출판", R.drawable.bookcover_sample), + BookData("코스모스 실버", "칼 융", "문학과지성사", R.drawable.bookcover_sample), + BookData("오만과 편견", "에릭 프롬", "까치글방", R.drawable.bookcover_sample), + ) + ) + } +} + +@Preview(showBackground = true) +@Composable +fun PreviewBookSearchScreen_EmptyPopular() { + ThipTheme { + BookSearchScreen( + bookList = listOf( + BookData("aaa", "리처드 도킨스", "을유문화사", R.drawable.bookcover_sample), + BookData("abc", "마틴 셀리그만", "물푸레", R.drawable.bookcover_sample), + BookData("abcd", "빅터 프랭클", "청림출판", R.drawable.bookcover_sample), + BookData("abcde", "칼 융", "문학과지성사", R.drawable.bookcover_sample), + BookData("abcdef", "에릭 프롬", "까치글방", R.drawable.bookcover_sample), + BookData("abcedfg", "알베르 카뮈", "민음사", R.drawable.bookcover_sample), + BookData("abcdefgh", "장 폴 사르트르", "문학동네", R.drawable.bookcover_sample), + ), + popularBooks = emptyList() + ) } -} \ No newline at end of file +} 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 c3b8701d..c2eed097 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 @@ -14,7 +14,7 @@ fun MainNavHost(navController: NavHostController) { NavHost(navController = navController, startDestination = Routes.Feed.route) { composable(Routes.Feed.route) { FeedScreen(navController) } composable(Routes.Group.route) { GroupScreen(navController) } - composable(Routes.BookSearch.route) { BookSearchScreen(navController) } + composable(Routes.BookSearch.route) { BookSearchScreen(navController = navController) } composable(Routes.MyPage.route) { MyPageScreen( navController, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e61783ec..ee157df3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -255,4 +255,14 @@ 참여 중인 모임방이 없어요 첫번째 모임방에 참여해보세요 + + 가장 많이 검색된 책 + 검색 + 책 제목, 작가명을 검색해보세요. + 현재 등록된 책이 없어요. + 원하는 책을 신청해주세요! + %1$s. 기준 + 아직 순위가 집계되지 않았어요. + 조금만 기다려주세요! + \ No newline at end of file From 45e9898b98bb2a7bb6ea813e24f6fbbdff679785 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 18:37:36 +0900 Subject: [PATCH 09/19] =?UTF-8?q?[chore]:=20=EC=A3=BC=EC=84=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../texthip/thip/ui/booksearch/component/BookRecentSearch.kt | 4 ---- .../texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt | 1 - .../thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt | 3 --- .../texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt | 1 - 4 files changed, 9 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt index 1a556060..4f836c20 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt +++ b/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt @@ -37,7 +37,6 @@ fun BookRecentSearch( onBookClick: (BookData) -> Unit ) { Column(modifier = Modifier.fillMaxSize()) { - // 최근 검색어 Text( text = stringResource(R.string.group_recent_search), color = colors.White, @@ -66,10 +65,8 @@ fun BookRecentSearch( } } } - Spacer(modifier = Modifier.height(32.dp)) - // 가장 많이 검색된 책 헤더 Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, @@ -88,7 +85,6 @@ fun BookRecentSearch( } Spacer(modifier = Modifier.height(16.dp)) - // 인기책 리스트만 LazyColumn, 나머지는 고정 Box(modifier = Modifier .fillMaxWidth() .weight(1f, fill = true) 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 269577eb..7feb67d1 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 @@ -401,7 +401,6 @@ fun GroupRoomScreen( ) } - // 다이얼로그 팝업 if (showDialog) { Box( modifier = Modifier diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt index 3cd62a38..b96caccb 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt @@ -44,7 +44,6 @@ fun GroupRoomSecretScreen( val focusRequesters = remember { List(4) { FocusRequester() } } val keyboardController = LocalSoftwareKeyboardController.current - // 비밀번호가 4자리 완성되면 자동으로 검증 LaunchedEffect(password.toList()) { val fullPassword = password.joinToString("") if (fullPassword.length == 4 && password.all { it.length == 1 }) { @@ -63,7 +62,6 @@ fun GroupRoomSecretScreen( } } - // 화면 진입 시 키보드 자동 포커스 LaunchedEffect(Unit) { focusRequesters[0].requestFocus() keyboardController?.show() @@ -76,7 +74,6 @@ fun GroupRoomSecretScreen( Column( modifier = Modifier.fillMaxSize() ) { - // 상단 앱바 DefaultTopAppBar( isRightIconVisible = false, isTitleVisible = false, diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt index 1e9e0f33..f814e4e7 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt @@ -50,7 +50,6 @@ fun GroupSearchScreen( val focusRequester = remember { FocusRequester() } val focusManager = LocalFocusManager.current - // 장르, 정렬 옵션 val genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술") val sortOptions = listOf("마감임박순", "최신순", "참여많은순") From 4c414ae3f9e682963227e72348814acb42aef101 Mon Sep 17 00:00:00 2001 From: Gyubin Date: Thu, 17 Jul 2025 20:56:45 +0900 Subject: [PATCH 10/19] =?UTF-8?q?[chore]:=20GroupSearchScreen=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EB=B0=8F=20=ED=95=84=ED=84=B0=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- .../group/myroom/screen/GroupSearchScreen.kt | 60 +++++++++++++++---- app/src/main/res/values/strings.xml | 11 ++++ 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 5e471df0..38860e7c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,5 +4,5 @@