dev
dart 95 lines 3.54 KB
Raw
1 import 'package:cake_wallet/generated/i18n.dart';
2 import 'package:cake_wallet/new-ui/widgets/confirm_swiper.dart';
3 import 'package:cake_wallet/src/screens/wallet_connect/services/bottom_sheet_service.dart';
4 import 'package:cake_wallet/src/screens/wallet_connect/services/key_service/wallet_connect_key_service.dart';
5 import 'package:cake_wallet/src/screens/wallet_connect/utils/wc_permissions_mapper.dart';
6 import 'package:cake_wallet/src/screens/wallet_connect/widgets/wc_dapp_card.dart';
7 import 'package:cake_wallet/src/screens/wallet_connect/widgets/wc_permissions_card.dart';
8 import 'package:cake_wallet/src/screens/wallet_connect/widgets/wc_scam_banner.dart';
9 import 'package:cake_wallet/src/screens/wallet_connect/widgets/wc_sheet_header.dart';
10 import 'package:cake_wallet/src/screens/wallet_connect/widgets/wc_wallet_card.dart';
11 import 'package:cake_wallet/store/app_store.dart';
12 import 'package:flutter/material.dart';
13 import 'package:reown_walletkit/reown_walletkit.dart';
14
15 class WCConnectionRequestSheet extends StatelessWidget {
16 const WCConnectionRequestSheet({
17 super.key,
18 required this.proposalData,
19 required this.requester,
20 required this.walletKeyService,
21 required this.appStore,
22 this.verifyContext,
23 });
24
25 final ProposalData proposalData;
26 final ConnectionMetadata requester;
27 final WalletConnectKeyService walletKeyService;
28 final AppStore appStore;
29 final VerifyContext? verifyContext;
30
31 String _resolveAddress() {
32 final wallet = appStore.wallet;
33 if (wallet == null) return '';
34 final keys = walletKeyService.getKeysForChain(wallet);
35 if (keys.isEmpty) return '';
36 return keys.first.publicKey;
37 }
38
39 @override
40 Widget build(BuildContext context) {
41 final permissions =
42 WCPermissionsMapper.fromGeneratedNamespaces(proposalData.generatedNamespaces ?? const {});
43
44 final metadata = requester.metadata;
45 final iconUrl = metadata.icons.isNotEmpty ? metadata.icons.first : null;
46 final walletName = appStore.wallet?.name ?? '';
47 final address = _resolveAddress();
48 final isScam = verifyContext?.validation.scam ?? false;
49
50 return Column(
51 mainAxisSize: MainAxisSize.min,
52 children: [
53 WCSheetHeader(title: S.of(context).wc_connect_request_title),
54 const SizedBox(height: 24),
55 Expanded(
56 child: SingleChildScrollView(
57 child: Column(
58 children: [
59 WCDappCard(
60 name: metadata.name,
61 iconUrl: iconUrl,
62 subtitle: metadata.url,
63 action: WCDappCardAction.connect,
64 verifyContext: verifyContext,
65 ),
66 if (isScam) ...[
67 const SizedBox(height: 16),
68 const WCScamBanner(),
69 ],
70 const SizedBox(height: 24),
71 WCWalletCard(walletName: walletName, address: address),
72 const SizedBox(height: 24),
73 WCPermissionsCard(permissions: permissions),
74 ],
75 ),
76 ),
77 ),
78 const SizedBox(height: 24),
79 Padding(
80 padding: const EdgeInsets.symmetric(horizontal: 24),
81 child: ConfirmSwiper(
82 swiperText: S.of(context).wc_swipe_to_approve,
83 accessibleNavigationModeButtonText: S.of(context).wc_action_approve,
84 onConfirmed: () {
85 if (Navigator.canPop(context)) {
86 Navigator.of(context).pop(WCBottomSheetResult.one);
87 }
88 },
89 ),
90 ),
91 const SizedBox(height: 16),
92 ],
93 );
94 }
95 }