From ea7351b8c5b857ffde14c4921b64590af2ac3bc2 Mon Sep 17 00:00:00 2001 From: maxiggle Date: Mon, 1 Apr 2024 12:58:20 +0100 Subject: [PATCH 1/2] fixes --- example/ios/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- example/lib/providers/wallet_provider.dart | 7 ++ example/lib/screens/create_account.dart | 26 ++++-- example/lib/screens/home_screen.dart | 80 +------------------ example/lib/utils/widgets.dart | 78 ++++++++++++++++-- example/pubspec.lock | 8 ++ example/pubspec.yaml | 1 + 8 files changed, 112 insertions(+), 92 deletions(-) diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 64e1869..bc1d45b 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -216,7 +216,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C8080294A63A400263BE5 = { diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 87131a0..8e3ca5d 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ _wallet; + String? _error; + String? get errorMessage => _error; WalletProvider() : _chain = Chains.getChain(Network.baseTestent) @@ -50,6 +53,8 @@ class WalletProvider extends ChangeNotifier { log("wallet created ${_wallet?.address.hex} "); } catch (e) { log("something happened: $e"); + _error = e.toString(); + notifyListeners(); } } @@ -72,6 +77,8 @@ class WalletProvider extends ChangeNotifier { log("wallet created ${_wallet?.address.hex} "); } catch (e) { log("something happened: $e"); + _error = e.toString(); + notifyListeners(); } } diff --git a/example/lib/screens/create_account.dart b/example/lib/screens/create_account.dart index f4dfe03..8a31084 100644 --- a/example/lib/screens/create_account.dart +++ b/example/lib/screens/create_account.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; +import 'package:variancedemo/main.dart'; import 'package:variancedemo/providers/wallet_provider.dart'; import 'package:variancedemo/utils/widgets.dart'; @@ -14,6 +16,15 @@ class CreateAccountScreen extends StatefulWidget { class _CreateAccountScreenState extends State { final TextEditingController controller = TextEditingController(); final _formKey = GlobalKey(); + FToast? fToast; + + @override + void initState() { + super.initState(); + fToast = FToast(); + fToast?.init(context); + } + @override Widget build(BuildContext context) { return SafeArea( @@ -79,14 +90,17 @@ class _CreateAccountScreenState extends State { SizedBox( height: 45.h, child: TextButton( + key: globalScaffoldMessengerKey, onPressed: () async { - try { - await value.registerWithPassKey(controller.text, - requiresUserVerification: true); - // ignore: use_build_context_synchronously + await value.registerWithPassKey(controller.text, + requiresUserVerification: true); + // ignore: use_build_context_synchronously + if (value.errorMessage != null) { + fToast?.showToast( + gravity: ToastGravity.BOTTOM, + child: Text(value.errorMessage!)); + } else { Navigator.pushNamed(context, '/home'); - } catch (e) { - showSnackbar(e.toString()); } }, style: TextButton.styleFrom( diff --git a/example/lib/screens/home_screen.dart b/example/lib/screens/home_screen.dart index c003f4c..9750938 100644 --- a/example/lib/screens/home_screen.dart +++ b/example/lib/screens/home_screen.dart @@ -8,6 +8,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:variancedemo/providers/wallet_provider.dart'; +import 'package:variancedemo/utils/widgets.dart'; import 'package:variancedemo/variance_colors.dart'; import 'dart:ui' as ui; @@ -188,85 +189,6 @@ class _WalletBalanceState extends State { } } -class CryptoTransaction { - final String name; - final double amount; - final String date; - - CryptoTransaction({ - required this.name, - required this.amount, - required this.date, - }); -} - -class AddressBar extends StatefulWidget { - final String hintText; - final TextEditingController? textEditingController; - final TextStyle? hintTextStyle; - - // Add an optional parameter for the initial value - final String initialValue; - - const AddressBar({ - required this.hintText, - this.hintTextStyle, - this.textEditingController, - this.initialValue = "0.0", // Provide a default initial value - Key? key, - }) : super(key: key); - - @override - State createState() => _AddressBarState(); -} - -class _AddressBarState extends State { - bool pwdVisibility = false; - final formKey = GlobalKey(); - late final TextEditingController textEditingController; - @override - void initState() { - super.initState(); - // Initialize the TextEditingController with the initial value - textEditingController = widget.textEditingController ?? - TextEditingController(text: widget.initialValue); - } - - @override - Widget build(BuildContext context) { - return TextFormField( - cursorColor: VarianceColors.primary, - controller: widget.textEditingController, - textAlign: TextAlign.center, - decoration: InputDecoration( - fillColor: VarianceColors.secondary, - filled: true, - hintText: widget.hintText, - hintStyle: widget.hintTextStyle, - enabledBorder: OutlineInputBorder( - borderSide: const BorderSide( - color: Colors.white, - width: 1, - ), - borderRadius: BorderRadius.circular(10), - ), - focusedBorder: OutlineInputBorder( - borderSide: const BorderSide( - color: Colors.white, - width: 1, - ), - borderRadius: BorderRadius.circular(10)), - ), - validator: (val) { - if (val!.isEmpty) { - return 'Required'; - } - return null; - }, - ); - } -} - String message = address; final FutureBuilder qrFutureBuilder = FutureBuilder( future: _loadOverlayImage(), diff --git a/example/lib/utils/widgets.dart b/example/lib/utils/widgets.dart index 71449f3..2431ee7 100644 --- a/example/lib/utils/widgets.dart +++ b/example/lib/utils/widgets.dart @@ -1,8 +1,76 @@ - import 'package:flutter/material.dart'; +import 'package:flutter/material.dart'; import 'package:variancedemo/main.dart'; +import 'package:variancedemo/variance_colors.dart'; void showSnackbar(String message) { - var currentScaffoldMessenger = globalScaffoldMessengerKey.currentState; - currentScaffoldMessenger?.hideCurrentSnackBar(); - currentScaffoldMessenger?.showSnackBar(SnackBar(content: Text(message))); - } \ No newline at end of file + var currentScaffoldMessenger = globalScaffoldMessengerKey.currentState; + currentScaffoldMessenger?.hideCurrentSnackBar(); + currentScaffoldMessenger?.showSnackBar(SnackBar(content: Text(message))); +} + +class AddressBar extends StatefulWidget { + final String hintText; + final TextEditingController? textEditingController; + final TextStyle? hintTextStyle; + + // Add an optional parameter for the initial value + final String initialValue; + + const AddressBar({ + required this.hintText, + this.hintTextStyle, + this.textEditingController, + this.initialValue = "0.0", // Provide a default initial value + Key? key, + }) : super(key: key); + + @override + State createState() => _AddressBarState(); +} + +class _AddressBarState extends State { + bool pwdVisibility = false; + final formKey = GlobalKey(); + late final TextEditingController textEditingController; + @override + void initState() { + super.initState(); + // Initialize the TextEditingController with the initial value + textEditingController = widget.textEditingController ?? + TextEditingController(text: widget.initialValue); + } + + @override + Widget build(BuildContext context) { + return TextFormField( + cursorColor: VarianceColors.primary, + controller: widget.textEditingController, + textAlign: TextAlign.center, + decoration: InputDecoration( + fillColor: VarianceColors.secondary, + filled: true, + hintText: widget.hintText, + hintStyle: widget.hintTextStyle, + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Colors.white, + width: 1, + ), + borderRadius: BorderRadius.circular(10), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Colors.white, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + ), + validator: (val) { + if (val!.isEmpty) { + return 'Required'; + } + return null; + }, + ); + } +} diff --git a/example/pubspec.lock b/example/pubspec.lock index a9d01ab..7edad6e 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -232,6 +232,14 @@ packages: description: flutter source: sdk version: "0.0.0" + fluttertoast: + dependency: "direct main" + description: + name: fluttertoast + sha256: dfdde255317af381bfc1c486ed968d5a43a2ded9c931e87cbecd88767d6a71c1 + url: "https://pub.dev" + source: hosted + version: "8.2.4" google_fonts: dependency: "direct main" description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index b6111f9..b660c99 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -21,6 +21,7 @@ dependencies: shared_preferences: ^2.2.2 path_provider: ^2.1.1 web3_signers: ^0.0.6-r2 + fluttertoast: ^8.2.4 variance_dart: path: ../ From c08d89f45a58727ffc9eb6c71db07e92fd4d6357 Mon Sep 17 00:00:00 2001 From: maxiggle Date: Tue, 2 Apr 2024 04:13:03 +0100 Subject: [PATCH 2/2] ui: added mintnft button, fixed typography, recfator code --- example/ios/Podfile.lock | 13 ++ example/lib/main.dart | 2 +- example/lib/providers/wallet_provider.dart | 16 +-- example/lib/screens/create_account.dart | 5 +- example/lib/screens/home/home_screen.dart | 123 ++++++++++++++++++ .../home_widgets.dart} | 106 +-------------- lib/src/4337/chains.dart | 4 +- 7 files changed, 153 insertions(+), 116 deletions(-) create mode 100644 example/lib/screens/home/home_screen.dart rename example/lib/screens/{home_screen.dart => home/home_widgets.dart} (64%) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index ced12a7..1388937 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2,6 +2,9 @@ PODS: - Flutter (1.0.0) - flutter_native_splash (0.0.1): - Flutter + - fluttertoast (0.0.2): + - Flutter + - Toast - passkeys_ios (0.0.1): - Flutter - path_provider_foundation (0.0.1): @@ -10,6 +13,7 @@ PODS: - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS + - Toast (4.1.0) - ua_client_hints (1.2.2): - Flutter - web3_signers (0.0.1): @@ -18,17 +22,24 @@ PODS: DEPENDENCIES: - Flutter (from `Flutter`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) + - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - passkeys_ios (from `.symlinks/plugins/passkeys_ios/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - ua_client_hints (from `.symlinks/plugins/ua_client_hints/ios`) - web3_signers (from `.symlinks/plugins/web3_signers/ios`) +SPEC REPOS: + trunk: + - Toast + EXTERNAL SOURCES: Flutter: :path: Flutter flutter_native_splash: :path: ".symlinks/plugins/flutter_native_splash/ios" + fluttertoast: + :path: ".symlinks/plugins/fluttertoast/ios" passkeys_ios: :path: ".symlinks/plugins/passkeys_ios/ios" path_provider_foundation: @@ -43,9 +54,11 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef + fluttertoast: 31b00dabfa7fb7bacd9e7dbee580d7a2ff4bf265 passkeys_ios: fdae8c06e2178a9fcb9261a6cb21fb9a06a81d53 path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 + Toast: ec33c32b8688982cecc6348adeae667c1b9938da ua_client_hints: 7f4e0f5d390685e8f7efd6eb363594f760108926 web3_signers: 5f49d582ab0d1fe673b3220aa6ecf25bb3cbed6b diff --git a/example/lib/main.dart b/example/lib/main.dart index 0e094ee..e203d25 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -4,7 +4,7 @@ import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; import 'package:variancedemo/providers/wallet_provider.dart'; import 'package:variancedemo/screens/create_account.dart'; -import 'package:variancedemo/screens/home_screen.dart'; +import 'package:variancedemo/screens/home/home_screen.dart'; final globalScaffoldMessengerKey = GlobalKey(); diff --git a/example/lib/providers/wallet_provider.dart b/example/lib/providers/wallet_provider.dart index 9dfc1cf..d6d56a5 100644 --- a/example/lib/providers/wallet_provider.dart +++ b/example/lib/providers/wallet_provider.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:developer'; import 'dart:io'; import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; import 'package:web3_signers/web3_signers.dart'; import 'package:variance_dart/variance.dart'; import 'package:web3dart/credentials.dart'; @@ -14,11 +13,12 @@ class WalletProvider extends ChangeNotifier { SmartWallet? _wallet; SmartWallet? get wallet => _wallet; - String? _error; - String? get errorMessage => _error; + + String _errorMessage = ""; + String get errorMessage => _errorMessage; WalletProvider() - : _chain = Chains.getChain(Network.baseTestent) + : _chain = Chains.getChain(Network.baseTestnet) ..accountFactory = EthereumAddress.fromHex( "0x402A266e92993EbF04a5B3fd6F0e2b21bFC83070") ..bundlerUrl = @@ -52,9 +52,9 @@ class WalletProvider extends ChangeNotifier { log("wallet created ${_wallet?.address.hex} "); } catch (e) { - log("something happened: $e"); - _error = e.toString(); + _errorMessage = e.toString(); notifyListeners(); + log("something happened: $e"); } } @@ -77,11 +77,11 @@ class WalletProvider extends ChangeNotifier { log("wallet created ${_wallet?.address.hex} "); } catch (e) { log("something happened: $e"); - _error = e.toString(); - notifyListeners(); } } + Future mintNFt() async {} + Future sendTransaction(String recipient, String amount) async { if (_wallet != null) { final etherAmount = diff --git a/example/lib/screens/create_account.dart b/example/lib/screens/create_account.dart index 8a31084..1edc173 100644 --- a/example/lib/screens/create_account.dart +++ b/example/lib/screens/create_account.dart @@ -4,7 +4,6 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:variancedemo/main.dart'; import 'package:variancedemo/providers/wallet_provider.dart'; -import 'package:variancedemo/utils/widgets.dart'; class CreateAccountScreen extends StatefulWidget { const CreateAccountScreen({super.key}); @@ -95,10 +94,10 @@ class _CreateAccountScreenState extends State { await value.registerWithPassKey(controller.text, requiresUserVerification: true); // ignore: use_build_context_synchronously - if (value.errorMessage != null) { + if (value.errorMessage.isNotEmpty) { fToast?.showToast( gravity: ToastGravity.BOTTOM, - child: Text(value.errorMessage!)); + child: Text(value.errorMessage)); } else { Navigator.pushNamed(context, '/home'); } diff --git a/example/lib/screens/home/home_screen.dart b/example/lib/screens/home/home_screen.dart new file mode 100644 index 0000000..7f34217 --- /dev/null +++ b/example/lib/screens/home/home_screen.dart @@ -0,0 +1,123 @@ +import 'dart:developer'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:provider/provider.dart'; +import 'package:variancedemo/providers/wallet_provider.dart'; +import 'package:variancedemo/screens/home/home_widgets.dart'; +import 'package:variancedemo/utils/widgets.dart'; +import 'package:variancedemo/variance_colors.dart'; + +class WalletHome extends StatefulWidget { + const WalletHome({super.key}); + + @override + State createState() => _WalletHomeState(); +} + +class _WalletHomeState extends State { + final _formKey = GlobalKey(); + TextEditingController amountController = TextEditingController(); + TextEditingController addressController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: VarianceColors.primary, + body: SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 19.h, horizontal: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const WalletBalance(), + 50.verticalSpace, + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton.icon( + onPressed: () { + showModalBottomSheetContent(context); + }, + style: TextButton.styleFrom( + backgroundColor: const Color(0xffE1FF01)), + icon: const Icon(Icons.qr_code_2_sharp), + label: const Text(' Receive')), + 50.horizontalSpace, + TextButton.icon( + onPressed: () {}, + style: TextButton.styleFrom( + backgroundColor: const Color(0xffE1FF01)), + icon: const Icon( + Icons.all_inclusive_outlined, + ), + label: const Text('Mint NFT')), + ], + ), + 60.verticalSpace, + AddressBar( + hintText: 'Eth Address', + textEditingController: addressController, + ), + 18.verticalSpace, + TextFormField( + style: TextStyle( + fontSize: 51.sp, + fontWeight: FontWeight.w600, + color: VarianceColors.secondary), + key: _formKey, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter a value'; + } else if (int.parse(value) > 100) { + return 'Value should be less than or equal to 100'; + } + return null; + }, + onChanged: (value) { + if (value.isEmpty) { + return; + } + }, + textAlign: TextAlign.center, + controller: amountController, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + focusColor: Colors.white, + fillColor: Colors.white, + border: InputBorder.none, + hintText: '0.0', + hintStyle: TextStyle( + fontSize: 51, color: VarianceColors.secondary), + ), + cursorColor: VarianceColors.secondary, + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp(r'^\.?\d*(?().sendTransaction( + addressController.text, amountController.text); + }, + child: const Text('Send')), + ), + ], + ), + ), + ), + ); + } +} diff --git a/example/lib/screens/home_screen.dart b/example/lib/screens/home/home_widgets.dart similarity index 64% rename from example/lib/screens/home_screen.dart rename to example/lib/screens/home/home_widgets.dart index 9750938..abf928b 100644 --- a/example/lib/screens/home_screen.dart +++ b/example/lib/screens/home/home_widgets.dart @@ -1,116 +1,16 @@ import 'dart:async'; -import 'dart:developer'; import 'package:flutter/material.dart'; +import 'dart:ui' as ui; import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:variancedemo/providers/wallet_provider.dart'; -import 'package:variancedemo/utils/widgets.dart'; import 'package:variancedemo/variance_colors.dart'; -import 'dart:ui' as ui; - import 'package:web3_signers/web3_signers.dart'; import 'package:web3dart/web3dart.dart'; -class WalletHome extends StatefulWidget { - const WalletHome({super.key}); - - @override - State createState() => _WalletHomeState(); -} - -class _WalletHomeState extends State { - final _formKey = GlobalKey(); - TextEditingController amountController = TextEditingController(); - TextEditingController addressController = TextEditingController(); - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: VarianceColors.primary, - body: SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(vertical: 19.h, horizontal: 16.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const WalletBalance(), - 110.verticalSpace, - AddressBar( - hintText: 'Eth Address', - textEditingController: addressController, - ), - 18.verticalSpace, - TextFormField( - style: TextStyle( - fontSize: 51.sp, - fontWeight: FontWeight.w600, - color: VarianceColors.secondary), - key: _formKey, - validator: (value) { - if (value == null || value.isEmpty) { - return 'Please enter a value'; - } else if (int.parse(value) > 100) { - return 'Value should be less than or equal to 100'; - } - return null; - }, - onChanged: (value) { - if (value.isEmpty) { - return; - } - }, - textAlign: TextAlign.center, - controller: amountController, - keyboardType: TextInputType.number, - decoration: const InputDecoration( - focusColor: Colors.white, - fillColor: Colors.white, - border: InputBorder.none, - hintText: '0.0', - hintStyle: TextStyle( - fontSize: 51, color: VarianceColors.secondary), - ), - cursorColor: VarianceColors.secondary, - inputFormatters: [ - FilteringTextInputFormatter.allow( - RegExp(r'^\.?\d*(?().sendTransaction( - addressController.text, amountController.text); - }, - child: const Text('Send')), - ), - ], - ), - ), - ), - floatingActionButton: FloatingActionButton.large( - child: const Icon(Icons.qr_code_2_sharp), - onPressed: () { - showModalBottomSheetContent(context); - }, - ), - ); - } -} - String address = ''; class WalletBalance extends StatefulWidget { @@ -273,7 +173,8 @@ showModalBottomSheetContent(BuildContext context) { const SizedBox(height: 5), const Spacer(), SizedBox( - width: 50, + width: 60, + height: 30, child: TextButton( onPressed: () { Clipboard.setData(ClipboardData( @@ -282,6 +183,7 @@ showModalBottomSheetContent(BuildContext context) { }, style: TextButton.styleFrom( backgroundColor: const Color(0xff32353E), + padding: const EdgeInsets.all(5), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), diff --git a/lib/src/4337/chains.dart b/lib/src/4337/chains.dart index 10c5a7d..94ec80d 100644 --- a/lib/src/4337/chains.dart +++ b/lib/src/4337/chains.dart @@ -124,7 +124,7 @@ class Chains { jsonRpcUrl: "https://rpc.ankr.com/polygon_mumbai", entrypoint: EntryPointAddress.v06, ), - Network.baseTestent: Chain( + Network.baseTestnet: Chain( chainId: 84531, explorer: "https://sepolia.basescan.org/", jsonRpcUrl: "https://rpc.ankr.com/base_sepolia", @@ -194,7 +194,7 @@ enum Network { // testnet sepolia, mumbai, - baseTestent, + baseTestnet, // localhost localhost