diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt index a5122b1dd..b6bedb13e 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt @@ -38,8 +38,8 @@ import androidx.compose.ui.util.lerp import eu.kanade.tachiyomi.util.lang.launchIO import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch +import moe.tarsin.coroutines.onEachLatest import moe.tarsin.coroutines.runSuspendCatching enum class FabLayoutValue { @@ -128,18 +128,9 @@ fun FabLayout( } val builder by rememberUpdatedState(fabBuilder) - fun buildFab(builder: FabBuilder.() -> Unit) = buildList { - builder { icon, action -> - add(icon to action) - } - } - val secondaryFab by remember { - snapshotFlow { builder }.map { one -> - state.waitCollapse() - buildFab(one) - } - }.collectAsState(remember { buildFab(fabBuilder) }) + snapshotFlow { buildFab(builder) }.onEachLatest { state.waitCollapse() } + }.collectAsState(emptyList()) val coroutineScope = rememberCoroutineScope() if (updatedExpanded && autoCancel) { Spacer( @@ -219,4 +210,10 @@ fun FabLayout( } } +private fun buildFab(builder: FabBuilder.() -> Unit) = buildList { + builder { icon, action -> + add(icon to action) + } +} + const val FAB_ANIMATE_TIME = 300 diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt index 952c73b1f..a37fbef48 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt @@ -35,7 +35,6 @@ import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow @@ -221,7 +220,7 @@ fun FavouritesScreen(navigator: DestinationsNavigator) { var expanded by remember { mutableStateOf(false) } var hidden by remember { mutableStateOf(false) } val checkedInfoMap = remember { mutableStateMapOf() } - val selectMode by rememberUpdatedState(checkedInfoMap.isNotEmpty()) + val selectMode = checkedInfoMap.isNotEmpty() LockDrawer(selectMode) SearchBarScreen( @@ -322,8 +321,6 @@ fun FavouritesScreen(navigator: DestinationsNavigator) { }.mapLatest { it } }.collectAsState(hidden) - // Explicitly reallocate fabBuilder lambda to recompose secondary fab - val select = selectMode FabLayout( hidden = hideFab, expanded = expanded || selectMode, @@ -333,7 +330,7 @@ fun FavouritesScreen(navigator: DestinationsNavigator) { }, autoCancel = !selectMode, ) { - if (!select) { + if (!selectMode) { onClick(EhIcons.Default.GoTo) { coroutineScope.launch { val date = dialogState.showDatePicker() diff --git a/app/src/main/kotlin/moe/tarsin/coroutines/Flow.kt b/app/src/main/kotlin/moe/tarsin/coroutines/Flow.kt new file mode 100644 index 000000000..27d0c461f --- /dev/null +++ b/app/src/main/kotlin/moe/tarsin/coroutines/Flow.kt @@ -0,0 +1,11 @@ +package moe.tarsin.coroutines + +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.transformLatest + +inline fun Flow.onEachLatest( + crossinline action: suspend (T) -> Unit, +): Flow = transformLatest { value -> + action(value) + return@transformLatest emit(value) +}