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 a58d94da..c319d0d1 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 @@ -61,7 +61,7 @@ fun CardItemRoom( ) .clickable { onClick() }, colors = CardDefaults.cardColors( - containerColor = colors.DarkGrey50 + containerColor = colors.DarkGrey ), shape = RoundedCornerShape(12.dp) ) { @@ -88,7 +88,7 @@ fun CardItemRoom( } } - Spacer(modifier = Modifier.width(16.dp)) + Spacer(modifier = Modifier.width(12.dp)) Column( modifier = Modifier @@ -148,8 +148,6 @@ fun CardItemRoom( 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, 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 eafaf728..e4599b5e 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 @@ -52,7 +52,7 @@ fun CardItemRoomSmall( modifier .width(232.dp) } - val bgColor = if (isWide) colors.Black else colors.DarkGrey50 + val bgColor = if (isWide) colors.Black else colors.DarkGrey Card( modifier = cardModifier @@ -100,8 +100,9 @@ fun CardItemRoomSmall( Column( modifier = Modifier.fillMaxWidth() ) { - Spacer(modifier = Modifier.height(4.dp)) + Text( + modifier = Modifier.padding(top = 4.dp), text = title, color = colors.White, style = if (isWide) typography.smalltitle_sb600_s18_h24 else typography.menu_sb600_s14_h24, @@ -142,7 +143,7 @@ fun CardItemRoomSmall( ) } } - Spacer(modifier = Modifier.height(4.dp)) + Spacer(modifier = Modifier.height(7.dp)) endDate?.let { 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 80c68feb..b298e218 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 @@ -134,9 +134,9 @@ fun CardRoomBook( ) } - Spacer(modifier = Modifier.height(21.dp)) Text( + modifier = Modifier.padding(top = 21.dp), 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/common/forms/SearchBookTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/SearchBookTextField.kt index cb253672..11233ceb 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/forms/SearchBookTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/SearchBookTextField.kt @@ -89,7 +89,7 @@ fun SearchBookTextField( if (text.isNotEmpty()) { Icon( - painter = painterResource(id = R.drawable.ic_x_circle_grey), + painter = painterResource(id = R.drawable.ic_x_circle_grey02), contentDescription = "Clear text", modifier = Modifier .clickable { onValueChange("") }, diff --git a/app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt index 02e0a799..d5f433d2 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt @@ -82,19 +82,12 @@ fun WarningTextField( ), trailingIcon = { if (showIcon) { - if (value.isNotEmpty()) { - Icon( - painter = painterResource(id = R.drawable.ic_x_circle_white), - contentDescription = "Clear text", - modifier = Modifier.clickable { onValueChange("")}, - tint = Color.Unspecified - ) - } else { - Icon( - painter = painterResource(id = R.drawable.ic_x_circle), - contentDescription = "Clear text" - ) - } + Icon( + painter = painterResource(id = R.drawable.ic_x_circle_grey), + contentDescription = "Clear text", + modifier = Modifier.clickable { onValueChange("") }, + tint = Color.Unspecified + ) } }, singleLine = true, @@ -159,9 +152,8 @@ fun WarningTextFieldPreviewNormal() { contentAlignment = Alignment.Center ) { WarningTextField( - value = text, - onValueChange = { text = it }, + onValueChange = { text = it }, hint = "인풋 텍스트", showWarning = false, showIcon = true, diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookListWithScrollbar.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookListWithScrollbar.kt index 9d8965e6..db9fc7fb 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookListWithScrollbar.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookListWithScrollbar.kt @@ -39,21 +39,23 @@ fun GroupBookListWithScrollbar( .verticalScroll(scrollState) .drawVerticalScrollbar(scrollState) ) { - books.forEach { book -> + books.forEachIndexed { index, book -> CardBookSearch( title = book.title, imageRes = book.imageRes, onClick = { onBookClick(book) } ) - Spacer(modifier = Modifier.height(12.dp)) - Spacer(modifier = Modifier - .fillMaxWidth() - .padding(end = 6.dp) - .height(1.dp) - .background(color = colors.Grey02) - ) - Spacer(modifier = Modifier.height(12.dp)) + if (index < books.size - 1) { + Spacer(modifier = Modifier.height(12.dp)) + Spacer(modifier = Modifier + .fillMaxWidth() + .padding(end = 6.dp) + .height(1.dp) + .background(color = colors.Grey02) + ) + Spacer(modifier = Modifier.height(12.dp)) + } } } } diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookSearchBottomSheet.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookSearchBottomSheet.kt index 68682685..829e1701 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookSearchBottomSheet.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookSearchBottomSheet.kt @@ -6,6 +6,7 @@ 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.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf @@ -33,15 +34,29 @@ fun GroupBookSearchBottomSheet( savedBooks: List = emptyList(), groupBooks: List = emptyList() ) { - // 책이 있는지 여부 체크 val hasBooks = savedBooks.isNotEmpty() || groupBooks.isNotEmpty() var selectedTab by rememberSaveable { mutableIntStateOf(0) } val tabs = listOf( stringResource(R.string.group_saved_book), stringResource(R.string.group_book) ) - val books = if (selectedTab == 0) savedBooks else groupBooks + var searchText by rememberSaveable { mutableStateOf("") } + val currentBooks = if (selectedTab == 0) savedBooks else groupBooks + + val filteredBooks by remember(currentBooks, searchText) { + derivedStateOf { + if (searchText.isEmpty()) { + currentBooks + } else { + currentBooks.filter { book -> + book.title.contains(searchText, ignoreCase = true) || + (book.author?.contains(searchText, ignoreCase = true) == true) + } + } + } + } + CustomBottomSheet( onDismiss = onDismiss ) { @@ -55,7 +70,7 @@ fun GroupBookSearchBottomSheet( hint = stringResource(R.string.group_book_search_hint), text = searchText, onValueChange = { searchText = it }, - onSearch = { /* 검색 구현 */ }, + onSearch = { /* 이미 실시간으로 필터링됨 */ }, ) Spacer(Modifier.height(20.dp)) } @@ -64,7 +79,10 @@ fun GroupBookSearchBottomSheet( HeaderMenuBarTab( titles = tabs, selectedTabIndex = selectedTab, - onTabSelected = { selectedTab = it }, + onTabSelected = { + selectedTab = it + // searchText = "" + }, indicatorColor = ThipTheme.colors.White, modifier = Modifier.fillMaxWidth() ) @@ -75,13 +93,23 @@ fun GroupBookSearchBottomSheet( .padding(start = 20.dp, end = 20.dp, bottom = 20.dp) ) { Spacer(Modifier.height(20.dp)) - if (books.isEmpty()) { - EmptyBookSheetContent(onRequestBook = onRequestBook) - } else { - GroupBookListWithScrollbar( - books = books, - onBookClick = onBookSelect - ) + + when { + currentBooks.isEmpty() -> { + EmptyBookSheetContent(onRequestBook = onRequestBook) + } + filteredBooks.isEmpty() && searchText.isNotEmpty() -> { + SearchEmptyContent( + searchText = searchText, + onRequestBook = onRequestBook + ) + } + else -> { + GroupBookListWithScrollbar( + books = filteredBooks, + onBookClick = onBookSelect + ) + } } } } else { @@ -97,7 +125,16 @@ fun GroupBookSearchBottomSheet( } } - +// 검색 결과가 없을 때 표시할 컴포넌트 (필요시 구현) +@Composable +private fun SearchEmptyContent( + searchText: String, + onRequestBook: () -> Unit +) { + // 검색 결과가 없을 때의 UI + // 예: "'{searchText}'에 대한 검색 결과가 없습니다" 메시지와 책 요청 버튼 + EmptyBookSheetContent(onRequestBook = onRequestBook) +} @Preview(showBackground = true) @Composable diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupDatePicker.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupDatePicker.kt index 9b5655e0..b933856d 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupDatePicker.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupDatePicker.kt @@ -39,10 +39,14 @@ fun GroupDatePicker( val month = selectedDate.monthValue val day = selectedDate.dayOfMonth - // 유효한 범위 계산 - val years = (minDate.year..maxDate.year).toList() - val months = (1..12).toList() - val days = (1..selectedDate.lengthOfMonth()).toList() + // 유효한 범위 계산 - 날짜 변경 시 안정성을 위해 remember 사용 + val years = remember(minDate.year, maxDate.year) { + (minDate.year..maxDate.year).toList() + } + val months = remember { (1..12).toList() } + val days = remember(year, month) { + (1..LocalDate.of(year, month, 1).lengthOfMonth()).toList() + } Row( modifier = modifier.fillMaxWidth(), @@ -105,7 +109,7 @@ fun GroupDatePicker( GroupWheelPicker( modifier = Modifier.width(32.dp), items = days, - selectedItem = day, + selectedItem = day.coerceAtMost(days.max()), onItemSelected = { newDay -> val newDate = LocalDate.of(year, month, newDay) onDateSelected(newDate) diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupEmptyBookSheetContent.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupEmptyBookSheetContent.kt index d0d1028b..2f36b707 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupEmptyBookSheetContent.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupEmptyBookSheetContent.kt @@ -19,6 +19,7 @@ import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.ActionMediumButton 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 EmptyBookSheetContent( @@ -30,16 +31,16 @@ fun EmptyBookSheetContent( .padding(bottom = 30.dp), horizontalAlignment = Alignment.CenterHorizontally ) { - Icon( - painter = painterResource(id = R.drawable.ic_notification), - contentDescription = null, - tint = colors.Grey02 + Text( + text = stringResource(R.string.group_register_book_comment_1), + color = colors.Grey, + style = typography.copy_m500_s14_h20 ) - Spacer(Modifier.height(12.dp)) + Text( - text = stringResource(R.string.group_register_book_comment), - color = ThipTheme.colors.Grey02, - style = ThipTheme.typography.copy_m500_s14_h20 + text = stringResource(R.string.group_register_book_comment_2), + color = colors.Grey, + style = typography.copy_m500_s14_h20 ) Spacer(Modifier.height(24.dp)) diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupMemberLimitPicker.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupMemberLimitPicker.kt index 09d9d1cc..7b6437c8 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupMemberLimitPicker.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupMemberLimitPicker.kt @@ -10,13 +10,11 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf -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.res.stringResource -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R @@ -25,7 +23,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun MemberLimitPicker( +fun GroupMemberLimitPicker( modifier: Modifier = Modifier, selectedCount: Int = 30, onCountSelected: (Int) -> Unit = { } @@ -76,7 +74,7 @@ fun MemberLimitPickerPreview() { ThipTheme { var selectedCount by remember { mutableIntStateOf(30) } - MemberLimitPicker( + GroupMemberLimitPicker( selectedCount = selectedCount, onCountSelected = { selectedCount = it } ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupRoomDurationPicker.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupRoomDurationPicker.kt index 3b8acac4..c36d5f4b 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupRoomDurationPicker.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupRoomDurationPicker.kt @@ -1,10 +1,18 @@ package com.texthip.thip.ui.group.makeroom.component import androidx.compose.foundation.gestures.detectTapGestures -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding 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.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.pointerInput diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupSelectBook.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupSelectBook.kt index 0b31c50b..dc9864fd 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupSelectBook.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupSelectBook.kt @@ -4,12 +4,17 @@ import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image import androidx.compose.foundation.border import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* 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.shape.RoundedCornerShape -import androidx.compose.material3.Button import androidx.compose.material3.Icon -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -113,7 +118,7 @@ fun GroupSelectBook( OptionChipButton( text = stringResource(R.string.change), onClick = onChangeBookClick, - isSelected = true + isSelected = false ) } } diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupWheelPicker.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupWheelPicker.kt index b7d353c0..cca7af26 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupWheelPicker.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupWheelPicker.kt @@ -5,10 +5,25 @@ import androidx.compose.animation.core.exponentialDecay import androidx.compose.animation.core.spring import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectDragGestures -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Box +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.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width 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.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush @@ -42,28 +57,28 @@ fun GroupWheelPicker( val isScrollEnabled = items.size > 1 val circular = isCircular && items.size > 2 - val selectedIndex = items.indexOf(selectedItem) + val selectedIndex = remember(items, selectedItem) { items.indexOf(selectedItem) } val animatableOffset = remember { Animatable(0f) } val coroutineScope = rememberCoroutineScope() var isDragging by remember { mutableStateOf(false) } var velocity by remember { mutableFloatStateOf(0f) } val density = LocalDensity.current - val itemHeightPx = with(density) { itemHeight.dp.toPx() } - val spacingPx = with(density) { 9.dp.toPx() } - val itemSpacing = itemHeightPx + spacingPx + val itemHeightPx = remember(density, itemHeight) { with(density) { itemHeight.dp.toPx() } } + val spacingPx = remember(density) { with(density) { 9.dp.toPx() } } + val itemSpacing = remember(itemHeightPx, spacingPx) { itemHeightPx + spacingPx } - fun getCircularIndex(index: Int): Int { - return WheelPickerUtils.getCircularIndex(index, items.size) - } + val getCircularIndex = remember(items.size) { { index: Int -> + WheelPickerUtils.getCircularIndex(index, items.size) + } } - fun normalizeOffset(offset: Float): Float { - return WheelPickerUtils.normalizeOffset(offset, itemSpacing, items.size, circular) - } + val normalizeOffset = remember(itemSpacing, items.size, circular) { { offset: Float -> + WheelPickerUtils.normalizeOffset(offset, itemSpacing, items.size, circular) + } } - fun offsetToIndex(offset: Float): Int { - return WheelPickerUtils.offsetToIndex(offset, itemSpacing, items.size, circular) - } + val offsetToIndex = remember(itemSpacing, items.size, circular) { { offset: Float -> + WheelPickerUtils.offsetToIndex(offset, itemSpacing, items.size, circular) + } } // 선택 아이템이 바뀌면 중앙에 오도록 offset 이동 LaunchedEffect(selectedItem) { @@ -76,19 +91,22 @@ fun GroupWheelPicker( } } - // 오프셋이 바뀔 때 마다 선택 아이템을 갱신 - LaunchedEffect(animatableOffset.value) { + // 드래그 상태가 변경될 때만 선택 아이템 업데이트 + LaunchedEffect(isDragging) { if (!isDragging && isScrollEnabled) { + // 드래그가 끝났을 때만 최종 값 업데이트 val newSelectedIndex = offsetToIndex(animatableOffset.value) - if (items[newSelectedIndex] != selectedItem) { + if (newSelectedIndex in items.indices && items[newSelectedIndex] != selectedItem) { onItemSelected(items[newSelectedIndex]) } } } + val containerHeight = remember(itemHeight) { (itemHeight * 3 + 36).dp } + val textStyle = typography.info_r400_s12 + Box( - modifier = modifier - .height((itemHeight * 3 + 36).dp) + modifier = modifier.height(containerHeight) ) { // 중앙 고정 박스 Box( @@ -102,7 +120,7 @@ fun GroupWheelPicker( ) { Text( text = displayText(selectedItem), - style = typography.info_r400_s12, + style = textStyle, color = Color.Transparent, textAlign = TextAlign.Center ) @@ -174,12 +192,19 @@ fun GroupWheelPicker( } ) ) { - val currOffset = - if (circular && isScrollEnabled) normalizeOffset(animatableOffset.value) else animatableOffset.value - val centerIndex = if (isScrollEnabled) (-currOffset / itemSpacing).roundToInt() else 0 + val currOffset by remember { + derivedStateOf { + if (circular && isScrollEnabled) normalizeOffset(animatableOffset.value) else animatableOffset.value + } + } + val centerIndex by remember { + derivedStateOf { + if (isScrollEnabled) (-currOffset / itemSpacing).roundToInt() else 0 + } + } // 중앙 + 위 아래 한 개만 보이도록! - val visibleRange = if (isScrollEnabled) -1..1 else 0..0 + val visibleRange = remember(isScrollEnabled) { if (isScrollEnabled) -1..1 else 0..0 } visibleRange.forEach { relIdx -> val displayIndex = centerIndex + relIdx @@ -201,7 +226,7 @@ fun GroupWheelPicker( ) { Text( text = displayText(item), - style = typography.info_r400_s12, + style = textStyle, color = colors.White, textAlign = TextAlign.Center ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/mock/GroupBookData.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/mock/GroupBookData.kt index 7d3366ff..e80bd652 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/mock/GroupBookData.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/mock/GroupBookData.kt @@ -9,14 +9,14 @@ data class BookData( ) val dummySavedBooks = 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), - 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, "최정화"), + 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, "최정화"), + BookData("사슴", R.drawable.bookcover_sample, "최정화") ) val dummyGroupBooks = listOf( BookData("명작 읽기방", R.drawable.bookcover_sample), diff --git a/app/src/main/java/com/texthip/thip/ui/group/makeroom/screen/GroupMakeRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/makeroom/screen/GroupMakeRoomScreen.kt index 8211d6c4..429408b0 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/makeroom/screen/GroupMakeRoomScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/makeroom/screen/GroupMakeRoomScreen.kt @@ -1,10 +1,22 @@ package com.texthip.thip.ui.group.makeroom.screen -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.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.blur @@ -21,7 +33,7 @@ import com.texthip.thip.ui.group.makeroom.component.GroupBookSearchBottomSheet import com.texthip.thip.ui.group.makeroom.component.GroupInputField import com.texthip.thip.ui.group.makeroom.component.GroupRoomDurationPicker import com.texthip.thip.ui.group.makeroom.component.GroupSelectBook -import com.texthip.thip.ui.group.makeroom.component.MemberLimitPicker +import com.texthip.thip.ui.group.makeroom.component.GroupMemberLimitPicker import com.texthip.thip.ui.group.makeroom.component.SectionDivider import com.texthip.thip.ui.group.makeroom.mock.BookData import com.texthip.thip.ui.group.makeroom.mock.GroupMakeRoomRequest @@ -143,7 +155,7 @@ fun GroupMakeRoomScreen( SectionDivider() - MemberLimitPicker( + GroupMemberLimitPicker( selectedCount = uiState.memberLimit, onCountSelected = viewModel::setMemberLimit ) @@ -182,7 +194,10 @@ fun GroupMakeRoomScreen( warningMessage = stringResource(R.string.group_private_warning_message), maxLength = 4, isNumberOnly = true, - keyboardType = KeyboardType.NumberPassword + keyboardType = KeyboardType.NumberPassword, + showIcon = true, + showLimit = false, + containerColor = colors.DarkGrey02 ) } 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 9526b611..bf956155 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 @@ -2,12 +2,27 @@ package com.texthip.thip.ui.group.myroom.component import android.annotation.SuppressLint 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.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +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 +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width 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.getValue +import androidx.compose.runtime.mutableIntStateOf +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 @@ -19,8 +34,8 @@ import androidx.compose.ui.unit.dp import com.texthip.thip.R import com.texthip.thip.ui.common.buttons.GenreChipRow import com.texthip.thip.ui.common.cards.CardItemRoom -import com.texthip.thip.ui.group.myroom.mock.GroupRoomSectionData import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData +import com.texthip.thip.ui.group.myroom.mock.GroupRoomSectionData 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/group/myroom/component/GroupEmptyResult.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyResult.kt index 52fbb14f..2b45da10 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 @@ -1,6 +1,8 @@ package com.texthip.thip.ui.group.myroom.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.fillMaxSize import androidx.compose.foundation.layout.padding @@ -8,6 +10,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +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 @@ -36,3 +39,19 @@ fun GroupEmptyResult( ) } } + +@Preview(showBackground = true) +@Composable +fun GroupEmptyResultPreview() { + ThipTheme { + Box( + modifier = Modifier + .fillMaxSize() + ) { + GroupEmptyResult( + mainText = "검색 결과가 없습니다", + subText = "다른 키워드로 검색해보세요" + ) + } + } +} 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 27eec17a..9f9c5226 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 @@ -1,14 +1,27 @@ package com.texthip.thip.ui.group.myroom.component 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.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.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue 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.common.buttons.GenreChipRow @@ -26,61 +39,124 @@ fun GroupFilteredSearchResult( resultCount: Int, roomList: List ) { - GenreChipRow( - modifier = Modifier.width(20.dp), - genres = genres, - selectedIndex = selectedGenreIndex, - onSelect = onGenreSelect - ) - Spacer(modifier = Modifier.height(20.dp)) - - 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 + Column { + GenreChipRow( + modifier = Modifier.width(20.dp), + genres = genres, + selectedIndex = selectedGenreIndex, + onSelect = onGenreSelect ) - } - Spacer( - modifier = Modifier - .padding(top = 4.dp, bottom = 8.dp) - .fillMaxWidth() - .height(1.dp) - .background(colors.DarkGrey02) - ) + Spacer(modifier = Modifier.height(20.dp)) - if (roomList.isEmpty()) { - GroupEmptyResult( - mainText = stringResource(R.string.group_no_search_result1), - subText = stringResource(R.string.group_no_search_result2) - ) - } else { - LazyColumn( - verticalArrangement = Arrangement.spacedBy(16.dp) + Row( + modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { - itemsIndexed(roomList) { index, room -> - CardItemRoomSmall( - title = room.title, - participants = room.participants, - maxParticipants = room.maxParticipants, - endDate = room.endDate, - imageRes = room.imageRes, - isWide = true, - isSecret = room.isSecret - ) - if (index < roomList.size - 1) { - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(colors.DarkGrey02) + 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 = 8.dp) + .fillMaxWidth() + .height(1.dp) + .background(colors.DarkGrey02) + ) + + if (roomList.isEmpty()) { + GroupEmptyResult( + mainText = stringResource(R.string.group_no_search_result1), + subText = stringResource(R.string.group_no_search_result2) + ) + } else { + LazyColumn { + itemsIndexed(roomList) { index, room -> + CardItemRoomSmall( + title = room.title, + participants = room.participants, + maxParticipants = room.maxParticipants, + endDate = room.endDate, + imageRes = room.imageRes, + isWide = true, + isSecret = room.isSecret ) + if (index < roomList.size - 1) { + Spacer( + modifier = Modifier + .padding(top = 12.dp, bottom = 12.dp) + .fillMaxWidth() + .height(1.dp) + .background(colors.DarkGrey02) + ) + } } } } } } +@Preview(showBackground = true) +@Composable +fun GroupFilteredSearchResultPreview() { + ThipTheme { + Box( + modifier = Modifier + .padding(16.dp) + ) { + var selectedGenre by remember { mutableIntStateOf(0) } + + GroupFilteredSearchResult( + genres = listOf("문학", "과학•IT", "사회과학", "인문학", "예술"), + selectedGenreIndex = selectedGenre, + onGenreSelect = { selectedGenre = it }, + resultCount = 3, + roomList = listOf( + GroupCardItemRoomData( + title = "해리포터 독서모임", + participants = 5, + maxParticipants = 10, + isRecruiting = true, + endDate = 7, + imageRes = R.drawable.bookcover_sample, + genreIndex = 1, + isSecret = false + ), GroupCardItemRoomData( + title = "소설 읽기 모임", + participants = 8, + maxParticipants = 12, + isRecruiting = false, + endDate = 3, + imageRes = R.drawable.bookcover_sample, + genreIndex = 1, + isSecret = true + ) + ) + ) + } + } +} + +@Preview(showBackground = true) +@Composable +fun GroupFilteredSearchResultEmptyPreview() { + ThipTheme { + Box( + modifier = Modifier + .background(colors.Black) + .padding(16.dp) + ) { + var selectedGenre by remember { mutableIntStateOf(0) } + + GroupFilteredSearchResult( + genres = listOf("전체", "소설", "에세이", "자기계발", "경제/경영", "과학"), + selectedGenreIndex = selectedGenre, + onGenreSelect = { selectedGenre = it }, + resultCount = 0, + roomList = emptyList() + ) + } + } +} + diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupLiveSearchResult.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupLiveSearchResult.kt index 33a56139..53a682f1 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupLiveSearchResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupLiveSearchResult.kt @@ -2,25 +2,28 @@ package com.texthip.thip.ui.group.myroom.component 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.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.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.group.myroom.mock.GroupCardItemRoomData +import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors @Composable fun GroupLiveSearchResult( roomList: List ) { - LazyColumn( - verticalArrangement = Arrangement.spacedBy(16.dp) - ) { + LazyColumn { itemsIndexed(roomList) { index, room -> CardItemRoomSmall( title = room.title, @@ -34,6 +37,7 @@ fun GroupLiveSearchResult( if (index < roomList.size - 1) { Spacer( modifier = Modifier + .padding(top = 12.dp, bottom = 12.dp) .fillMaxWidth() .height(1.dp) .background(colors.DarkGrey02) @@ -42,3 +46,49 @@ fun GroupLiveSearchResult( } } } + +@Preview(showBackground = true) +@Composable +fun GroupLiveSearchResultPreview() { + ThipTheme { + Box( + modifier = Modifier + .padding(16.dp) + ) { + GroupLiveSearchResult( + roomList = listOf( + GroupCardItemRoomData( + title = "해리포터 독서모임", + participants = 5, + maxParticipants = 10, + isRecruiting = true, + endDate = 7, + imageRes = R.drawable.bookcover_sample, + genreIndex = 0, + isSecret = false + ), + GroupCardItemRoomData( + title = "소설 읽기 모임", + participants = 8, + maxParticipants = 12, + isRecruiting = false, + endDate = 3, + imageRes = R.drawable.bookcover_sample, + genreIndex = 1, + isSecret = true + ), + GroupCardItemRoomData( + title = "비즈니스 서적 스터디", + participants = 3, + maxParticipants = 8, + isRecruiting = true, + endDate = null, + imageRes = R.drawable.bookcover_sample, + genreIndex = 2, + isSecret = false + ) + ) + ) + } + } +} 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 9b5a2d6b..2feb3c94 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 @@ -18,12 +18,8 @@ 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.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.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset @@ -31,8 +27,10 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight 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.group.myroom.mock.GroupCardData import com.texthip.thip.ui.theme.ThipTheme @@ -113,7 +111,6 @@ fun GroupMainCard( color = colors.Grey02, style = typography.menu_sb600_s12, ) - Spacer(Modifier.width(2.dp)) Text( text = stringResource(R.string.group_participant_string), color = colors.Grey02, @@ -131,9 +128,14 @@ fun GroupMainCard( ) Spacer(Modifier.width(4.dp)) Text( - text = "${data.progress}%", + text = "${data.progress}", color = colors.Purple, - style = typography.view_m500_s14, + style = typography.smalltitle_sb600_s16_h20 + ) + Text( + text = "%", + color = colors.Purple, + style = typography.menu_sb600_s12, ) } Spacer(Modifier.height(10.dp)) 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 dfa8e3d6..ab7067fe 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 @@ -3,10 +3,16 @@ package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row 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.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.buttons.OptionChipButton +import com.texthip.thip.ui.theme.ThipTheme @Composable fun GroupMyRoomFilterRow( @@ -29,3 +35,20 @@ fun GroupMyRoomFilterRow( } } +@Preview(showBackground = true) +@Composable +fun GroupMyRoomFilterRowPreview() { + ThipTheme { + var selectedStates by remember { mutableStateOf(booleanArrayOf(true, false)) } + + GroupMyRoomFilterRow( + selectedStates = selectedStates, + onToggle = { index -> + selectedStates = selectedStates.copyOf().apply { + this[index] = !this[index] + } + } + ) + } +} + 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 373e868a..158fe4bb 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 @@ -1,17 +1,26 @@ package com.texthip.thip.ui.group.myroom.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.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.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.common.buttons.GenreChipButton import com.texthip.thip.ui.theme.ThipTheme -import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @@ -21,31 +30,76 @@ fun GroupRecentSearch( onSearchClick: (String) -> Unit, onRemove: (String) -> Unit ) { - 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()) { + Column { Text( - text = stringResource(R.string.group_no_recent_search), - color = colors.Grey01, - style = typography.menu_r400_s14_h24 + text = stringResource(R.string.group_recent_search), + color = colors.White, + style = typography.smalltitle_sb600_s18_h24 ) - } else { - FlowRow( - verticalArrangement = Arrangement.spacedBy(12.dp), - horizontalArrangement = Arrangement.spacedBy(16.dp), - maxLines = 2, + 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) } + ) + } + } + } + } +} + +@Preview(showBackground = true) +@Composable +fun GroupRecentSearchPreview() { + ThipTheme { + Box( + modifier = Modifier + .padding(16.dp) ) { - recentSearches.take(9).forEach { keyword -> - GenreChipButton( - text = keyword, - onClick = { onSearchClick(keyword) }, - onCloseClick = { onRemove(keyword) } - ) + var searches by remember { + mutableStateOf(listOf("해리포터", "소설", "추리소설", "로맨스", "SF", "판타지")) } + + GroupRecentSearch( + recentSearches = searches, + onSearchClick = { keyword -> + // 검색 동작 시뮬레이션 + }, + onRemove = { keyword -> + searches = searches.filter { it != keyword } + } + ) + } + } +} + +@Preview(showBackground = true) +@Composable +fun GroupRecentSearchEmptyPreview() { + ThipTheme { + Box( + modifier = Modifier + .background(colors.Black) + .padding(16.dp) + ) { + GroupRecentSearch( + recentSearches = emptyList(), + onSearchClick = { }, + onRemove = { } + ) } } } 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 0aa99d1a..22b2d107 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 @@ -1,12 +1,21 @@ package com.texthip.thip.ui.group.myroom.component import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Box +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.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.material3.Icon import androidx.compose.material3.Text -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -29,12 +38,11 @@ fun GroupSearchTextField( onClick: (() -> Unit)? = null ) { val textStyle = typography.menu_r400_s14_h24.copy( - fontSize = 14.sp, lineHeight = 16.sp, color = colors.White ) val shape = RoundedCornerShape(12.dp) - val backgroundColor = colors.DarkGrey50 + val backgroundColor = colors.DarkGrey val cursorColor = colors.NeonGreen Box( diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/SimplePagerIndicator.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/SimplePagerIndicator.kt index 983c8fe1..5589d37d 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/SimplePagerIndicator.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/SimplePagerIndicator.kt @@ -10,7 +10,9 @@ 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.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors @Composable @@ -36,4 +38,20 @@ fun SimplePagerIndicator( ) } } +} + +@Preview(showBackground = true) +@Composable +fun SimplePagerIndicatorPreview() { + ThipTheme { + Box( + modifier = Modifier + .padding(16.dp) + ) { + SimplePagerIndicator( + pageCount = 5, + currentPage = 2 + ) + } + } } \ No newline at end of file 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 589f9198..4df8b8fb 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 @@ -75,12 +75,12 @@ fun GroupMyScreen( } ) - Spacer(modifier = Modifier.height(10.dp)) + Spacer(modifier = Modifier.height(20.dp)) if (filteredList.isNotEmpty()) { LazyColumn( verticalArrangement = Arrangement.spacedBy(20.dp), - contentPadding = PaddingValues(top = 10.dp, bottom = 20.dp), + contentPadding = PaddingValues(bottom = 20.dp), modifier = Modifier.fillMaxSize() ) { items(filteredList) { item -> @@ -102,12 +102,6 @@ fun GroupMyScreen( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { - Icon( - painter = painterResource(R.drawable.ic_notification), - contentDescription = null, - tint = colors.Grey02, - modifier = Modifier.padding(bottom = 12.dp) - ) Text( text = stringResource(R.string.group_myroom_error_comment1), color = colors.White, 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 c80d9329..426b1f96 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 @@ -113,11 +113,8 @@ fun GroupRoomScreen( Column( Modifier .fillMaxSize() - .padding(start = 20.dp, end = 20.dp) + .padding(start = 20.dp, end = 20.dp, bottom = 20.dp) ) { - Spacer(modifier = Modifier.height(20.dp)) - - //타이틀 Row( verticalAlignment = Alignment.CenterVertically ) { @@ -142,10 +139,9 @@ fun GroupRoomScreen( ) } } - Spacer(modifier = Modifier.height(32.dp)) - //소개글 Text( + modifier = Modifier.padding(top = 40.dp), text = stringResource(R.string.group_room_desc), style = typography.menu_sb600_s14_h24, color = colors.White, @@ -181,8 +177,9 @@ fun GroupRoomScreen( color = colors.White ) } - Spacer(Modifier.height(12.dp)) + Text( + modifier = Modifier.padding(top = 12.dp), text = stringResource( R.string.group_room_period, detail.startDate, @@ -213,8 +210,8 @@ fun GroupRoomScreen( color = colors.White ) } - Spacer(Modifier.height(12.dp)) Row( + modifier = Modifier.padding(top = 12.dp), verticalAlignment = Alignment.CenterVertically ) { Text( @@ -238,11 +235,12 @@ fun GroupRoomScreen( } } - Spacer(Modifier.height(16.dp)) Row( + Modifier + .fillMaxWidth() + .padding(top = 22.dp, bottom = 30.dp), verticalAlignment = Alignment.CenterVertically ) { - // 모집 마감/장르 Box( Modifier .background(colors.Grey03, shape = RoundedCornerShape(14.dp)) @@ -287,8 +285,6 @@ fun GroupRoomScreen( } } - Spacer(Modifier.height(30.dp)) - //읽을 책 정보 CardRoomBook( title = detail.bookData.title, @@ -298,27 +294,32 @@ fun GroupRoomScreen( imageRes = detail.bookData.imageRes ) - Spacer(Modifier.height(40.dp)) - Text( - text = stringResource(R.string.group_recommend), - style = typography.smalltitle_sb600_s18_h24, - color = colors.White - ) - Spacer(Modifier.height(24.dp)) + // 추천 모임방이 있을 때만 표시 + if (detail.recommendations.isNotEmpty()) { + Text( + modifier = Modifier.padding(top = 40.dp), + text = stringResource(R.string.group_recommend), + style = typography.smalltitle_sb600_s18_h24, + color = colors.White + ) - //추천 모임방 - 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( + modifier = Modifier + .padding(top = 24.dp) + .fillMaxWidth(), + 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) } + ) + } } } } @@ -493,7 +494,7 @@ fun GroupRoomScreenPreview_Join() { members = 22, maxMembers = 30, daysLeft = 4, - genre = "고전 문학", + genre = "문학", bookData = bookData, recommendations = recommendations ) @@ -623,7 +624,7 @@ fun GroupRoomScreenPreview_Close() { members = 15, // 적절한 인원 maxMembers = 30, daysLeft = 7, // 마감일이 조금 더 남음 - genre = "고전 문학", + genre = "문학", bookData = bookData, recommendations = recommendations ) 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 b96caccb..6f8c8d81 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 @@ -89,14 +89,13 @@ fun GroupRoomSecretScreen( Spacer(modifier = Modifier.height(160.dp)) Text( + modifier = Modifier.padding(bottom = 32.dp), text = stringResource(R.string.group_secret_screen_comment), style = typography.smalltitle_sb600_s18_h24, color = colors.White, textAlign = TextAlign.Center ) - Spacer(modifier = Modifier.height(32.dp)) - Row( horizontalArrangement = Arrangement.spacedBy(16.dp), verticalAlignment = Alignment.CenterVertically diff --git a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt index 68a6483f..e55b4d51 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt @@ -54,6 +54,7 @@ fun GroupDoneScreen( contentPadding = PaddingValues(bottom = 20.dp), modifier = Modifier .fillMaxSize() + .padding(top = 16.dp) ) { item { 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 a7a97c9f..20fe2f5f 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 @@ -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.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable @@ -59,15 +60,14 @@ fun GroupScreen( onLeftClick = { }, onRightClick = { } ) - Spacer(Modifier.height(16.dp)) // 검색창 GroupSearchTextField( + modifier = Modifier.padding(top = 16.dp, bottom = 32.dp), value = searchText, onValueChange = {}, onClick = {} ) - Spacer(Modifier.height(32.dp)) // 내 모임방 헤더 + 카드 GroupMySectionHeader( @@ -83,11 +83,11 @@ fun GroupScreen( Spacer( Modifier + .padding(bottom = 32.dp) .height(10.dp) .fillMaxWidth() .background(color = colors.DarkGrey02) ) - Spacer(Modifier.height(32.dp)) // 마감 임박한 독서 모임방 GroupRoomDeadlineSection( @@ -105,7 +105,7 @@ fun GroupScreen( } -@Preview() +@Preview @Composable fun PreviewGroupScreen() { ThipTheme { 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 c2eed097..c0061dcc 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 @@ -4,7 +4,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.compose.runtime.Composable import androidx.navigation.NavHostController -import com.texthip.thip.ui.booksearch.screen.BookSearchScreen +import com.texthip.thip.ui.search.screen.SearchBookScreen import com.texthip.thip.ui.feed.screen.FeedScreen import com.texthip.thip.ui.group.screen.GroupScreen import com.texthip.thip.ui.mypage.screen.MyPageScreen @@ -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 = navController) } + composable(Routes.BookSearch.route) { SearchBookScreen(navController = navController) } composable(Routes.MyPage.route) { MyPageScreen( navController, diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookLiveSearchResult.kt b/app/src/main/java/com/texthip/thip/ui/search/component/SearchActiveField.kt similarity index 91% rename from app/src/main/java/com/texthip/thip/ui/booksearch/component/BookLiveSearchResult.kt rename to app/src/main/java/com/texthip/thip/ui/search/component/SearchActiveField.kt index 06213f48..088b582b 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookLiveSearchResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/component/SearchActiveField.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.booksearch.component +package com.texthip.thip.ui.search.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -11,12 +11,12 @@ 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.search.mock.BookData import com.texthip.thip.ui.common.cards.CardBookList import com.texthip.thip.ui.theme.ThipTheme.colors @Composable -fun BookLiveSearchResult( +fun SearchActiveField( bookList: List ) { LazyColumn( diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookFilteredSearchResult.kt b/app/src/main/java/com/texthip/thip/ui/search/component/SearchBookFilteredResult.kt similarity index 85% rename from app/src/main/java/com/texthip/thip/ui/booksearch/component/BookFilteredSearchResult.kt rename to app/src/main/java/com/texthip/thip/ui/search/component/SearchBookFilteredResult.kt index da4743ef..d3b130d0 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookFilteredSearchResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/component/SearchBookFilteredResult.kt @@ -1,7 +1,13 @@ -package com.texthip.thip.ui.booksearch.component +package com.texthip.thip.ui.search.component import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* +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.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.material3.Text @@ -12,14 +18,14 @@ 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.search.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( +fun SearchBookFilteredResult( resultCount: Int, bookList: List ) { @@ -43,7 +49,7 @@ fun BookFilteredSearchResult( ) if (bookList.isEmpty()) { - BookEmptyResult( + SearchEmptyResult( mainText = stringResource(R.string.book_no_search_result1), subText = stringResource(R.string.book_no_search_result2), onRequestBook = { /*책 요청 처리*/ } @@ -78,7 +84,7 @@ fun BookFilteredSearchResult( @Composable fun PreviewBookFilteredSearchResult() { ThipTheme { - BookFilteredSearchResult( + SearchBookFilteredResult( resultCount = 3, bookList = listOf( BookData( diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookEmptyResult.kt b/app/src/main/java/com/texthip/thip/ui/search/component/SearchEmptyResult.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/booksearch/component/BookEmptyResult.kt rename to app/src/main/java/com/texthip/thip/ui/search/component/SearchEmptyResult.kt index 4d65d476..4687d6dd 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookEmptyResult.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/component/SearchEmptyResult.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.booksearch.component +package com.texthip.thip.ui.search.component 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 BookEmptyResult( +fun SearchEmptyResult( mainText: String, subText: String, onRequestBook: () -> Unit diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt b/app/src/main/java/com/texthip/thip/ui/search/component/SearchRecentBook.kt similarity index 93% rename from app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt rename to app/src/main/java/com/texthip/thip/ui/search/component/SearchRecentBook.kt index 27743bc9..18db248c 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/component/BookRecentSearch.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/component/SearchRecentBook.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.booksearch.component +package com.texthip.thip.ui.search.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -20,7 +20,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.booksearch.mock.BookData +import com.texthip.thip.ui.search.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 @@ -28,7 +28,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun BookRecentSearch( +fun SearchRecentBook( recentSearches: List, popularBooks: List, popularBookDate: String, @@ -40,7 +40,7 @@ fun BookRecentSearch( Text( text = stringResource(R.string.group_recent_search), color = colors.White, - style = typography.menu_r400_s14_h24 + style = typography.smalltitle_sb600_s18_h24 ) Spacer(modifier = Modifier.height(16.dp)) @@ -65,17 +65,18 @@ fun BookRecentSearch( } } } - Spacer(modifier = Modifier.height(32.dp)) Row( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .padding(top = 32.dp) + .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = stringResource(R.string.book_popular_search), color = colors.White, - style = typography.menu_r400_s14_h24 + style = typography.smalltitle_sb600_s18_h24 ) Text( text = stringResource(R.string.book_search_date, popularBookDate), @@ -87,7 +88,7 @@ fun BookRecentSearch( Box(modifier = Modifier .fillMaxWidth() - .weight(1f, fill = true) + .weight(1f) ) { if (popularBooks.isEmpty()) { Column( @@ -141,7 +142,7 @@ fun BookRecentSearch( @Composable fun PreviewBookRecentSearch() { ThipTheme { - BookRecentSearch( + SearchRecentBook( recentSearches = listOf("소설", "심리학", "철학", "역사", "과학", "에세이"), popularBooks = listOf( BookData( @@ -175,10 +176,10 @@ fun PreviewBookRecentSearch() { @Composable fun PreviewBookRecentSearch_EmptyPopular() { ThipTheme { - BookRecentSearch( + SearchRecentBook( recentSearches = emptyList(), popularBooks = emptyList(), - popularBookDate = "01.12.", + 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/search/mock/BookData.kt similarity index 80% rename from app/src/main/java/com/texthip/thip/ui/booksearch/mock/BookData.kt rename to app/src/main/java/com/texthip/thip/ui/search/mock/BookData.kt index ae839da1..0534fc31 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/mock/BookData.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/mock/BookData.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.booksearch.mock +package com.texthip.thip.ui.search.mock import com.texthip.thip.R diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/mock/DetailBookData.kt b/app/src/main/java/com/texthip/thip/ui/search/mock/DetailBookData.kt similarity index 86% rename from app/src/main/java/com/texthip/thip/ui/booksearch/mock/DetailBookData.kt rename to app/src/main/java/com/texthip/thip/ui/search/mock/DetailBookData.kt index 1de6ad7b..b30df944 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/mock/DetailBookData.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/mock/DetailBookData.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.booksearch.mock +package com.texthip.thip.ui.search.mock import com.texthip.thip.R diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookDetailScreen.kt b/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookDetailScreen.kt similarity index 96% rename from app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookDetailScreen.kt rename to app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookDetailScreen.kt index 142c447c..29bf101c 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookDetailScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookDetailScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.booksearch.screen +package com.texthip.thip.ui.search.screen import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.Image @@ -37,7 +37,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.booksearch.mock.DetailBookData +import com.texthip.thip.ui.search.mock.DetailBookData import com.texthip.thip.ui.common.buttons.ActionMediumButton import com.texthip.thip.ui.common.buttons.FilterButton import com.texthip.thip.ui.common.modal.InfoPopup @@ -49,7 +49,7 @@ import com.texthip.thip.ui.theme.ThipTheme.typography import kotlinx.coroutines.delay @Composable -fun BookDetailScreen( +fun SearchBookDetailScreen( modifier: Modifier = Modifier, book: DetailBookData, feedList: List = emptyList(), @@ -139,8 +139,6 @@ fun BookDetailScreen( ) } - Spacer(modifier = Modifier.height(8.dp)) - // 상세 정보 영역 Column( modifier = Modifier @@ -162,21 +160,21 @@ fun BookDetailScreen( book.publisher ), color = colors.Grey, - style = typography.copy_r400_s12_h20 + style = typography.menu_sb600_s12_h20 ) - Spacer(modifier = Modifier.height(32.dp)) Column( modifier = Modifier + .padding(top = 33.dp) .fillMaxWidth() .clickable { isIntroductionPopupVisible = true } ) { Text( text = stringResource(R.string.search_book_comment), color = colors.White, - style = typography.menu_r400_s14_h24, + style = typography.menu_sb600_s14_h24, ) - Spacer(modifier = Modifier.height(4.dp)) + Spacer(modifier = Modifier.height(5.dp)) Text( text = book.description, @@ -327,7 +325,7 @@ fun BookDetailScreen( @Composable fun PreviewBookDetailScreen() { ThipTheme { - BookDetailScreen( + SearchBookDetailScreen( book = DetailBookData( title = "채식주의자", author = "한강", diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookRecruitingScreen.kt b/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookGroupScreen.kt similarity index 97% rename from app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookRecruitingScreen.kt rename to app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookGroupScreen.kt index 9a2afca7..f21c0ff3 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookRecruitingScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookGroupScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.booksearch.screen +package com.texthip.thip.ui.search.screen import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -18,7 +18,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -34,7 +33,7 @@ import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.ui.theme.ThipTheme.typography @Composable -fun BookRecruitingScreen( +fun SearchBookGroupScreen( recruitingList: List, onCardClick: (GroupCardItemRoomData) -> Unit = {}, onCreateRoomClick: () -> Unit = {} @@ -55,6 +54,7 @@ fun BookRecruitingScreen( .background(colors.Black) .fillMaxSize() .padding(horizontal = 20.dp) + .padding(top = 16.dp) ) { Row( modifier = Modifier.fillMaxWidth(), @@ -210,7 +210,7 @@ fun GroupRecruitingScreenPreview() { ) ) - BookRecruitingScreen( + SearchBookGroupScreen( recruitingList = dataList ) } @@ -220,7 +220,7 @@ fun GroupRecruitingScreenPreview() { @Composable fun GroupRecruitingScreenEmptyPreview() { ThipTheme { - BookRecruitingScreen( + SearchBookGroupScreen( recruitingList = emptyList() ) } diff --git a/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt b/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt similarity index 92% rename from app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt rename to app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt index 80923550..efa3f02d 100644 --- a/app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt @@ -1,4 +1,4 @@ -package com.texthip.thip.ui.booksearch.screen +package com.texthip.thip.ui.search.screen import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -24,17 +24,17 @@ 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.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.search.component.SearchEmptyResult +import com.texthip.thip.ui.search.component.SearchBookFilteredResult +import com.texthip.thip.ui.search.component.SearchActiveField +import com.texthip.thip.ui.search.component.SearchRecentBook +import com.texthip.thip.ui.search.mock.BookData import com.texthip.thip.ui.common.forms.SearchBookTextField import com.texthip.thip.ui.common.topappbar.LeftNameTopAppBar import com.texthip.thip.ui.theme.ThipTheme @Composable -fun BookSearchScreen( +fun SearchBookScreen( modifier: Modifier = Modifier, navController: NavHostController? = null, bookList: List = emptyList(), @@ -116,7 +116,7 @@ fun BookSearchScreen( when { searchText.isBlank() && !isSearched -> { - BookRecentSearch( + SearchRecentBook( recentSearches = recentSearches, popularBooks = popularBooks, popularBookDate = "01.12", // TODO: 서버로 날짜를 받아 오게 수정 @@ -135,20 +135,20 @@ fun BookSearchScreen( searchText.isNotBlank() && !isSearched -> { if (liveFilteredBookList.isEmpty()) { - BookEmptyResult( + SearchEmptyResult( mainText = stringResource(R.string.book_no_search_result1), subText = stringResource(R.string.book_no_search_result2), onRequestBook = { /*책 요청 처리*/ } ) } else { - BookLiveSearchResult( + SearchActiveField( bookList = liveFilteredBookList ) } } isSearched -> { - BookFilteredSearchResult( + SearchBookFilteredResult( resultCount = filteredBookList.size, bookList = filteredBookList, ) @@ -164,7 +164,7 @@ fun BookSearchScreen( @Composable fun PreviewBookSearchScreen_Default() { ThipTheme { - BookSearchScreen( + SearchBookScreen( bookList = listOf( BookData("aaa", "리처드 도킨스", "을유문화사", R.drawable.bookcover_sample), BookData("abc", "마틴 셀리그만", "물푸레", R.drawable.bookcover_sample), @@ -189,7 +189,7 @@ fun PreviewBookSearchScreen_Default() { @Composable fun PreviewBookSearchScreen_EmptyPopular() { ThipTheme { - BookSearchScreen( + SearchBookScreen( bookList = listOf( BookData("aaa", "리처드 도킨스", "을유문화사", R.drawable.bookcover_sample), BookData("abc", "마틴 셀리그만", "물푸레", R.drawable.bookcover_sample), diff --git a/app/src/main/res/drawable/ic_x_circle_grey02.xml b/app/src/main/res/drawable/ic_x_circle_grey02.xml new file mode 100644 index 00000000..173c712d --- /dev/null +++ b/app/src/main/res/drawable/ic_x_circle_grey02.xml @@ -0,0 +1,16 @@ + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d1ca9807..8e2099e1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -175,8 +175,8 @@ 비밀번호를 입력해주세요. 비밀번호가 일치하지 않습니다. 모임방 참여가 완료되었어요! - 참여를 취소하시겠어요? - 참여 취소 후 다시 참여할 수 있어요. + 모임방 참여를 취소하시겠어요? + 지금 취소해도, 활동 시작 전에 다시 참여 가능해요. 모임방 참여가 취소되었어요! 다른 방을 찾아보세요. 기록할 페이지 총평 @@ -199,8 +199,9 @@ 저장한 책 모임 책 책 제목을 검색해보세요. - 책 등록하기 - 현재 등록된 책이 아닙니다.\n원하시는 책을 신청해주세요. + 책 신청하기 + 현재 등록된 책이 아닙니다. + 원하시는 책을 신청해주세요. 책 신청 이메일로 책 제목, 출판사를 보내주시면 빠른 시일내로 책을 추가해드릴게요!