diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/AddWalletTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/AddWalletTransformer.kt index f33e2908eb..ae0310fa34 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/AddWalletTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/AddWalletTransformer.kt @@ -29,6 +29,10 @@ internal class AddWalletTransformer( override fun transform(prevState: WalletScreenState): WalletScreenState { return prevState.copy( + // Select the newly added wallet synchronously (it is appended to the end), mirroring + // Initialize/Delete transformers. Otherwise selectedWalletIndex stays stale until the + // deferred scroll settles, and getSelectedWalletId() returns the previously selected wallet. + selectedWalletIndex = prevState.wallets2.size, wallets = (prevState.wallets + walletLoadingStateFactory.create(userWallet)).toImmutableList(), wallets2 = (prevState.wallets2 + walletLoadingStateFactory.create2(userWallet)).toImmutableList(), ) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen2.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen2.kt index ebd2c17955..8c4b1cfede 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen2.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen2.kt @@ -80,6 +80,8 @@ import com.tangem.features.virtualaccount.main.component.VirtualAccountMainBlock import com.tangem.features.virtualaccount.main.entity.VirtualAccountMainUM import dev.chrisbanes.haze.HazeProgressive import dev.chrisbanes.haze.HazeTint +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.drop import kotlinx.coroutines.launch import kotlin.math.abs @@ -208,10 +210,17 @@ private fun WalletContent2( bottom = paddingValues.calculateBottomPadding() + marketHintApproxHeight, ) - LaunchedEffect(walletsPagerState.currentPage) { - if (walletsPagerState.currentPage != state.selectedWalletIndex) { - state.onWalletChange(walletsPagerState.currentPage, false) - } + val selectedWalletIndex by rememberUpdatedState(state.selectedWalletIndex) + LaunchedEffect(walletsPagerState) { + // Only react to genuine settles and skip the page the pager was (re)created with, so a + // programmatic scroll or pager recreation can't revert the selection to a stale page. + snapshotFlow { walletsPagerState.settledPage } + .drop(count = 1) + .collectLatest { settledPage -> + if (settledPage != selectedWalletIndex) { + state.onWalletChange(settledPage, false) + } + } } val canPagerScroll by remember { derivedStateOf { behavior.state.heightOffset == 0f } }