From ca70ec024059c2e730e91fbde47e131435240dd3 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Mon, 12 Apr 2021 17:40:45 +0200 Subject: [PATCH] refactor: MVC sign up password view --- lib/config/routes.dart | 2 +- .../sign_up_password_controller.dart} | 75 +++---------------- lib/views/sign_up_password_view.dart | 75 +++++++++++++++++++ test/sign_up_password_test.dart | 16 ++++ 4 files changed, 101 insertions(+), 67 deletions(-) rename lib/{views/sign_up_password.dart => controllers/sign_up_password_controller.dart} (62%) create mode 100644 lib/views/sign_up_password_view.dart create mode 100644 test/sign_up_password_test.dart diff --git a/lib/config/routes.dart b/lib/config/routes.dart index be64c045..7e9ca382 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -2,6 +2,7 @@ import 'package:adaptive_page_layout/adaptive_page_layout.dart'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:fluffychat/controllers/homeserver_picker_controller.dart'; import 'package:fluffychat/controllers/sign_up_controller.dart'; +import 'package:fluffychat/controllers/sign_up_password_controller.dart'; import 'package:fluffychat/views/widgets/matrix.dart'; import 'package:fluffychat/views/archive.dart'; import 'package:fluffychat/views/chat.dart'; @@ -25,7 +26,6 @@ import 'package:fluffychat/views/settings_ignore_list.dart'; import 'package:fluffychat/views/settings_multiple_emotes.dart'; import 'package:fluffychat/views/settings_notifications.dart'; import 'package:fluffychat/views/settings_style.dart'; -import 'package:fluffychat/views/sign_up_password.dart'; import 'package:flutter/material.dart'; class FluffyRoutes { diff --git a/lib/views/sign_up_password.dart b/lib/controllers/sign_up_password_controller.dart similarity index 62% rename from lib/views/sign_up_password.dart rename to lib/controllers/sign_up_password_controller.dart index a0c9a945..690a0639 100644 --- a/lib/views/sign_up_password.dart +++ b/lib/controllers/sign_up_password_controller.dart @@ -2,9 +2,9 @@ import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:adaptive_page_layout/adaptive_page_layout.dart'; import 'package:famedlysdk/famedlysdk.dart'; +import 'package:fluffychat/views/sign_up_password_view.dart'; import 'package:fluffychat/views/widgets/matrix.dart'; -import 'package:fluffychat/views/widgets/one_page_card.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -16,17 +16,19 @@ class SignUpPassword extends StatefulWidget { final String displayname; const SignUpPassword(this.username, {this.avatar, this.displayname}); @override - _SignUpPasswordState createState() => _SignUpPasswordState(); + SignUpPasswordController createState() => SignUpPasswordController(); } -class _SignUpPasswordState extends State { +class SignUpPasswordController extends State { final TextEditingController passwordController = TextEditingController(); String passwordError; String _lastAuthWebViewStage; bool loading = false; bool showPassword = true; - void _signUpAction(BuildContext context, {AuthenticationData auth}) async { + void toggleShowPassword() => setState(() => showPassword = !showPassword); + + void signUpAction({AuthenticationData auth}) async { var matrix = Matrix.of(context); if (passwordController.text.isEmpty) { setState(() => passwordError = L10n.of(context).pleaseEnterYourPassword); @@ -59,8 +61,7 @@ class _SignUpPasswordState extends State { true); if (currentStage == 'm.login.dummy') { - _signUpAction( - context, + signUpAction( auth: AuthenticationData( type: currentStage, session: exception.session, @@ -86,8 +87,7 @@ class _SignUpPasswordState extends State { cancelLabel: L10n.of(context).cancel, useRootNavigator: false, )) { - _signUpAction( - context, + signUpAction( auth: AuthenticationData(session: exception.session), ); } else { @@ -127,62 +127,5 @@ class _SignUpPasswordState extends State { } @override - Widget build(BuildContext context) { - return OnePageCard( - child: Scaffold( - appBar: AppBar( - elevation: 0, - leading: loading ? Container() : BackButton(), - title: Text( - L10n.of(context).chooseAStrongPassword, - ), - ), - body: ListView( - children: [ - Padding( - padding: const EdgeInsets.all(12.0), - child: TextField( - controller: passwordController, - obscureText: !showPassword, - autofocus: true, - readOnly: loading, - autocorrect: false, - onSubmitted: (t) => _signUpAction(context), - autofillHints: loading ? null : [AutofillHints.newPassword], - decoration: InputDecoration( - prefixIcon: Icon(Icons.lock_outlined), - hintText: '****', - errorText: passwordError, - suffixIcon: IconButton( - tooltip: L10n.of(context).showPassword, - icon: Icon(showPassword - ? Icons.visibility_off_outlined - : Icons.visibility_outlined), - onPressed: () => - setState(() => showPassword = !showPassword), - ), - labelText: L10n.of(context).password), - ), - ), - SizedBox(height: 12), - Hero( - tag: 'loginButton', - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12), - child: ElevatedButton( - onPressed: loading ? null : () => _signUpAction(context), - child: loading - ? LinearProgressIndicator() - : Text( - L10n.of(context).createAccountNow.toUpperCase(), - style: TextStyle(color: Colors.white, fontSize: 16), - ), - ), - ), - ), - ], - ), - ), - ); - } + Widget build(BuildContext context) => SignUpPasswordView(this); } diff --git a/lib/views/sign_up_password_view.dart b/lib/views/sign_up_password_view.dart new file mode 100644 index 00000000..b94a9dcc --- /dev/null +++ b/lib/views/sign_up_password_view.dart @@ -0,0 +1,75 @@ +import 'package:fluffychat/controllers/sign_up_password_controller.dart'; + +import 'package:fluffychat/views/widgets/one_page_card.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +class SignUpPasswordView extends StatelessWidget { + final SignUpPasswordController controller; + + const SignUpPasswordView( + this.controller, { + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return OnePageCard( + child: Scaffold( + appBar: AppBar( + elevation: 0, + leading: controller.loading ? Container() : BackButton(), + title: Text( + L10n.of(context).chooseAStrongPassword, + ), + ), + body: ListView( + children: [ + Padding( + padding: const EdgeInsets.all(12.0), + child: TextField( + controller: controller.passwordController, + obscureText: !controller.showPassword, + autofocus: true, + readOnly: controller.loading, + autocorrect: false, + onSubmitted: (_) => controller.signUpAction, + autofillHints: + controller.loading ? null : [AutofillHints.newPassword], + decoration: InputDecoration( + prefixIcon: Icon(Icons.lock_outlined), + hintText: '****', + errorText: controller.passwordError, + suffixIcon: IconButton( + tooltip: L10n.of(context).showPassword, + icon: Icon(controller.showPassword + ? Icons.visibility_off_outlined + : Icons.visibility_outlined), + onPressed: controller.toggleShowPassword, + ), + labelText: L10n.of(context).password), + ), + ), + SizedBox(height: 12), + Hero( + tag: 'loginButton', + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: ElevatedButton( + onPressed: + controller.loading ? null : controller.signUpAction, + child: controller.loading + ? LinearProgressIndicator() + : Text( + L10n.of(context).createAccountNow.toUpperCase(), + style: TextStyle(color: Colors.white, fontSize: 16), + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/test/sign_up_password_test.dart b/test/sign_up_password_test.dart new file mode 100644 index 00000000..4d552cdf --- /dev/null +++ b/test/sign_up_password_test.dart @@ -0,0 +1,16 @@ +import 'package:fluffychat/controllers/sign_up_password_controller.dart'; +import 'package:fluffychat/main.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Test if the widget can be created', (WidgetTester tester) async { + await tester.pumpWidget( + FluffyChatApp( + testWidget: SignUpPassword( + 'test_user', + displayname: 'Test User', + ), + ), + ); + }); +}