diff --git a/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/mapper/ResponseToModel.kt b/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/mapper/ResponseToModel.kt index f2801a7a..0f0cd2eb 100644 --- a/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/mapper/ResponseToModel.kt +++ b/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/mapper/ResponseToModel.kt @@ -55,6 +55,7 @@ internal fun BookSummary.toModel(): BookSummaryModel { author = author, publisher = publisher, coverImageUrl = coverImageUrl, + userBookStatus = userBookStatus, ) } diff --git a/core/model/src/main/kotlin/com/ninecraft/booket/core/model/BookSearchModel.kt b/core/model/src/main/kotlin/com/ninecraft/booket/core/model/BookSearchModel.kt index fda5b65f..6dcc8f82 100644 --- a/core/model/src/main/kotlin/com/ninecraft/booket/core/model/BookSearchModel.kt +++ b/core/model/src/main/kotlin/com/ninecraft/booket/core/model/BookSearchModel.kt @@ -24,4 +24,5 @@ data class BookSummaryModel( val author: String = "", val publisher: String = "", val coverImageUrl: String = "", + val userBookStatus: String = "", ) diff --git a/core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/BookSearchResponse.kt b/core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/BookSearchResponse.kt index 7a3a700e..16513370 100644 --- a/core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/BookSearchResponse.kt +++ b/core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/BookSearchResponse.kt @@ -41,4 +41,6 @@ data class BookSummary( val publisher: String, @SerialName("coverImageUrl") val coverImageUrl: String, + @SerialName("userBookStatus") + val userBookStatus: String, ) diff --git a/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt b/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt index 39c97561..4c7c6a35 100644 --- a/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt +++ b/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt @@ -102,6 +102,12 @@ class SearchPresenter @AssistedInject constructor( repository.upsertBook(bookIsbn, bookStatus) .onSuccess { registeredUserBookId = it.userBookId + books = books.map { book -> + if (book.isbn == selectedBookIsbn) { + book.copy(userBookStatus = bookStatus) + } else book + }.toPersistentList() + selectedBookIsbn = "" selectedBookStatus = null isBookRegisterBottomSheetVisible = false diff --git a/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUi.kt b/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUi.kt index 3f51459a..29b372ad 100644 --- a/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUi.kt +++ b/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUi.kt @@ -233,6 +233,7 @@ internal fun SearchContent( onBookClick = { book -> state.eventSink(SearchUiEvent.OnBookClick(book.isbn)) }, + enabled = SearchBookStatus.from(state.books[index].userBookStatus) == SearchBookStatus.BEFORE_REGISTRATION, ) HorizontalDivider( modifier = Modifier.fillMaxWidth(), diff --git a/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt b/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt index d5cc342d..784832c9 100644 --- a/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt +++ b/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt @@ -62,3 +62,14 @@ sealed interface SearchUiEvent : CircuitUiEvent { data object OnBookRegisterSuccessOkButtonClick : SearchUiEvent data object OnBookRegisterSuccessCancelButtonClick : SearchUiEvent } + +enum class SearchBookStatus(val value: String) { + BEFORE_REGISTRATION("BEFORE_REGISTRATION"), + ; + + companion object { + fun from(value: String?): SearchBookStatus? { + return entries.find { it.value == value } + } + } +} diff --git a/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookItem.kt b/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookItem.kt index 7c2cf098..d9e70a13 100644 --- a/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookItem.kt +++ b/feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookItem.kt @@ -1,6 +1,8 @@ package com.ninecraft.booket.feature.search.component +import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -15,13 +17,17 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.ninecraft.booket.core.designsystem.ComponentPreview import com.ninecraft.booket.core.designsystem.component.NetworkImage import com.ninecraft.booket.core.designsystem.theme.ReedTheme +import com.ninecraft.booket.core.designsystem.theme.White import com.ninecraft.booket.core.model.BookSummaryModel +import com.ninecraft.booket.feature.search.R import com.ninecraft.booket.core.designsystem.R as designR @Composable @@ -29,17 +35,23 @@ fun BookItem( book: BookSummaryModel, onBookClick: (BookSummaryModel) -> Unit, modifier: Modifier = Modifier, + enabled: Boolean = true, ) { + val titleColor = if (enabled) ReedTheme.colors.contentPrimary else ReedTheme.colors.contentDisabled + val authorColor = if (enabled) ReedTheme.colors.contentTertiary else ReedTheme.colors.contentDisabled + val bgColor = if (enabled) White else ReedTheme.colors.bgDisabled + Row( modifier = modifier .fillMaxWidth() - .clickable { onBookClick(book) } + .background(bgColor) + .then( + if (enabled) Modifier.clickable { onBookClick(book) } else Modifier, + ) .padding(horizontal = ReedTheme.spacing.spacing5), verticalAlignment = Alignment.CenterVertically, ) { - NetworkImage( - imageUrl = book.coverImageUrl, - contentDescription = "Book CoverImage", + Box( modifier = Modifier .padding( top = ReedTheme.spacing.spacing4, @@ -49,12 +61,37 @@ fun BookItem( .width(68.dp) .height(100.dp) .clip(RoundedCornerShape(size = ReedTheme.radius.sm)), - placeholder = painterResource(designR.drawable.ic_placeholder), - ) + ) { + NetworkImage( + imageUrl = book.coverImageUrl, + contentDescription = "Book CoverImage", + modifier = Modifier.matchParentSize(), + placeholder = painterResource(designR.drawable.ic_placeholder), + ) + + if (!enabled) { + Box( + modifier = Modifier + .matchParentSize() + .background(Color.Black.copy(alpha = 0.3f)), + ) + } + } + Column(modifier = Modifier.weight(1f)) { + if (!enabled) { + Text( + text = stringResource(R.string.book_status_registered), + color = ReedTheme.colors.contentSuccess, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + style = ReedTheme.typography.label2Regular, + ) + Spacer(Modifier.height(ReedTheme.spacing.spacing1)) + } Text( text = book.title, - color = ReedTheme.colors.contentPrimary, + color = titleColor, overflow = TextOverflow.Ellipsis, maxLines = 1, style = ReedTheme.typography.body1SemiBold, @@ -66,7 +103,7 @@ fun BookItem( ) { Text( text = book.author, - color = ReedTheme.colors.contentTertiary, + color = authorColor, overflow = TextOverflow.Ellipsis, maxLines = 1, style = ReedTheme.typography.label1Medium, @@ -81,7 +118,7 @@ fun BookItem( Spacer(Modifier.width(ReedTheme.spacing.spacing1)) Text( text = book.publisher, - color = ReedTheme.colors.contentTertiary, + color = authorColor, overflow = TextOverflow.Ellipsis, maxLines = 1, style = ReedTheme.typography.label1Medium, diff --git a/feature/search/src/main/res/values/strings.xml b/feature/search/src/main/res/values/strings.xml index 7bb8bbee..cf16e640 100644 --- a/feature/search/src/main/res/values/strings.xml +++ b/feature/search/src/main/res/values/strings.xml @@ -14,4 +14,5 @@ 네, 진행할게요! 도서 등록 최근 검색어 내역이 없습니다. + 이미 등록된 책입니다