GetBooksById → GetBookById(single book) + Canceling all ReaderViewModel.onEvent calls on screen quit(fixes bugs with text being translated after quitting) + Fixed: Progress resets to 0% if leave when Reader is loading + Fixed: Book text does not show correctly after loading (v1.0.1)

This commit is contained in:
acclorite 2024-06-09 15:54:50 +03:00
parent 9dfa06973f
commit e033294df0
5 changed files with 862 additions and 831 deletions

View file

@ -0,0 +1,12 @@
package ua.acclorite.book_story.domain.use_case
import ua.acclorite.book_story.domain.model.Book
import ua.acclorite.book_story.domain.repository.BookRepository
import javax.inject.Inject
class GetBookById @Inject constructor(private val repository: BookRepository) {
suspend fun execute(id: Int): Book? {
return repository.getBooksById(listOf(id)).firstOrNull()
}
}

View file

@ -22,12 +22,12 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.State import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -84,8 +84,6 @@ fun ReaderScreenRoot() {
val libraryViewModel: LibraryViewModel = hiltViewModel() val libraryViewModel: LibraryViewModel = hiltViewModel()
val historyViewModel: HistoryViewModel = hiltViewModel() val historyViewModel: HistoryViewModel = hiltViewModel()
val loading = remember { mutableStateOf(true) }
val state = viewModel.state.collectAsState() val state = viewModel.state.collectAsState()
val mainState = mainViewModel.state.collectAsState() val mainState = mainViewModel.state.collectAsState()
@ -119,14 +117,11 @@ fun ReaderScreenRoot() {
it.asString(context), it.asString(context),
Toast.LENGTH_LONG Toast.LENGTH_LONG
).show() ).show()
},
onLoaded = {
loading.value = false
} }
) )
} }
LaunchedEffect(canScroll) { LaunchedEffect(canScroll) {
if (!canScroll && !state.value.showMenu && !loading.value) { if (!canScroll && !state.value.showMenu && !state.value.loading) {
viewModel.onEvent(ReaderEvent.OnShowHideMenu(context = context)) viewModel.onEvent(ReaderEvent.OnShowHideMenu(context = context))
} }
} }
@ -135,16 +130,20 @@ fun ReaderScreenRoot() {
firstVisibleItemIndex = firstVisibleItemIndex.value, firstVisibleItemIndex = firstVisibleItemIndex.value,
firstVisibleItemOffset = firstVisibleItemOffset.value, firstVisibleItemOffset = firstVisibleItemOffset.value,
navigator = navigator, navigator = navigator,
isReaderLoading = loading.value,
onLibraryEvent = libraryViewModel::onEvent, onLibraryEvent = libraryViewModel::onEvent,
onHistoryEvent = historyViewModel::onEvent onHistoryEvent = historyViewModel::onEvent
) )
} }
DisposableEffect(Unit) {
onDispose {
viewModel.clearViewModel()
}
}
ReaderScreen( ReaderScreen(
state = state, state = state,
mainState = mainState, mainState = mainState,
loading = loading,
navigator = navigator, navigator = navigator,
onEvent = viewModel::onEvent, onEvent = viewModel::onEvent,
onMainEvent = mainViewModel::onEvent, onMainEvent = mainViewModel::onEvent,
@ -158,7 +157,6 @@ fun ReaderScreenRoot() {
private fun ReaderScreen( private fun ReaderScreen(
state: State<ReaderState>, state: State<ReaderState>,
mainState: State<MainState>, mainState: State<MainState>,
loading: State<Boolean>,
navigator: Navigator, navigator: Navigator,
onEvent: (ReaderEvent) -> Unit, onEvent: (ReaderEvent) -> Unit,
onMainEvent: (MainEvent) -> Unit, onMainEvent: (MainEvent) -> Unit,
@ -355,7 +353,7 @@ private fun ReaderScreen(
.fillMaxSize() .fillMaxSize()
.background(backgroundColor) .background(backgroundColor)
.then( .then(
if (!loading.value && toolbarHidden) { if (!state.value.loading && toolbarHidden) {
Modifier Modifier
.clickable( .clickable(
interactionSource = null, interactionSource = null,
@ -372,14 +370,12 @@ private fun ReaderScreen(
), ),
verticalArrangement = Arrangement.spacedBy(paragraphHeight) verticalArrangement = Arrangement.spacedBy(paragraphHeight)
) { ) {
if (state.value.text.isNotEmpty()) { item {
item { DisableSelection {
DisableSelection { ReaderStartItem(state = state)
ReaderStartItem(state = state)
}
Spacer(modifier = Modifier.height(18.dp))
} }
Spacer(modifier = Modifier.height(18.dp))
} }
customItems( customItems(
@ -403,25 +399,23 @@ private fun ReaderScreen(
) )
} }
if (state.value.text.isNotEmpty()) { item {
item { Spacer(modifier = Modifier.height(18.dp))
Spacer(modifier = Modifier.height(18.dp))
DisableSelection { DisableSelection {
ReaderEndItem( ReaderEndItem(
state = state, state = state,
onEvent = onEvent, onEvent = onEvent,
onLibraryEvent = onLibraryEvent, onLibraryEvent = onLibraryEvent,
onHistoryUpdateEvent = onHistoryEvent, onHistoryUpdateEvent = onHistoryEvent,
) )
}
} }
} }
} }
} }
} }
if (loading.value || state.value.errorMessage != null) { if (state.value.loading || state.value.errorMessage != null) {
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
@ -429,7 +423,7 @@ private fun ReaderScreen(
verticalArrangement = Arrangement.Center, verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
if (!loading.value) { if (!state.value.loading) {
IsError( IsError(
errorMessage = state.value.errorMessage!!.asString(), errorMessage = state.value.errorMessage!!.asString(),
icon = painterResource(id = R.drawable.error), icon = painterResource(id = R.drawable.error),

View file

@ -13,10 +13,9 @@ import ua.acclorite.book_story.presentation.data.Navigator
@Immutable @Immutable
sealed class ReaderEvent { sealed class ReaderEvent {
data class OnTextIsEmpty(val onLoaded: () -> Unit) : ReaderEvent() data object OnTextIsEmpty : ReaderEvent()
data class OnLoadText( data class OnLoadText(
val refreshList: (Book) -> Unit, val refreshList: (Book) -> Unit,
val onLoaded: () -> Unit,
val onError: (UIText) -> Unit, val onError: (UIText) -> Unit,
val onTextIsEmpty: () -> Unit val onTextIsEmpty: () -> Unit
) : ReaderEvent() ) : ReaderEvent()

View file

@ -22,6 +22,7 @@ data class ReaderState(
val isTranslating: Boolean = false, val isTranslating: Boolean = false,
val errorMessage: UIText? = null, val errorMessage: UIText? = null,
val loading: Boolean = true,
val showMenu: Boolean = false, val showMenu: Boolean = false,
val lockMenu: Boolean = false, val lockMenu: Boolean = false,