| 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 | } |