From fc920dc36d16aefe9020d1cd8051ac275819aacb Mon Sep 17 00:00:00 2001 From: mike doornenbal Date: Tue, 7 Mar 2023 10:37:07 +0100 Subject: [PATCH] feat: mfa_widget --- .flutter-plugins | 2 + .flutter-plugins-dependencies | 1 + example/pubspec.lock | 120 +++++++++++++++++++++++--------- lib/flutter_login.dart | 1 + lib/src/widgets/mfa_widget.dart | 79 +++++++++++++++++++++ pubspec.yaml | 1 + 6 files changed, 172 insertions(+), 32 deletions(-) create mode 100644 .flutter-plugins create mode 100644 .flutter-plugins-dependencies create mode 100644 lib/src/widgets/mfa_widget.dart diff --git a/.flutter-plugins b/.flutter-plugins new file mode 100644 index 0000000..4c76c7f --- /dev/null +++ b/.flutter-plugins @@ -0,0 +1,2 @@ +# This is a generated file; do not edit or check into version control. +smart_auth=C:\\Users\\miked\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\smart_auth-1.0.8\\ diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies new file mode 100644 index 0000000..f286554 --- /dev/null +++ b/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"smart_auth","path":"C:\\\\Users\\\\miked\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\smart_auth-1.0.8\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"smart_auth","path":"C:\\\\Users\\\\miked\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\smart_auth-1.0.8\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"smart_auth","path":"C:\\\\Users\\\\miked\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\smart_auth-1.0.8\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"smart_auth","path":"C:\\\\Users\\\\miked\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\smart_auth-1.0.8\\\\","native_build":true,"dependencies":[]}],"windows":[{"name":"smart_auth","path":"C:\\\\Users\\\\miked\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\smart_auth-1.0.8\\\\","native_build":true,"dependencies":[]}],"web":[{"name":"smart_auth","path":"C:\\\\Users\\\\miked\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\smart_auth-1.0.8\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"smart_auth","dependencies":[]}],"date_created":"2023-03-07 10:10:48.544860","version":"3.7.3"} \ No newline at end of file diff --git a/example/pubspec.lock b/example/pubspec.lock index 0cfb45a..178f5ce 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,42 +5,48 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" flutter: @@ -52,7 +58,8 @@ packages: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c + url: "https://pub.dev" source: hosted version: "2.0.1" flutter_login: @@ -61,101 +68,150 @@ packages: path: ".." relative: true source: path - version: "3.1.0" + version: "3.1.2" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + js: + dependency: transitive + description: + name: js + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" + source: hosted + version: "0.6.5" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "5cfd6509652ff5e7fe149b6df4859e687fca9048437857cb2e65c8d780f396e3" + url: "https://pub.dev" source: hosted version: "2.0.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" + pinput: + dependency: transitive + description: + name: pinput + sha256: "1773743c188cdd2f8d0398ea708ec72645bb41ac9311755c4f7bb03a4184bdcf" + url: "https://pub.dev" + source: hosted + version: "2.2.31" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + smart_auth: + dependency: transitive + description: + name: smart_auth + sha256: "8cfaec55b77d5930ed1666bb7ae70db5bade099bb1422401386853b400962113" + url: "https://pub.dev" + source: hosted + version: "1.0.8" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc + url: "https://pub.dev" + source: hosted + version: "1.0.0+1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" sdks: dart: ">=2.18.1 <3.0.0" - flutter: ">=1.17.0" + flutter: ">=3.7.0" diff --git a/lib/flutter_login.dart b/lib/flutter_login.dart index 4f2e0fd..f77b6a6 100644 --- a/lib/flutter_login.dart +++ b/lib/flutter_login.dart @@ -4,3 +4,4 @@ export 'src/config/login_options.dart'; export 'src/widgets/email_password_login.dart'; export 'src/widgets/forgot_password_form.dart'; export 'src/service/validation.dart'; +export 'src/widgets/mfa_widget.dart'; diff --git a/lib/src/widgets/mfa_widget.dart b/lib/src/widgets/mfa_widget.dart new file mode 100644 index 0000000..0840737 --- /dev/null +++ b/lib/src/widgets/mfa_widget.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:pinput/pinput.dart'; + +class MFAWidget extends StatefulWidget { + const MFAWidget( + {required this.onCompleted, + this.onSubmitted, + this.defaultPinTheme, + this.focusedPinTheme, + this.submittedPinTheme, + this.followingPinTheme, + this.disabledPinTheme, + this.errorPinTheme, + this.seperatorPositions, + this.errorBuilder, + this.errorText, + this.errorTextStyle, + this.validator, + this.submitButtonBuilder, + super.key}) + : assert( + onSubmitted != null && submitButtonBuilder != null, + ); + + final Function(String code) onCompleted; + final Function(String code)? onSubmitted; + final PinTheme? defaultPinTheme; + final PinTheme? focusedPinTheme; + final PinTheme? submittedPinTheme; + final PinTheme? followingPinTheme; + final PinTheme? disabledPinTheme; + final PinTheme? errorPinTheme; + final List? seperatorPositions; + final String? errorText; + final String? Function(String?)? validator; + final Widget Function(String?, String)? errorBuilder; + final TextStyle? errorTextStyle; + final Widget Function(Function onTap)? submitButtonBuilder; + + @override + State createState() => _MFAWidgetState(); +} + +class _MFAWidgetState extends State { + final TextEditingController _controller = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Pinput( + defaultPinTheme: widget.defaultPinTheme, + focusedPinTheme: widget.focusedPinTheme, + submittedPinTheme: widget.submittedPinTheme, + followingPinTheme: widget.followingPinTheme, + disabledPinTheme: widget.disabledPinTheme, + errorPinTheme: widget.errorPinTheme, + separatorPositions: widget.seperatorPositions, + errorBuilder: widget.errorBuilder, + errorText: widget.errorText, + errorTextStyle: widget.errorTextStyle, + validator: widget.validator, + controller: _controller, + length: 6, + onCompleted: (_) { + widget.onCompleted(_controller.text); + }, + ), + if (widget.onSubmitted != null && + widget.submitButtonBuilder != null) ...[ + widget.submitButtonBuilder!(() { + widget.onSubmitted!(_controller.text); + }), + ], + ], + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 617c70f..64a405f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: flutter: sdk: flutter + pinput: ^2.2.31 dev_dependencies: flutter_test: