Skip to content

Commit a82f2d9

Browse files
authored
Merge pull request #92 from YAPP-Github/BOOK-203-feature/#91
feat: 도서 검색에서 등록된 도서 및 등록 완료 도서 UI 비활성화 처리
2 parents 5eb114c + c8ea113 commit a82f2d9

8 files changed

Lines changed: 69 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: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,14 @@ 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+
70+
companion object {
71+
fun from(value: String?): SearchBookStatus? {
72+
return entries.find { it.value == value }
73+
}
74+
}
75+
}

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

Lines changed: 46 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,31 +17,41 @@ 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
22+
import androidx.compose.ui.res.stringResource
1923
import androidx.compose.ui.text.style.TextOverflow
2024
import androidx.compose.ui.unit.dp
2125
import com.ninecraft.booket.core.designsystem.ComponentPreview
2226
import com.ninecraft.booket.core.designsystem.component.NetworkImage
2327
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
28+
import com.ninecraft.booket.core.designsystem.theme.White
2429
import com.ninecraft.booket.core.model.BookSummaryModel
30+
import com.ninecraft.booket.feature.search.R
2531
import com.ninecraft.booket.core.designsystem.R as designR
2632

2733
@Composable
2834
fun BookItem(
2935
book: BookSummaryModel,
3036
onBookClick: (BookSummaryModel) -> Unit,
3137
modifier: Modifier = Modifier,
38+
enabled: Boolean = true,
3239
) {
40+
val titleColor = if (enabled) ReedTheme.colors.contentPrimary else ReedTheme.colors.contentDisabled
41+
val authorColor = if (enabled) ReedTheme.colors.contentTertiary else ReedTheme.colors.contentDisabled
42+
val bgColor = if (enabled) White else ReedTheme.colors.bgDisabled
43+
3344
Row(
3445
modifier = modifier
3546
.fillMaxWidth()
36-
.clickable { onBookClick(book) }
47+
.background(bgColor)
48+
.then(
49+
if (enabled) Modifier.clickable { onBookClick(book) } else Modifier,
50+
)
3751
.padding(horizontal = ReedTheme.spacing.spacing5),
3852
verticalAlignment = Alignment.CenterVertically,
3953
) {
40-
NetworkImage(
41-
imageUrl = book.coverImageUrl,
42-
contentDescription = "Book CoverImage",
54+
Box(
4355
modifier = Modifier
4456
.padding(
4557
top = ReedTheme.spacing.spacing4,
@@ -49,12 +61,37 @@ fun BookItem(
4961
.width(68.dp)
5062
.height(100.dp)
5163
.clip(RoundedCornerShape(size = ReedTheme.radius.sm)),
52-
placeholder = painterResource(designR.drawable.ic_placeholder),
53-
)
64+
) {
65+
NetworkImage(
66+
imageUrl = book.coverImageUrl,
67+
contentDescription = "Book CoverImage",
68+
modifier = Modifier.matchParentSize(),
69+
placeholder = painterResource(designR.drawable.ic_placeholder),
70+
)
71+
72+
if (!enabled) {
73+
Box(
74+
modifier = Modifier
75+
.matchParentSize()
76+
.background(Color.Black.copy(alpha = 0.3f)),
77+
)
78+
}
79+
}
80+
5481
Column(modifier = Modifier.weight(1f)) {
82+
if (!enabled) {
83+
Text(
84+
text = stringResource(R.string.book_status_registered),
85+
color = ReedTheme.colors.contentSuccess,
86+
overflow = TextOverflow.Ellipsis,
87+
maxLines = 1,
88+
style = ReedTheme.typography.label2Regular,
89+
)
90+
Spacer(Modifier.height(ReedTheme.spacing.spacing1))
91+
}
5592
Text(
5693
text = book.title,
57-
color = ReedTheme.colors.contentPrimary,
94+
color = titleColor,
5895
overflow = TextOverflow.Ellipsis,
5996
maxLines = 1,
6097
style = ReedTheme.typography.body1SemiBold,
@@ -66,7 +103,7 @@ fun BookItem(
66103
) {
67104
Text(
68105
text = book.author,
69-
color = ReedTheme.colors.contentTertiary,
106+
color = authorColor,
70107
overflow = TextOverflow.Ellipsis,
71108
maxLines = 1,
72109
style = ReedTheme.typography.label1Medium,
@@ -81,7 +118,7 @@ fun BookItem(
81118
Spacer(Modifier.width(ReedTheme.spacing.spacing1))
82119
Text(
83120
text = book.publisher,
84-
color = ReedTheme.colors.contentTertiary,
121+
color = authorColor,
85122
overflow = TextOverflow.Ellipsis,
86123
maxLines = 1,
87124
style = ReedTheme.typography.label1Medium,

feature/search/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@
1414
<string name="book_register_success_ok">네, 진행할게요!</string>
1515
<string name="book_register_ok">도서 등록</string>
1616
<string name="empty_recent_searches">최근 검색어 내역이 없습니다.</string>
17+
<string name="book_status_registered">이미 등록된 책입니다</string>
1718
</resources>

0 commit comments

Comments
 (0)