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

View file

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