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 @@
네, 진행할게요!
도서 등록
최근 검색어 내역이 없습니다.
+ 이미 등록된 책입니다