fix: scrollToItem does not work correctly

This commit is contained in:
Acclorite 2025-10-13 14:35:21 +03:00
parent 5a943185d8
commit b0a21c116f
No known key found for this signature in database
GPG key ID: 6E54C611F6EE8593
7 changed files with 23 additions and 68 deletions

View file

@ -16,11 +16,6 @@ sealed class ReaderEffect {
data object OnResetBrightness : ReaderEffect()
data class OnScroll(
val scrollIndex: Int,
val scrollOffset: Int
) : ReaderEffect()
data class OnOpenTranslator(
val textToTranslate: String,
val translateWholeParagraph: Boolean

View file

@ -111,12 +111,10 @@ class ReaderModel @Inject constructor(
is ReaderEvent.OnRestoreScroll -> {
snapshotFlow { _state.value.listState.layoutInfo.totalItemsCount }.first { it > 0 }
_effects.emit(
ReaderEffect.OnScroll(
scrollIndex = _state.value.book.scrollIndex,
_state.value.listState.requestScrollToItem(
index = _state.value.book.scrollIndex,
scrollOffset = _state.value.book.scrollOffset
)
)
_state.update {
val (currentChapter, currentChapterProgress) = getChapterProgressUseCase(
@ -205,12 +203,10 @@ class ReaderModel @Inject constructor(
.takeIf { it != -1 }
if (chapterIndex == null) return@withContext
_effects.emit(
ReaderEffect.OnScroll(
scrollIndex = chapterIndex,
_state.value.listState.requestScrollToItem(
index = chapterIndex,
scrollOffset = 0
)
)
onEvent(ReaderEvent.OnUpdateChapter(chapterIndex))
onEvent(
@ -230,12 +226,10 @@ class ReaderModel @Inject constructor(
val scrollTo = (_state.value.text.lastIndex * event.progress).roundToInt()
_effects.emit(
ReaderEffect.OnScroll(
scrollIndex = scrollTo,
_state.value.listState.requestScrollToItem(
index = scrollTo,
scrollOffset = 0
)
)
onEvent(ReaderEvent.OnUpdateChapter(scrollTo))
}
@ -252,12 +246,10 @@ class ReaderModel @Inject constructor(
)
}
_effects.emit(
ReaderEffect.OnScroll(
scrollIndex = event.checkpoint.index,
_state.value.listState.requestScrollToItem(
index = event.checkpoint.index,
scrollOffset = event.checkpoint.offset
)
)
onEvent(ReaderEvent.OnUpdateChapter(event.checkpoint.index))
onEvent(

View file

@ -380,7 +380,6 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable {
ReaderEffects(
effects = screenModel.effects,
book = state.value.book,
listState = listState,
fullscreen = settings.fullscreen.value
)

View file

@ -6,18 +6,11 @@
package ua.acclorite.book_story.presentation.settings
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Immutable
import ua.acclorite.book_story.domain.model.reader.ColorPreset
@Immutable
sealed class SettingsEffect {
data class OnScroll(
val listState: LazyListState,
val index: Int,
val offset: Int
) : SettingsEffect()
data class OnSwitchedColorPreset(
val newColorPreset: ColorPreset
) : SettingsEffect()

View file

@ -80,12 +80,9 @@ class SettingsModel @Inject constructor(
val scrollIndex = colorPresets.indexOfFirst { it.isSelected }
if (scrollIndex != -1) {
_effects.emit(
SettingsEffect.OnScroll(
listState = _state.value.colorPresetListState,
_state.value.colorPresetListState.requestScrollToItem(
index = scrollIndex,
offset = 0
)
scrollOffset = 0
)
}
@ -258,12 +255,9 @@ class SettingsModel @Inject constructor(
)
}
_effects.emit(
SettingsEffect.OnScroll(
listState = _state.value.colorPresetListState,
_state.value.colorPresetListState.requestScrollToItem(
index = nextPosition,
offset = 0
)
scrollOffset = 0
)
}
}
@ -348,12 +342,9 @@ class SettingsModel @Inject constructor(
)
}
_effects.emit(
SettingsEffect.OnScroll(
listState = _state.value.colorPresetListState,
_state.value.colorPresetListState.requestScrollToItem(
index = colorPresets.lastIndex,
offset = 0
)
scrollOffset = 0
)
}
}

View file

@ -8,7 +8,6 @@ package ua.acclorite.book_story.ui.reader
import android.app.SearchManager
import android.content.Intent
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.core.net.toUri
@ -30,13 +29,12 @@ import ua.acclorite.book_story.ui.navigator.LocalNavigator
fun ReaderEffects(
effects: SharedFlow<ReaderEffect>,
book: Book,
listState: LazyListState,
fullscreen: Boolean
) {
val navigator = LocalNavigator.current
val activity = LocalActivity.current
LaunchedEffect(effects, book, listState, fullscreen) {
LaunchedEffect(effects, book, fullscreen) {
effects.collect { effect ->
when (effect) {
is ReaderEffect.OnSystemBarsVisibility -> {
@ -55,13 +53,6 @@ fun ReaderEffects(
activity.setBrightness(brightness = null)
}
is ReaderEffect.OnScroll -> {
listState.requestScrollToItem(
effect.scrollIndex,
effect.scrollOffset
)
}
is ReaderEffect.OnOpenTranslator -> {
val translatorIntent = Intent()
val browserIntent = Intent()

View file

@ -21,20 +21,14 @@ fun SettingsEffects(effects: SharedFlow<SettingsEffect>) {
LaunchedEffect(effects) {
effects.collect { effect ->
when (effect) {
is SettingsEffect.OnScroll -> {
effect.listState.requestScrollToItem(effect.index, effect.offset)
}
is SettingsEffect.OnSwitchedColorPreset -> {
context.getString(
R.string.color_preset_selected_query,
if (effect.newColorPreset.name.isBlank()) {
effect.newColorPreset.name.ifBlank {
context.getString(
R.string.color_preset_query,
effect.newColorPreset.id.toString()
)
} else {
effect.newColorPreset.name
}.trim()
).showToast(context, longToast = false)
}