mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2025-03-09 10:15:22 +00:00
select wallet for token view
This commit is contained in:
parent
1e6b9e5830
commit
41d9c8ca0c
2 changed files with 221 additions and 0 deletions
lib
205
lib/pages/add_wallet_views/select_wallet_for_token_view.dart
Normal file
205
lib/pages/add_wallet_views/select_wallet_for_token_view.dart
Normal 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,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:isar/isar.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/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/buy/response_objects/quote.dart';
|
||||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||||
import 'package:stackwallet/models/exchange/incomplete_exchange.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/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_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/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/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/address_book_view.dart';
|
||||||
import 'package:stackwallet/pages/address_book_views/subviews/add_address_book_entry_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()}");
|
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:
|
case AddCustomTokenView.routeName:
|
||||||
return getRoute(
|
return getRoute(
|
||||||
shouldUseMaterialRoute: useMaterialPageRoute,
|
shouldUseMaterialRoute: useMaterialPageRoute,
|
||||||
|
|
Loading…
Reference in a new issue