mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2025-02-02 03:06:29 +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
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: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,
|
||||
|
|
Loading…
Reference in a new issue