diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index f11796e12..db2891d35 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -2731,5 +2731,6 @@ "unsupportedAndroidVersion": "Unsupported Android version", "unsupportedAndroidVersionLong": "This feature required a never Android version. Please check for updates or Lineage OS support.", "videoCallsBetaWarning": "Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.", - "experimentalVideoCalls": "Experimental video calls" + "experimentalVideoCalls": "Experimental video calls", + "emailOrUsername": "Email or username" } diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 7d00e6d01..bef7697e9 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -153,19 +153,22 @@ class LoginController extends State { final input = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.enterAnEmailAddress, + title: L10n.of(context)!.passwordForgotten, + message: L10n.of(context)!.enterAnEmailAddress, okLabel: L10n.of(context)!.ok, cancelLabel: L10n.of(context)!.cancel, + fullyCapitalizedForMaterial: false, textFields: [ DialogTextField( + initialText: + usernameController.text.isEmail ? usernameController.text : '', hintText: L10n.of(context)!.enterAnEmailAddress, keyboardType: TextInputType.emailAddress, ), ], ); if (input == null) return; - final clientSecret = - Matrix.of(context).client.generateUniqueTransactionId(); + final clientSecret = DateTime.now().millisecondsSinceEpoch.toString(); final response = await showFutureLoadingDialog( context: context, future: () => @@ -182,14 +185,17 @@ class LoginController extends State { title: L10n.of(context)!.weSentYouAnEmail, message: L10n.of(context)!.pleaseClickOnLink, okLabel: L10n.of(context)!.iHaveClickedOnLink, + fullyCapitalizedForMaterial: false, ); if (ok != OkCancelResult.ok) return; final password = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.chooseAStrongPassword, + title: L10n.of(context)!.passwordForgotten, + message: L10n.of(context)!.chooseAStrongPassword, okLabel: L10n.of(context)!.ok, cancelLabel: L10n.of(context)!.cancel, + fullyCapitalizedForMaterial: false, textFields: [ const DialogTextField( hintText: '******', @@ -200,17 +206,22 @@ class LoginController extends State { ], ); if (password == null) return; + final data = { + 'new_password': password.single, + "auth": AuthenticationThreePidCreds( + type: AuthenticationTypes.emailIdentity, + threepidCreds: ThreepidCreds( + sid: response.result!.sid, + clientSecret: clientSecret, + ), + ).toJson(), + }; final success = await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).getLoginClient().changePassword( - password.single, - auth: AuthenticationThreePidCreds( - type: AuthenticationTypes.emailIdentity, - threepidCreds: ThreepidCreds( - sid: response.result!.sid, - clientSecret: clientSecret, - ), - ), + future: () => Matrix.of(context).getLoginClient().request( + RequestType.POST, + '/client/r0/account/password', + data: data, ), ); if (success.error == null) { diff --git a/lib/pages/login/login_view.dart b/lib/pages/login/login_view.dart index 1b0b44f3a..54b21dee9 100644 --- a/lib/pages/login/login_view.dart +++ b/lib/pages/login/login_view.dart @@ -38,13 +38,14 @@ class LoginView extends StatelessWidget { autofocus: true, onChanged: controller.checkWellKnownWithCoolDown, controller: controller.usernameController, + keyboardType: TextInputType.emailAddress, autofillHints: controller.loading ? null : [AutofillHints.username], decoration: InputDecoration( prefixIcon: const Icon(Icons.account_box_outlined), - hintText: L10n.of(context)!.username, + hintText: L10n.of(context)!.emailOrUsername, errorText: controller.usernameError, - labelText: L10n.of(context)!.username), + labelText: L10n.of(context)!.emailOrUsername), ), ), Padding( @@ -87,16 +88,18 @@ class LoginView extends StatelessWidget { ), ), ), - Center( - child: TextButton( - onPressed: controller.passwordForgotten, - child: Text( - L10n.of(context)!.passwordForgotten, - style: const TextStyle( - color: Colors.blue, - decoration: TextDecoration.underline, - ), + const Divider(height: 32), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: ElevatedButton( + onPressed: controller.loading + ? null + : controller.passwordForgotten, + style: ElevatedButton.styleFrom( + primary: Theme.of(context).secondaryHeaderColor, + onPrimary: Colors.red, ), + child: Text(L10n.of(context)!.passwordForgotten), ), ), ], diff --git a/pubspec.lock b/pubspec.lock index 1306524e0..d826f0331 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -960,7 +960,7 @@ packages: name: matrix url: "https://pub.dartlang.org" source: hosted - version: "0.8.10" + version: "0.8.11" matrix_api_lite: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 73f374bc4..19be2a891 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,7 +57,7 @@ dependencies: intl: any localstorage: ^4.0.0+1 lottie: ^1.2.2 - matrix: ^0.8.10 + matrix: ^0.8.11 matrix_link_text: ^1.0.2 open_noti_settings: ^0.4.0 package_info_plus: ^1.3.0