From b0a21c116fc8ba7eaa59dc8887e5230cfba1a19d Mon Sep 17 00:00:00 2001 From: Acclorite <2ma0bhpk@anonaddy.com> Date: Mon, 13 Oct 2025 14:35:21 +0300 Subject: [PATCH] fix: scrollToItem does not work correctly --- .../presentation/reader/ReaderEffect.kt | 5 --- .../presentation/reader/ReaderModel.kt | 32 +++++++------------ .../presentation/reader/ReaderScreen.kt | 1 - .../presentation/settings/SettingsEffect.kt | 7 ---- .../presentation/settings/SettingsModel.kt | 27 ++++++---------- .../book_story/ui/reader/ReaderEffects.kt | 11 +------ .../book_story/ui/settings/SettingsEffects.kt | 8 +---- 7 files changed, 23 insertions(+), 68 deletions(-) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderEffect.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderEffect.kt index 9e31e2d5..b4991a3f 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderEffect.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderEffect.kt @@ -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 diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderModel.kt index af35ec47..d9f8f266 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderModel.kt @@ -111,11 +111,9 @@ 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, - scrollOffset = _state.value.book.scrollOffset - ) + _state.value.listState.requestScrollToItem( + index = _state.value.book.scrollIndex, + scrollOffset = _state.value.book.scrollOffset ) _state.update { @@ -205,11 +203,9 @@ class ReaderModel @Inject constructor( .takeIf { it != -1 } if (chapterIndex == null) return@withContext - _effects.emit( - ReaderEffect.OnScroll( - scrollIndex = chapterIndex, - scrollOffset = 0 - ) + _state.value.listState.requestScrollToItem( + index = chapterIndex, + scrollOffset = 0 ) onEvent(ReaderEvent.OnUpdateChapter(chapterIndex)) @@ -230,11 +226,9 @@ class ReaderModel @Inject constructor( val scrollTo = (_state.value.text.lastIndex * event.progress).roundToInt() - _effects.emit( - ReaderEffect.OnScroll( - scrollIndex = scrollTo, - scrollOffset = 0 - ) + _state.value.listState.requestScrollToItem( + index = scrollTo, + scrollOffset = 0 ) onEvent(ReaderEvent.OnUpdateChapter(scrollTo)) @@ -252,11 +246,9 @@ class ReaderModel @Inject constructor( ) } - _effects.emit( - ReaderEffect.OnScroll( - scrollIndex = event.checkpoint.index, - scrollOffset = event.checkpoint.offset - ) + _state.value.listState.requestScrollToItem( + index = event.checkpoint.index, + scrollOffset = event.checkpoint.offset ) onEvent(ReaderEvent.OnUpdateChapter(event.checkpoint.index)) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScreen.kt index 71d5fb77..214f9162 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScreen.kt @@ -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 ) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/SettingsEffect.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/SettingsEffect.kt index 2a5c24a9..c1f34969 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/settings/SettingsEffect.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/SettingsEffect.kt @@ -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() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/settings/SettingsModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/settings/SettingsModel.kt index c0b2ace4..75623aed 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/settings/SettingsModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/settings/SettingsModel.kt @@ -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, - index = scrollIndex, - offset = 0 - ) + _state.value.colorPresetListState.requestScrollToItem( + index = scrollIndex, + scrollOffset = 0 ) } @@ -258,12 +255,9 @@ class SettingsModel @Inject constructor( ) } - _effects.emit( - SettingsEffect.OnScroll( - listState = _state.value.colorPresetListState, - index = nextPosition, - offset = 0 - ) + _state.value.colorPresetListState.requestScrollToItem( + index = nextPosition, + scrollOffset = 0 ) } } @@ -348,12 +342,9 @@ class SettingsModel @Inject constructor( ) } - _effects.emit( - SettingsEffect.OnScroll( - listState = _state.value.colorPresetListState, - index = colorPresets.lastIndex, - offset = 0 - ) + _state.value.colorPresetListState.requestScrollToItem( + index = colorPresets.lastIndex, + scrollOffset = 0 ) } } diff --git a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEffects.kt b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEffects.kt index f986fc97..1e945e83 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEffects.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEffects.kt @@ -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, 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() diff --git a/app/src/main/java/ua/acclorite/book_story/ui/settings/SettingsEffects.kt b/app/src/main/java/ua/acclorite/book_story/ui/settings/SettingsEffects.kt index a6f1ec9f..68e3fba2 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/settings/SettingsEffects.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/settings/SettingsEffects.kt @@ -21,20 +21,14 @@ fun SettingsEffects(effects: SharedFlow) { 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) }