From 290a6b1f85f3520083e2b234685dd2a227d4bbdc Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 27 May 2026 00:05:55 +0000 Subject: [PATCH] fix(nwc): scope Send/Receive/Transactions to the wallet shown in the detail screen The wallet detail screen's Send, Receive and Transactions buttons navigated to parameterless routes. Each destination created a fresh WalletViewModel with no selection, so the action ran against `_defaultWalletId` (the account default) instead of the wallet being viewed. Paying, invoicing, and listing transactions could therefore go to the wrong wallet. Parameterize WalletSend/WalletReceive/WalletTransactions with `walletId`, plumb it through AppNavigation, pass it from WalletDetailScreen, and have each screen call `selectWallet(walletId)` before operating. --- .../amethyst/ui/navigation/AppNavigation.kt | 6 +++--- .../amethyst/ui/navigation/routes/Routes.kt | 15 ++++++++++++--- .../screen/loggedIn/wallet/WalletDetailScreen.kt | 6 +++--- .../screen/loggedIn/wallet/WalletReceiveScreen.kt | 4 +++- .../ui/screen/loggedIn/wallet/WalletSendScreen.kt | 4 +++- .../loggedIn/wallet/WalletTransactionsScreen.kt | 4 +++- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt index df8de1d607..06091a298d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -285,9 +285,9 @@ fun BuildNavigation( composable { ChessLobbyScreen(accountViewModel, nav) } composableFromEnd { WalletScreen(accountViewModel, nav) } - composableFromEnd { WalletSendScreen(accountViewModel, nav) } - composableFromEnd { WalletReceiveScreen(accountViewModel, nav) } - composableFromEnd { WalletTransactionsScreen(accountViewModel, nav) } + composableFromEndArgs { WalletSendScreen(it.walletId, accountViewModel, nav) } + composableFromEndArgs { WalletReceiveScreen(it.walletId, accountViewModel, nav) } + composableFromEndArgs { WalletTransactionsScreen(it.walletId, accountViewModel, nav) } composableFromEnd { OnchainTransactionsScreen(accountViewModel, nav) } composableFromEndArgs { WalletDetailScreen(it.walletId, accountViewModel, nav) } composableFromEnd { AddWalletScreen(accountViewModel, nav) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/routes/Routes.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/routes/Routes.kt index b1dbad770f..f771a61300 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/routes/Routes.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/routes/Routes.kt @@ -146,11 +146,20 @@ sealed class Route { @Serializable object Wallet : Route() - @Serializable object WalletSend : Route() + @Serializable + data class WalletSend( + val walletId: String, + ) : Route() - @Serializable object WalletReceive : Route() + @Serializable + data class WalletReceive( + val walletId: String, + ) : Route() - @Serializable object WalletTransactions : Route() + @Serializable + data class WalletTransactions( + val walletId: String, + ) : Route() @Serializable object OnchainTransactions : Route() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletDetailScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletDetailScreen.kt index 4870b8bed1..307789f4e1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletDetailScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletDetailScreen.kt @@ -149,7 +149,7 @@ fun WalletDetailScreen( horizontalArrangement = Arrangement.spacedBy(16.dp), ) { Button( - onClick = { nav.nav(Route.WalletReceive) }, + onClick = { nav.nav(Route.WalletReceive(walletId)) }, modifier = Modifier .weight(1f) @@ -171,7 +171,7 @@ fun WalletDetailScreen( } Button( - onClick = { nav.nav(Route.WalletSend) }, + onClick = { nav.nav(Route.WalletSend(walletId)) }, modifier = Modifier .weight(1f) @@ -192,7 +192,7 @@ fun WalletDetailScreen( // Transactions button OutlinedButton( - onClick = { nav.nav(Route.WalletTransactions) }, + onClick = { nav.nav(Route.WalletTransactions(walletId)) }, modifier = Modifier .fillMaxWidth() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletReceiveScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletReceiveScreen.kt index fa8fa25252..dec9f3852f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletReceiveScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletReceiveScreen.kt @@ -74,13 +74,15 @@ import java.text.NumberFormat @OptIn(ExperimentalMaterial3Api::class) @Composable fun WalletReceiveScreen( + walletId: String, accountViewModel: AccountViewModel, nav: INav, ) { val walletViewModel: WalletViewModel = viewModel() - LaunchedEffect(accountViewModel) { + LaunchedEffect(accountViewModel, walletId) { walletViewModel.init(accountViewModel) + walletViewModel.selectWallet(walletId) } DisposableEffect(Unit) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletSendScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletSendScreen.kt index 2bd8c3dfa2..bff0932ba1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletSendScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletSendScreen.kt @@ -64,13 +64,15 @@ import com.vitorpamplona.amethyst.ui.stringRes @OptIn(ExperimentalMaterial3Api::class) @Composable fun WalletSendScreen( + walletId: String, accountViewModel: AccountViewModel, nav: INav, ) { val walletViewModel: WalletViewModel = viewModel() - LaunchedEffect(accountViewModel) { + LaunchedEffect(accountViewModel, walletId) { walletViewModel.init(accountViewModel) + walletViewModel.selectWallet(walletId) } DisposableEffect(Unit) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletTransactionsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletTransactionsScreen.kt index 8170ebcf58..d662e3c6d4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletTransactionsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/wallet/WalletTransactionsScreen.kt @@ -73,13 +73,15 @@ import java.util.Locale @OptIn(ExperimentalMaterial3Api::class) @Composable fun WalletTransactionsScreen( + walletId: String, accountViewModel: AccountViewModel, nav: INav, ) { val walletViewModel: WalletViewModel = viewModel() - LaunchedEffect(accountViewModel) { + LaunchedEffect(accountViewModel, walletId) { walletViewModel.init(accountViewModel) + walletViewModel.selectWallet(walletId) walletViewModel.fetchTransactions() }