Skip to content

Commit 7908621

Browse files
committed
[BOOK-203] feat: 등록된 도서 및 등록 완료 도서 UI 비활성화 처리
1 parent 5eb114c commit 7908621

7 files changed

Lines changed: 66 additions & 9 deletions

File tree

core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/mapper/ResponseToModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ internal fun BookSummary.toModel(): BookSummaryModel {
5555
author = author,
5656
publisher = publisher,
5757
coverImageUrl = coverImageUrl,
58+
userBookStatus = userBookStatus,
5859
)
5960
}
6061

core/model/src/main/kotlin/com/ninecraft/booket/core/model/BookSearchModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ data class BookSummaryModel(
2424
val author: String = "",
2525
val publisher: String = "",
2626
val coverImageUrl: String = "",
27+
val userBookStatus: String = ""
2728
)

core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/BookSearchResponse.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,6 @@ data class BookSummary(
4141
val publisher: String,
4242
@SerialName("coverImageUrl")
4343
val coverImageUrl: String,
44+
@SerialName("userBookStatus")
45+
val userBookStatus: String,
4446
)

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ class SearchPresenter @AssistedInject constructor(
102102
repository.upsertBook(bookIsbn, bookStatus)
103103
.onSuccess {
104104
registeredUserBookId = it.userBookId
105+
books = books.map { book ->
106+
if (book.isbn == selectedBookIsbn) {
107+
book.copy(userBookStatus = bookStatus)
108+
} else book
109+
}.toPersistentList()
110+
105111
selectedBookIsbn = ""
106112
selectedBookStatus = null
107113
isBookRegisterBottomSheetVisible = false

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUi.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ internal fun SearchContent(
233233
onBookClick = { book ->
234234
state.eventSink(SearchUiEvent.OnBookClick(book.isbn))
235235
},
236+
enabled = SearchBookStatus.from(state.books[index].userBookStatus) == SearchBookStatus.BEFORE_REGISTRATION
236237
)
237238
HorizontalDivider(
238239
modifier = Modifier.fillMaxWidth(),

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,13 @@ sealed interface SearchUiEvent : CircuitUiEvent {
6262
data object OnBookRegisterSuccessOkButtonClick : SearchUiEvent
6363
data object OnBookRegisterSuccessCancelButtonClick : SearchUiEvent
6464
}
65+
66+
enum class SearchBookStatus(val value: String) {
67+
BEFORE_REGISTRATION("BEFORE_REGISTRATION");
68+
69+
companion object {
70+
fun from(value: String?): SearchBookStatus? {
71+
return entries.find { it.value == value }
72+
}
73+
}
74+
}

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/BookItem.kt

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.ninecraft.booket.feature.search.component
22

3+
import androidx.compose.foundation.background
34
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.layout.Box
46
import androidx.compose.foundation.layout.Column
57
import androidx.compose.foundation.layout.Row
68
import androidx.compose.foundation.layout.Spacer
@@ -15,12 +17,14 @@ import androidx.compose.runtime.Composable
1517
import androidx.compose.ui.Alignment
1618
import androidx.compose.ui.Modifier
1719
import androidx.compose.ui.draw.clip
20+
import androidx.compose.ui.graphics.Color
1821
import androidx.compose.ui.res.painterResource
1922
import androidx.compose.ui.text.style.TextOverflow
2023
import androidx.compose.ui.unit.dp
2124
import com.ninecraft.booket.core.designsystem.ComponentPreview
2225
import com.ninecraft.booket.core.designsystem.component.NetworkImage
2326
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
27+
import com.ninecraft.booket.core.designsystem.theme.White
2428
import com.ninecraft.booket.core.model.BookSummaryModel
2529
import com.ninecraft.booket.core.designsystem.R as designR
2630

@@ -29,17 +33,23 @@ fun BookItem(
2933
book: BookSummaryModel,
3034
onBookClick: (BookSummaryModel) -> Unit,
3135
modifier: Modifier = Modifier,
36+
enabled: Boolean = true,
3237
) {
38+
val titleColor = if (enabled) ReedTheme.colors.contentPrimary else ReedTheme.colors.contentDisabled
39+
val authorColor = if (enabled) ReedTheme.colors.contentTertiary else ReedTheme.colors.contentDisabled
40+
val bgColor = if (enabled) White else ReedTheme.colors.bgDisabled
41+
3342
Row(
3443
modifier = modifier
3544
.fillMaxWidth()
36-
.clickable { onBookClick(book) }
45+
.background(bgColor)
46+
.then(
47+
if (enabled) Modifier.clickable { onBookClick(book) } else Modifier,
48+
)
3749
.padding(horizontal = ReedTheme.spacing.spacing5),
3850
verticalAlignment = Alignment.CenterVertically,
3951
) {
40-
NetworkImage(
41-
imageUrl = book.coverImageUrl,
42-
contentDescription = "Book CoverImage",
52+
Box(
4353
modifier = Modifier
4454
.padding(
4555
top = ReedTheme.spacing.spacing4,
@@ -49,12 +59,38 @@ fun BookItem(
4959
.width(68.dp)
5060
.height(100.dp)
5161
.clip(RoundedCornerShape(size = ReedTheme.radius.sm)),
52-
placeholder = painterResource(designR.drawable.ic_placeholder),
53-
)
62+
) {
63+
NetworkImage(
64+
imageUrl = book.coverImageUrl,
65+
contentDescription = "Book CoverImage",
66+
modifier = Modifier.matchParentSize(),
67+
placeholder = painterResource(designR.drawable.ic_placeholder),
68+
)
69+
70+
if (!enabled) {
71+
Box(
72+
modifier = Modifier
73+
.matchParentSize()
74+
.background(Color.Black.copy(alpha = 0.3f)),
75+
)
76+
}
77+
}
78+
79+
5480
Column(modifier = Modifier.weight(1f)) {
81+
if (!enabled) {
82+
Text(
83+
text = "이미 등록된 책입니다",
84+
color = ReedTheme.colors.contentSuccess,
85+
overflow = TextOverflow.Ellipsis,
86+
maxLines = 1,
87+
style = ReedTheme.typography.label2Regular,
88+
)
89+
Spacer(Modifier.height(ReedTheme.spacing.spacing1))
90+
}
5591
Text(
5692
text = book.title,
57-
color = ReedTheme.colors.contentPrimary,
93+
color = titleColor,
5894
overflow = TextOverflow.Ellipsis,
5995
maxLines = 1,
6096
style = ReedTheme.typography.body1SemiBold,
@@ -66,7 +102,7 @@ fun BookItem(
66102
) {
67103
Text(
68104
text = book.author,
69-
color = ReedTheme.colors.contentTertiary,
105+
color = authorColor,
70106
overflow = TextOverflow.Ellipsis,
71107
maxLines = 1,
72108
style = ReedTheme.typography.label1Medium,
@@ -81,7 +117,7 @@ fun BookItem(
81117
Spacer(Modifier.width(ReedTheme.spacing.spacing1))
82118
Text(
83119
text = book.publisher,
84-
color = ReedTheme.colors.contentTertiary,
120+
color = authorColor,
85121
overflow = TextOverflow.Ellipsis,
86122
maxLines = 1,
87123
style = ReedTheme.typography.label1Medium,

0 commit comments

Comments
 (0)