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 1d61416c..85de7a76 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 @@ -170,8 +170,11 @@ internal fun RecordRegisterResponse.toModel(): RecordRegisterModel { internal fun ReadingRecordsResponse.toModel(): ReadingRecordsModel { return ReadingRecordsModel( - content = content.map { it.toModel() }, - page = page.toModel(), + lastPage = lastPage, + totalResults = totalResults, + startIndex = startIndex, + itemsPerPage = itemsPerPage, + readingRecords = readingRecords.map { it.toModel() }, ) } @@ -188,6 +191,7 @@ internal fun ReadingRecord.toModel(): ReadingRecordModel { bookTitle = bookTitle, bookPublisher = bookPublisher, bookCoverImageUrl = bookCoverImageUrl, + author = author, ) } diff --git a/core/model/src/main/kotlin/com/ninecraft/booket/core/model/ReadingRecordsModel.kt b/core/model/src/main/kotlin/com/ninecraft/booket/core/model/ReadingRecordsModel.kt index d4438f1d..f60f2dee 100644 --- a/core/model/src/main/kotlin/com/ninecraft/booket/core/model/ReadingRecordsModel.kt +++ b/core/model/src/main/kotlin/com/ninecraft/booket/core/model/ReadingRecordsModel.kt @@ -1,8 +1,11 @@ package com.ninecraft.booket.core.model data class ReadingRecordsModel( - val content: List = emptyList(), - val page: PageInfoModel = PageInfoModel(), + val lastPage: Boolean = true, + val totalResults: Int = 0, + val startIndex: Int = 0, + val itemsPerPage: Int = 0, + val readingRecords: List = emptyList(), ) data class ReadingRecordModel( @@ -17,4 +20,5 @@ data class ReadingRecordModel( val bookTitle: String = "", val bookPublisher: String = "", val bookCoverImageUrl: String = "", + val author: String = "", ) diff --git a/core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/ReadingRecordsResponse.kt b/core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/ReadingRecordsResponse.kt index 7bc35125..324c5784 100644 --- a/core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/ReadingRecordsResponse.kt +++ b/core/network/src/main/kotlin/com/ninecraft/booket/core/network/response/ReadingRecordsResponse.kt @@ -5,10 +5,16 @@ import kotlinx.serialization.Serializable @Serializable data class ReadingRecordsResponse( - @SerialName("content") - val content: List, - @SerialName("page") - val page: PageInfo, + @SerialName("lastPage") + val lastPage: Boolean, + @SerialName("totalResults") + val totalResults: Int, + @SerialName("startIndex") + val startIndex: Int, + @SerialName("itemsPerPage") + val itemsPerPage: Int, + @SerialName("readingRecords") + val readingRecords: List, ) @Serializable @@ -35,4 +41,6 @@ data class ReadingRecord( val bookPublisher: String, @SerialName("bookCoverImageUrl") val bookCoverImageUrl: String, + @SerialName("author") + val author: String, ) diff --git a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailPresenter.kt b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailPresenter.kt index 622c5150..91b3f662 100644 --- a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailPresenter.kt +++ b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailPresenter.kt @@ -15,7 +15,6 @@ import com.ninecraft.booket.core.data.api.repository.BookRepository import com.ninecraft.booket.core.data.api.repository.RecordRepository import com.ninecraft.booket.core.model.BookDetailModel import com.ninecraft.booket.core.model.EmotionModel -import com.ninecraft.booket.core.model.PageInfoModel import com.ninecraft.booket.core.model.ReadingRecordModel import com.ninecraft.booket.core.ui.component.FooterState import com.ninecraft.booket.feature.screens.BookDetailScreen @@ -36,6 +35,7 @@ import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch import java.time.LocalDateTime @@ -65,7 +65,7 @@ class BookDetailPresenter @AssistedInject constructor( var bookDetail by rememberRetained { mutableStateOf(BookDetailModel()) } var seedsStates by rememberRetained { mutableStateOf>(persistentListOf()) } var readingRecords by rememberRetained { mutableStateOf(persistentListOf()) } - var readingRecordsPageInfo by rememberRetained { mutableStateOf(PageInfoModel()) } + var readingRecordsTotalCount by rememberRetained { mutableIntStateOf(0) } var currentStartIndex by rememberRetained { mutableIntStateOf(START_INDEX) } var isLastPage by rememberRetained { mutableStateOf(false) } var currentBookStatus by rememberRetained { mutableStateOf(BookStatus.READING) } @@ -76,11 +76,11 @@ class BookDetailPresenter @AssistedInject constructor( var sideEffect by rememberRetained { mutableStateOf(null) } @Suppress("TooGenericExceptionCaught") - fun initialLoad() { + suspend fun initialLoad() { uiState = UiState.Loading try { - scope.launch { + coroutineScope { val bookDetailDef = async { bookRepository.getBookDetail(screen.isbn13).getOrThrow() } val seedsDef = async { bookRepository.getSeedsStats(screen.userBookId).getOrThrow() } val readingRecordsDef = async { @@ -99,10 +99,10 @@ class BookDetailPresenter @AssistedInject constructor( currentBookStatus = BookStatus.fromValue(detail.userBookStatus) ?: BookStatus.BEFORE_READING selectedBookStatus = currentBookStatus seedsStates = seeds.categories.toImmutableList() - readingRecords = records.content.toPersistentList() - readingRecordsPageInfo = records.page + readingRecords = records.readingRecords.toPersistentList() + readingRecordsTotalCount = records.totalResults - isLastPage = records.content.size < PAGE_SIZE + isLastPage = records.lastPage currentStartIndex = START_INDEX uiState = UiState.Success @@ -170,9 +170,9 @@ class BookDetailPresenter @AssistedInject constructor( page = startIndex, size = PAGE_SIZE, ).onSuccess { result -> - readingRecords = (readingRecords + result.content).toPersistentList() + readingRecords = (readingRecords + result.readingRecords).toPersistentList() currentStartIndex = startIndex - isLastPage = result.content.size < PAGE_SIZE + isLastPage = result.lastPage footerState = if (isLastPage) FooterState.End else FooterState.Idle }.onFailure { exception -> Logger.d(exception) @@ -254,7 +254,7 @@ class BookDetailPresenter @AssistedInject constructor( bookDetail = bookDetail, seedsStats = seedsStates, readingRecords = readingRecords, - readingRecordsPageInfo = readingRecordsPageInfo, + readingRecordsTotalCount = readingRecordsTotalCount, isBookUpdateBottomSheetVisible = isBookUpdateBottomSheetVisible, isRecordSortBottomSheetVisible = isRecordSortBottomSheetVisible, currentBookStatus = currentBookStatus, diff --git a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUi.kt b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUi.kt index 85370845..35ec50ee 100644 --- a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUi.kt +++ b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUi.kt @@ -223,7 +223,7 @@ internal fun BookDetailContent( ) { Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing6)) ReadingRecordsHeader( - pageInfo = state.readingRecordsPageInfo, + totalCount = state.readingRecordsTotalCount, currentRecordSort = state.currentRecordSort, onReadingRecordClick = { state.eventSink(BookDetailUiEvent.OnRecordSortButtonClick) diff --git a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUiState.kt b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUiState.kt index 72d548f9..09ee36b8 100644 --- a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUiState.kt +++ b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUiState.kt @@ -5,7 +5,6 @@ import com.ninecraft.booket.core.common.R import com.ninecraft.booket.core.common.constants.BookStatus import com.ninecraft.booket.core.model.BookDetailModel import com.ninecraft.booket.core.model.EmotionModel -import com.ninecraft.booket.core.model.PageInfoModel import com.ninecraft.booket.core.model.ReadingRecordModel import com.ninecraft.booket.core.ui.component.FooterState import com.slack.circuit.runtime.CircuitUiEvent @@ -28,7 +27,7 @@ data class BookDetailUiState( val bookDetail: BookDetailModel = BookDetailModel(), val seedsStats: ImmutableList = persistentListOf(), val readingRecords: ImmutableList = persistentListOf(), - val readingRecordsPageInfo: PageInfoModel = PageInfoModel(), + val readingRecordsTotalCount: Int = 0, val currentStartIndex: Int = 1, val isLastPage: Boolean = false, val currentBookStatus: BookStatus = BookStatus.BEFORE_READING, diff --git a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/component/ReadingRecordsHeader.kt b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/component/ReadingRecordsHeader.kt index 2868a472..658d672a 100644 --- a/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/component/ReadingRecordsHeader.kt +++ b/feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/component/ReadingRecordsHeader.kt @@ -15,14 +15,13 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import com.ninecraft.booket.core.designsystem.theme.ReedTheme -import com.ninecraft.booket.core.model.PageInfoModel import com.ninecraft.booket.feature.detail.R import com.ninecraft.booket.feature.detail.book.RecordSort import com.ninecraft.booket.core.designsystem.R as designR @Composable internal fun ReadingRecordsHeader( - pageInfo: PageInfoModel, + totalCount: Int, currentRecordSort: RecordSort, onReadingRecordClick: () -> Unit, modifier: Modifier = Modifier, @@ -40,7 +39,7 @@ internal fun ReadingRecordsHeader( ) Spacer(modifier = Modifier.width(ReedTheme.spacing.spacing1)) Text( - text = "${pageInfo.totalElements}", + text = "$totalCount", color = ReedTheme.colors.contentBrand, style = ReedTheme.typography.headline2SemiBold, )