select wallet for token view

This commit is contained in:
julian 2023-03-27 14:29:55 -06:00
parent 1e6b9e5830
commit 41d9c8ca0c
2 changed files with 221 additions and 0 deletions

View file

@ -0,0 +1,205 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/db/hive/db.dart';
import 'package:stackwallet/models/add_wallet_list_entity/sub_classes/coin_entity.dart';
import 'package:stackwallet/models/add_wallet_list_entity/sub_classes/eth_token_entity.dart';
import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart';
import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart';
import 'package:stackwallet/providers/global/wallets_service_provider.dart';
import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/primary_button.dart';
import 'package:stackwallet/widgets/rounded_container.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart';
import 'package:stackwallet/widgets/wallet_info_row/wallet_info_row.dart';
class SelectWalletForTokenView extends ConsumerStatefulWidget {
const SelectWalletForTokenView({
Key? key,
required this.entity,
}) : super(key: key);
static const String routeName = "/selectWalletForTokenView";
final EthTokenEntity entity;
@override
ConsumerState<SelectWalletForTokenView> createState() =>
_SelectWalletForTokenViewState();
}
class _SelectWalletForTokenViewState
extends ConsumerState<SelectWalletForTokenView> {
final isDesktop = Util.isDesktop;
late final List<String> ethWalletIds;
String? _selectedWalletId;
void _onContinue() {
//
}
void _onAddNewEthWallet() {
ref.read(createSpecialEthWalletRoutingFlag.notifier).state = true;
Navigator.of(context).pushNamed(
CreateOrRestoreWalletView.routeName,
arguments: CoinEntity(widget.entity.coin),
);
}
@override
void initState() {
final walletsData =
ref.read(walletsServiceChangeNotifierProvider).fetchWalletsData();
walletsData.removeWhere((key, value) => value.coin != widget.entity.coin);
ethWalletIds = [];
// TODO: proper wallet data class instead of this Hive silliness
for (final walletId in walletsData.values.map((e) => e.walletId).toList()) {
final walletContracts = DB.instance.get<dynamic>(
boxName: walletId,
key: DBKeys.ethTokenContracts,
) as List<String>? ??
[];
if (!walletContracts.contains(widget.entity.token.address)) {
ethWalletIds.add(walletId);
}
}
super.initState();
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
ref.read(createSpecialEthWalletRoutingFlag.notifier).state = false;
return true;
},
child: ConditionalParent(
condition: !isDesktop,
builder: (child) => Background(
child: Scaffold(
backgroundColor:
Theme.of(context).extension<StackColors>()!.background,
appBar: AppBar(
leading: AppBarBackButton(
onPressed: () {
Navigator.of(context).pop();
},
),
),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(16),
child: child,
),
// child: LayoutBuilder(
// builder: (ctx, constraints) {
// return SingleChildScrollView(
// child: ConstrainedBox(
// constraints:
// BoxConstraints(minHeight: constraints.maxHeight),
// child: IntrinsicHeight(
// child: child,
// ),
// ),
// );
// },
// ),
),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
"Select Ethereum wallet",
textAlign: TextAlign.center,
style: STextStyles.pageTitleH1(context),
),
const SizedBox(
height: 8,
),
Text(
"You are adding an ETH token.",
textAlign: TextAlign.center,
style: STextStyles.subtitle(context),
),
const SizedBox(
height: 8,
),
Text(
"You must choose an Ethereum wallet in order to use ${widget.entity.name}",
textAlign: TextAlign.center,
style: STextStyles.subtitle(context),
),
const SizedBox(
height: 16,
),
ethWalletIds.isEmpty
? RoundedWhiteContainer(
child: Text(
"You do not have any Ethereum wallets",
style: STextStyles.label(context),
),
)
: Expanded(
child: Column(
children: [
RoundedWhiteContainer(
padding: const EdgeInsets.all(8),
child: ListView.separated(
itemCount: ethWalletIds.length,
shrinkWrap: true,
separatorBuilder: (_, __) => const SizedBox(
height: 6,
),
itemBuilder: (_, index) {
return RoundedContainer(
padding: const EdgeInsets.all(8),
onPressed: () {
setState(() {
_selectedWalletId = ethWalletIds[index];
});
},
color: _selectedWalletId == ethWalletIds[index]
? Theme.of(context)
.extension<StackColors>()!
.highlight
: Colors.transparent,
child: WalletInfoRow(
walletId: ethWalletIds[index],
),
);
},
),
),
],
),
),
if (ethWalletIds.isEmpty)
const SizedBox(
height: 16,
),
ethWalletIds.isEmpty
? PrimaryButton(
label: "Add new Ethereum wallet",
onPressed: _onAddNewEthWallet,
)
: PrimaryButton(
label: "Continue",
enabled: _selectedWalletId != null,
onPressed: _onContinue,
),
],
),
),
);
}
}

View file

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:stackwallet/models/add_wallet_list_entity/add_wallet_list_entity.dart';
import 'package:stackwallet/models/add_wallet_list_entity/sub_classes/eth_token_entity.dart';
import 'package:stackwallet/models/buy/response_objects/quote.dart';
import 'package:stackwallet/models/contact_address_entry.dart';
import 'package:stackwallet/models/exchange/incomplete_exchange.dart';
@ -20,6 +21,7 @@ import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_vi
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart';
import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart';
import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart';
import 'package:stackwallet/pages/add_wallet_views/select_wallet_for_token_view.dart';
import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart';
import 'package:stackwallet/pages/address_book_views/address_book_view.dart';
import 'package:stackwallet/pages/address_book_views/subviews/add_address_book_entry_view.dart';
@ -225,6 +227,20 @@ class RouteGenerator {
}
return _routeError("${settings.name} invalid args: ${args.toString()}");
case SelectWalletForTokenView.routeName:
if (args is EthTokenEntity) {
return getRoute(
shouldUseMaterialRoute: useMaterialPageRoute,
builder: (_) => SelectWalletForTokenView(
entity: args,
),
settings: RouteSettings(
name: settings.name,
),
);
}
return _routeError("${settings.name} invalid args: ${args.toString()}");
case AddCustomTokenView.routeName:
return getRoute(
shouldUseMaterialRoute: useMaterialPageRoute,