Fixed: Progress is not being tracked. (v1.0.1)

This commit is contained in:
acclorite 2024-06-13 13:02:34 +03:00
parent 0a06ccdc67
commit 49567dcade
2 changed files with 62 additions and 46 deletions

View file

@ -16,6 +16,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.text.selection.DisableSelection
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme
@ -29,6 +30,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
@ -87,6 +89,12 @@ fun ReaderScreenRoot() {
val state = viewModel.state.collectAsState()
val mainState = mainViewModel.state.collectAsState()
val lazyListState = rememberSaveable(
state.value.listState,
saver = LazyListState.Saver
) {
state.value.listState
}
val canScroll by remember {
derivedStateOf {
state.value.listState.canScrollBackward && state.value.listState.canScrollForward
@ -109,16 +117,18 @@ fun ReaderScreenRoot() {
).show()
}
)
viewModel.onUpdateProgress(
onLibraryEvent = libraryViewModel::onEvent,
onHistoryEvent = historyViewModel::onEvent
)
}
LaunchedEffect(canScroll) {
if (!canScroll && !state.value.showMenu && !state.value.loading) {
viewModel.onEvent(ReaderEvent.OnShowHideMenu(context = context))
}
}
LaunchedEffect(lazyListState) {
viewModel.onUpdateProgress(
onLibraryEvent = libraryViewModel::onEvent,
onHistoryEvent = historyViewModel::onEvent
)
}
DisposableEffect(Unit) {
onDispose {
@ -130,6 +140,7 @@ fun ReaderScreenRoot() {
state = state,
mainState = mainState,
navigator = navigator,
lazyListState = lazyListState,
onEvent = viewModel::onEvent,
onMainEvent = mainViewModel::onEvent,
onLibraryEvent = libraryViewModel::onEvent,
@ -143,6 +154,7 @@ private fun ReaderScreen(
state: State<ReaderState>,
mainState: State<MainState>,
navigator: Navigator,
lazyListState: LazyListState,
onEvent: (ReaderEvent) -> Unit,
onMainEvent: (MainEvent) -> Unit,
onLibraryEvent: (LibraryEvent) -> Unit,
@ -330,7 +342,7 @@ private fun ReaderScreen(
}
) { toolbarHidden ->
LazyColumn(
state = state.value.listState,
state = lazyListState,
modifier = Modifier
.fillMaxSize()
.background(backgroundColor)

View file

@ -22,6 +22,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.yield
@ -1269,15 +1270,17 @@ class ReaderViewModel @Inject constructor(
}
@OptIn(FlowPreview::class)
suspend fun onUpdateProgress(
fun onUpdateProgress(
onLibraryEvent: (LibraryEvent) -> Unit,
onHistoryEvent: (HistoryEvent) -> Unit
) {
viewModelScope.launch {
snapshotFlow {
_state.value.listState.firstVisibleItemIndex to _state.value.listState.firstVisibleItemScrollOffset
}
.distinctUntilChanged()
.debounce(300)
.collectLatest { items ->
.collectLatest { (firstVisibleItemIndex, firstVisibleItemScrollOffset) ->
val listState = _state.value.listState
if (
!_state.value.loading &&
@ -1291,11 +1294,11 @@ class ReaderViewModel @Inject constructor(
.index
val totalItemsCount = listState.layoutInfo.totalItemsCount - 1
val progress = if (items.first > 0) {
val progress = if (firstVisibleItemIndex > 0) {
if (lastVisibleItemIndex >= totalItemsCount) {
1f
} else {
items.first / (_state.value.text.size - 1).toFloat()
firstVisibleItemIndex / (_state.value.text.size - 1).toFloat()
}
} else {
0f
@ -1304,8 +1307,8 @@ class ReaderViewModel @Inject constructor(
onEvent(
ReaderEvent.OnChangeProgress(
progress = progress,
firstVisibleItemIndex = items.first,
firstVisibleItemOffset = items.second,
firstVisibleItemIndex = firstVisibleItemIndex,
firstVisibleItemOffset = firstVisibleItemScrollOffset,
refreshList = { book ->
onLibraryEvent(LibraryEvent.OnUpdateBook(book))
onHistoryEvent(HistoryEvent.OnUpdateBook(book))
@ -1315,6 +1318,7 @@ class ReaderViewModel @Inject constructor(
}
}
}
}
private fun calculateProgress(): Float {
val listState = _state.value.listState