Skip to content

Commit ec0adab

Browse files
committed
fix: remember selection on rebuild of network selector
1 parent ffe47a1 commit ec0adab

6 files changed

Lines changed: 26 additions & 10 deletions

File tree

lib/app/features/wallets/views/pages/coins_flow/coin_details/coin_details_page.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ class CoinDetailsPage extends HookConsumerWidget {
4040
Widget build(BuildContext context, WidgetRef ref) {
4141
final walletView = ref.watch(currentWalletViewDataProvider).requireValue;
4242
final coinsGroup = walletView.coinGroups.firstWhere((e) => e.symbolGroup == symbolGroup);
43-
final networkSelectorData = ref.watch(
44-
networkSelectorNotifierProvider(symbolGroup: symbolGroup),
45-
);
43+
final networkSelectorData = ref
44+
.watch(
45+
networkSelectorNotifierProvider(symbolGroup: symbolGroup),
46+
)
47+
.valueOrNull;
4648
final history = ref
4749
.watch(
4850
coinTransactionHistoryNotifierProvider(symbolGroup: symbolGroup),

lib/app/features/wallets/views/pages/coins_flow/coin_details/components/balance/balance.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class Balance extends ConsumerWidget {
5858
.read(
5959
networkSelectorNotifierProvider(symbolGroup: coinsGroup.symbolGroup),
6060
)
61+
.valueOrNull
6162
?.selected
6263
.mapOrNull(network: (network) => network.network);
6364
final wallet = ref
@@ -84,6 +85,7 @@ class Balance extends ConsumerWidget {
8485
.read(
8586
networkSelectorNotifierProvider(symbolGroup: coinsGroup.symbolGroup),
8687
)
88+
.valueOrNull
8789
?.selected
8890
.mapOrNull(network: (n) => n.network);
8991

lib/app/features/wallets/views/pages/coins_flow/coin_details/providers/balance_provider.r.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class CoinBalanceNotifier extends _$CoinBalanceNotifier {
2727
CoinBalanceState build({required String symbolGroup}) {
2828
final currentNetwork = ref.watch(
2929
networkSelectorNotifierProvider(symbolGroup: symbolGroup).select(
30-
(state) => state?.selected.whenOrNull(network: (network) => network),
30+
(asyncState) => asyncState.valueOrNull?.selected.whenOrNull(network: (network) => network),
3131
),
3232
);
3333

lib/app/features/wallets/views/pages/coins_flow/coin_details/providers/coin_transaction_history_notifier_provider.r.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class CoinTransactionHistoryNotifier extends _$CoinTransactionHistoryNotifier {
8282

8383
_network = ref.watch(
8484
networkSelectorNotifierProvider(symbolGroup: symbolGroup).select(
85-
(state) => state?.selected.whenOrNull(network: (network) => network),
85+
(asyncState) => asyncState.valueOrNull?.selected.whenOrNull(network: (network) => network),
8686
),
8787
);
8888

lib/app/features/wallets/views/pages/coins_flow/coin_details/providers/network_selector_notifier.r.dart

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ part 'network_selector_notifier.r.g.dart';
99
@riverpod
1010
class NetworkSelectorNotifier extends _$NetworkSelectorNotifier {
1111
@override
12-
NetworkSelectorData? build({required String symbolGroup}) {
12+
Future<NetworkSelectorData?> build({required String symbolGroup}) async {
1313
final networksValue = ref
1414
.watch(
1515
syncedCoinsBySymbolGroupProvider(symbolGroup),
@@ -25,20 +25,32 @@ class NetworkSelectorNotifier extends _$NetworkSelectorNotifier {
2525
...wrappedNetworks,
2626
];
2727

28+
// Get previous selection from state (safe with valueOrNull in async providers)
29+
final previousState = state.valueOrNull;
30+
final previousSelection = previousState?.selected;
31+
32+
// Preserve previous selection if it's still valid, otherwise use first item
33+
final selectedItem = previousSelection != null && items.contains(previousSelection)
34+
? previousSelection
35+
: items.first;
36+
2837
return NetworkSelectorData(
2938
items: items,
30-
selected: items.first,
39+
selected: selectedItem,
3140
);
3241
}
3342

3443
set selected(SelectedNetworkItem item) {
44+
final currentState = state.valueOrNull;
45+
if (currentState == null) return;
46+
3547
final canUpdate = item.map(
36-
network: (item) => state?.items.contains(item) ?? false,
48+
network: (item) => currentState.items.contains(item),
3749
all: (_) => true,
3850
);
3951

4052
if (canUpdate) {
41-
state = state!.copyWith(selected: item);
53+
state = AsyncData(currentState.copyWith(selected: item));
4254
}
4355
}
4456
}

lib/app/features/wallets/views/pages/coins_flow/coin_details/providers/selected_crypto_wallet_notifier.r.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class SelectedCryptoWalletNotifier extends _$SelectedCryptoWalletNotifier {
1616
SelectedCryptoWalletData build({required String symbolGroup}) {
1717
final network = ref.watch(
1818
networkSelectorNotifierProvider(symbolGroup: symbolGroup).select(
19-
(state) => state?.selected.whenOrNull(network: (network) => network),
19+
(asyncState) => asyncState.valueOrNull?.selected.whenOrNull(network: (network) => network),
2020
),
2121
);
2222

0 commit comments

Comments
 (0)