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.
This commit is contained in:
Claude
2026-05-27 00:05:55 +00:00
parent 5fce6764b5
commit 290a6b1f85
6 changed files with 27 additions and 12 deletions
@@ -285,9 +285,9 @@ fun BuildNavigation(
composable<Route.Chess> { ChessLobbyScreen(accountViewModel, nav) }
composableFromEnd<Route.Wallet> { WalletScreen(accountViewModel, nav) }
composableFromEnd<Route.WalletSend> { WalletSendScreen(accountViewModel, nav) }
composableFromEnd<Route.WalletReceive> { WalletReceiveScreen(accountViewModel, nav) }
composableFromEnd<Route.WalletTransactions> { WalletTransactionsScreen(accountViewModel, nav) }
composableFromEndArgs<Route.WalletSend> { WalletSendScreen(it.walletId, accountViewModel, nav) }
composableFromEndArgs<Route.WalletReceive> { WalletReceiveScreen(it.walletId, accountViewModel, nav) }
composableFromEndArgs<Route.WalletTransactions> { WalletTransactionsScreen(it.walletId, accountViewModel, nav) }
composableFromEnd<Route.OnchainTransactions> { OnchainTransactionsScreen(accountViewModel, nav) }
composableFromEndArgs<Route.WalletDetail> { WalletDetailScreen(it.walletId, accountViewModel, nav) }
composableFromEnd<Route.WalletAdd> { AddWalletScreen(accountViewModel, nav) }
@@ -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()
@@ -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()
@@ -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) {
@@ -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) {
@@ -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()
}