mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-17 05:41:29 +02:00
* Update Flutter Update packages * Feat: Wallet connect for ethereum * Fix localization issues Fix UI issues Update old packages Update workflow Update how to build guide * feat: Wallet connect * feat: Add wallet connect for ethereum * chore: Add eth dependencies in configure file * Minor: `WalletConnect` settings name, not `Wallet connect` * fix: Merge conflicts * fix: Issues with test cases on various dApps, introduce Arbitrum rinkerby as suported chain * ui: Design fixes for WalletConnect flow * chore: Update repo and comment out send apk to channel in workflow * fix: Core implementation * feat: WalletConnect WIP * feat: WalletConnect WIP * feat: WalletConnect WIP * chore: Unused parameters WIP [skip ci] * fix: Code review fixes * Feat: WalletConnect feat WIP * feat: WalletConnect * feat: WalletConnect * feat: WalletConnect * Feat: WalletConnect * Feat: WalletConnect * feat: Remove queue support for the bottomsheet * feat: WalletConnect feature, bug fixes, folder restructuring, localization * Feat: Add positive feedback prompt on successful transaction * fix: Delete session bug * fix: dependencies registration WIP * feat: Registering dependencies for walletconnect * chore: Move key data to secrets * chore: ensure appropriate null checks * chore: localization * chore: Remove unused code * localization * chore: Remove unused code * chore: Remove unused code * chore: Add walletconnect project id key entry * fix: Revert bash command for linnux support * fix: Issues with translation in some languages and making unneeded external variable private * fix: Add bottomsheet listener to desktop dashboard page * Generalize ethereum not enough gas error check --------- Co-authored-by: OmarHatem <omarh.ismail1@gmail.com> Co-authored-by: Justin Ehrenhofer <justin.ehrenhofer@gmail.com>
167 lines
5.0 KiB
Dart
167 lines
5.0 KiB
Dart
// ignore_for_file: public_member_api_docs, sort_constructors_first
|
|
import 'package:cake_wallet/generated/i18n.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart';
|
|
|
|
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
|
|
|
|
import '../../../../core/wallet_connect/models/auth_request_model.dart';
|
|
import '../../../../core/wallet_connect/models/connection_model.dart';
|
|
import '../../../../core/wallet_connect/models/session_request_model.dart';
|
|
import '../utils/namespace_model_builder.dart';
|
|
import 'connection_widget.dart';
|
|
|
|
class ConnectionRequestWidget extends StatefulWidget {
|
|
const ConnectionRequestWidget({
|
|
required this.wallet,
|
|
this.authRequest,
|
|
this.sessionProposal,
|
|
Key? key,
|
|
}) : super(key: key);
|
|
|
|
final Web3Wallet wallet;
|
|
final AuthRequestModel? authRequest;
|
|
final SessionRequestModel? sessionProposal;
|
|
|
|
@override
|
|
State<ConnectionRequestWidget> createState() => _ConnectionRequestWidgetState();
|
|
}
|
|
|
|
class _ConnectionRequestWidgetState extends State<ConnectionRequestWidget> {
|
|
ConnectionMetadata? metadata;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
// Get the connection metadata
|
|
metadata = widget.authRequest?.request.requester ?? widget.sessionProposal?.request.proposer;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
if (metadata == null) {
|
|
return Text(
|
|
S.current.error,
|
|
style: TextStyle(
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.normal,
|
|
color: Theme.of(context).extension<CakeTextTheme>()!.secondaryTextColor,
|
|
),
|
|
);
|
|
}
|
|
|
|
return _ConnectionMetadataDisplayWidget(
|
|
metadata: metadata,
|
|
authRequest: widget.authRequest,
|
|
sessionProposal: widget.sessionProposal,
|
|
wallet: widget.wallet,
|
|
);
|
|
}
|
|
}
|
|
|
|
class _ConnectionMetadataDisplayWidget extends StatelessWidget {
|
|
const _ConnectionMetadataDisplayWidget({
|
|
required this.metadata,
|
|
required this.wallet,
|
|
this.authRequest,
|
|
required this.sessionProposal,
|
|
});
|
|
|
|
final ConnectionMetadata? metadata;
|
|
final Web3Wallet wallet;
|
|
final AuthRequestModel? authRequest;
|
|
final SessionRequestModel? sessionProposal;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color: Color.fromARGB(255, 18, 18, 19),
|
|
borderRadius: BorderRadius.circular(8),
|
|
),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Text(
|
|
metadata!.metadata.name,
|
|
style: TextStyle(
|
|
fontSize: 16,
|
|
fontWeight: FontWeight.normal,
|
|
color: Theme.of(context).extension<CakeTextTheme>()!.secondaryTextColor,
|
|
),
|
|
textAlign: TextAlign.center,
|
|
),
|
|
Text(
|
|
S.current.wouoldLikeToConnect,
|
|
style: TextStyle(
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.normal,
|
|
color: Theme.of(context).extension<CakeTextTheme>()!.secondaryTextColor,
|
|
),
|
|
textAlign: TextAlign.center,
|
|
),
|
|
const SizedBox(height: 8),
|
|
Text(
|
|
metadata!.metadata.url,
|
|
style: TextStyle(
|
|
fontSize: 16.0,
|
|
fontWeight: FontWeight.normal,
|
|
color: Theme.of(context).extension<CakeTextTheme>()!.secondaryTextColor,
|
|
),
|
|
textAlign: TextAlign.center,
|
|
),
|
|
const SizedBox(height: 8),
|
|
Visibility(
|
|
visible: authRequest != null,
|
|
child: _AuthRequestWidget(wallet: wallet, authRequest: authRequest),
|
|
|
|
//If authRequest is null, sessionProposal is not null.
|
|
replacement: _SessionProposalWidget(sessionProposal: sessionProposal!),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _AuthRequestWidget extends StatelessWidget {
|
|
const _AuthRequestWidget({required this.wallet, this.authRequest});
|
|
|
|
final Web3Wallet wallet;
|
|
final AuthRequestModel? authRequest;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final model = ConnectionModel(
|
|
text: wallet.formatAuthMessage(
|
|
iss: 'did:pkh:eip155:1:${authRequest!.iss}',
|
|
cacaoPayload: CacaoRequestPayload.fromPayloadParams(
|
|
authRequest!.request.payloadParams,
|
|
),
|
|
),
|
|
);
|
|
return ConnectionWidget(
|
|
title: S.current.message,
|
|
info: [model],
|
|
);
|
|
}
|
|
}
|
|
|
|
class _SessionProposalWidget extends StatelessWidget {
|
|
const _SessionProposalWidget({required this.sessionProposal});
|
|
|
|
final SessionRequestModel sessionProposal;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// Create the connection models using the required and optional namespaces provided by the proposal data
|
|
// The key is the title and the list of values is the data
|
|
final List<ConnectionWidget> views = ConnectionWidgetBuilder.buildFromRequiredNamespaces(
|
|
sessionProposal.request.requiredNamespaces,
|
|
);
|
|
|
|
return Column(children: views);
|
|
}
|
|
}
|