From d8eb71e0041dfd6e654a461d9056977b62db3822 Mon Sep 17 00:00:00 2001 From: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:19:54 +0700 Subject: [PATCH] chore(UI): Use remember getUiModel (#1605) * use remember getUiModel * update headerIndexes to use remember for state management * Refactor LibraryUpdateErrorScreen to improve state management * Move header index calculation from the screen model to the presentation layer. * Optimize UI model and header index memoization using `remember(state)`. * Remove redundant `LaunchedEffect` and simplify scroll-to-index logic. * Refactor LibraryUpdateErrorScreen to enhance state management with derivedStateOf --- .../LibraryUpdateErrorScreen.kt | 28 ++++++++++--------- .../presentation/updates/UpdatesScreen.kt | 5 +++- .../LibraryUpdateErrorScreenModel.kt | 5 ---- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/libraryUpdateError/LibraryUpdateErrorScreen.kt b/app/src/main/java/eu/kanade/presentation/libraryUpdateError/LibraryUpdateErrorScreen.kt index 9c8e3e0c3..db940cafd 100644 --- a/app/src/main/java/eu/kanade/presentation/libraryUpdateError/LibraryUpdateErrorScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/libraryUpdateError/LibraryUpdateErrorScreen.kt @@ -25,7 +25,6 @@ import androidx.compose.material3.Surface import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf @@ -39,6 +38,7 @@ import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions +import eu.kanade.presentation.libraryUpdateError.components.LibraryUpdateErrorUiModel import eu.kanade.presentation.libraryUpdateError.components.libraryUpdateErrorUiItems import eu.kanade.presentation.manga.components.Button import eu.kanade.tachiyomi.ui.libraryUpdateError.LibraryUpdateErrorItem @@ -75,31 +75,33 @@ fun LibraryUpdateErrorScreen( val scope = rememberCoroutineScope() val listState = rememberLazyListState() - val headerIndexes = remember { mutableStateOf>(emptyList()) } - LaunchedEffect(state) { - headerIndexes.value = state.getHeaderIndexes() + val uiModels = remember(state) { state.getUiModel() } + val headerIndexes = remember(state) { + uiModels.withIndex() + .filter { it.value is LibraryUpdateErrorUiModel.Header } + .map { it.index } } - val enableScrollToTop by remember { + val enableScrollToTop by remember(listState) { derivedStateOf { listState.firstVisibleItemIndex > 0 } } - val enableScrollToBottom by remember { + val enableScrollToBottom by remember(listState) { derivedStateOf { listState.canScrollForward } } - val enableScrollToPrevious by remember { + val enableScrollToPrevious by remember(headerIndexes, listState) { derivedStateOf { - headerIndexes.value.any { it < listState.firstVisibleItemIndex } + headerIndexes.any { it < listState.firstVisibleItemIndex } } } - val enableScrollToNext by remember { + val enableScrollToNext by remember(headerIndexes, listState) { derivedStateOf { - headerIndexes.value.any { it > listState.firstVisibleItemIndex } + headerIndexes.any { it > listState.firstVisibleItemIndex } } } @@ -141,7 +143,7 @@ fun LibraryUpdateErrorScreen( scrollToPrevious = { scope.launch { listState.scrollToItem( - state.getHeaderIndexes() + headerIndexes .filter { it < listState.firstVisibleItemIndex } .maxOrNull() ?: 0, ) @@ -150,7 +152,7 @@ fun LibraryUpdateErrorScreen( scrollToNext = { scope.launch { listState.scrollToItem( - state.getHeaderIndexes() + headerIndexes .filter { it > listState.firstVisibleItemIndex } .minOrNull() ?: 0, ) @@ -173,7 +175,7 @@ fun LibraryUpdateErrorScreen( state = listState, ) { libraryUpdateErrorUiItems( - uiModels = state.getUiModel(), + uiModels = uiModels, selectionMode = state.selectionMode, onErrorSelected = onErrorSelected, onClick = onClick, diff --git a/app/src/main/java/eu/kanade/presentation/updates/UpdatesScreen.kt b/app/src/main/java/eu/kanade/presentation/updates/UpdatesScreen.kt index 94c30a50a..b6ec128db 100644 --- a/app/src/main/java/eu/kanade/presentation/updates/UpdatesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/updates/UpdatesScreen.kt @@ -112,6 +112,9 @@ fun UpdateScreen( else -> { val scope = rememberCoroutineScope() var isRefreshing by remember { mutableStateOf(false) } + // KMK --> + val uiModels = remember(state.items) { state.getUiModel() } + // KMK <-- PullRefresh( refreshing = isRefreshing, @@ -134,8 +137,8 @@ fun UpdateScreen( updatesLastUpdatedItem(lastUpdated) updatesUiItems( - uiModels = state.getUiModel(), // KMK --> + uiModels = uiModels, expandedState = state.expandedState, collapseToggle = collapseToggle, usePanoramaCover = usePanoramaCover, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/libraryUpdateError/LibraryUpdateErrorScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/libraryUpdateError/LibraryUpdateErrorScreenModel.kt index 44ef6bae0..aecec1655 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/libraryUpdateError/LibraryUpdateErrorScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/libraryUpdateError/LibraryUpdateErrorScreenModel.kt @@ -189,11 +189,6 @@ data class LibraryUpdateErrorScreenState( } return uiModels } - - fun getHeaderIndexes(): List = getUiModel() - .withIndex() - .filter { it.value is LibraryUpdateErrorUiModel.Header } - .map { it.index } } @Immutable