From 4d5ece4d7f066b98432dba11cf141128425a8feb Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 5 Jun 2026 17:23:09 -0400 Subject: [PATCH] make verify page use a form --- lib/helpers/required_validator_helper.dart | 2 + lib/pages/login_page.dart | 4 +- lib/pages/verify_page.dart | 80 +++++++++------------- 3 files changed, 35 insertions(+), 51 deletions(-) create mode 100644 lib/helpers/required_validator_helper.dart diff --git a/lib/helpers/required_validator_helper.dart b/lib/helpers/required_validator_helper.dart new file mode 100644 index 0000000..d243684 --- /dev/null +++ b/lib/helpers/required_validator_helper.dart @@ -0,0 +1,2 @@ +String? requiredValidator(String? value) => + value == null || value.isEmpty ? "This field is required" : null; diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index b2aef41..3c20d5e 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -3,6 +3,7 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/client_controller.dart"; import "package:nexus/widgets/appbar.dart"; +import "package:nexus/helpers/required_validator_helper.dart"; class LoginPage extends HookConsumerWidget { final Uri homeserver; @@ -44,9 +45,6 @@ class LoginPage extends HookConsumerWidget { } } - String? requiredValidator(String? value) => - value == null || value.isEmpty ? "This field is required" : null; - return Scaffold( appBar: Appbar( leading: IconButton( diff --git a/lib/pages/verify_page.dart b/lib/pages/verify_page.dart index 5f8c156..e39fc64 100644 --- a/lib/pages/verify_page.dart +++ b/lib/pages/verify_page.dart @@ -3,6 +3,7 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/client_controller.dart"; import "package:nexus/widgets/appbar.dart"; +import "package:nexus/helpers/required_validator_helper.dart"; class VerifyPage extends HookConsumerWidget { const VerifyPage({super.key}); @@ -11,68 +12,51 @@ class VerifyPage extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final passphraseController = useTextEditingController(); final isLoading = useState(false); + final inputError = useState(null); + final formKey = useRef(GlobalKey()); return Scaffold( appBar: Appbar(), body: AlertDialog( title: Text("Verify"), - content: Column( - mainAxisSize: .min, - crossAxisAlignment: .start, - children: [ - Text( - "Enter your recovery key or passphrase below to unlock encrypted events.\nYour passphrase is usually not the same as your password.", - ), - SizedBox(height: 12), - TextField( - autofocus: true, - controller: passphraseController, - obscureText: true, - decoration: .new(label: Text("Recovery Key or Passphrase")), - ), - ], + content: Form( + key: formKey.value, + child: Column( + mainAxisSize: .min, + crossAxisAlignment: .start, + children: [ + Text( + "Enter your recovery key or passphrase below to unlock encrypted events.\nYour passphrase is usually not the same as your password.", + ), + SizedBox(height: 12), + TextFormField( + autofocus: true, + controller: passphraseController, + autovalidateMode: AutovalidateMode.onUserInteraction, + validator: requiredValidator, + obscureText: true, + decoration: .new( + label: Text("Recovery Key or Passphrase"), + errorText: inputError.value, + ), + ), + ], + ), ), actions: [ TextButton( onPressed: isLoading.value ? null : () async { - final scaffoldMessenger = ScaffoldMessenger.of(context); - final snackbar = scaffoldMessenger.showSnackBar( - .new( - content: Text( - "Attempting to verify with recovery key...", - ), - duration: .new(days: 999), - ), - ); - isLoading.value = true; + if (formKey.value.currentState?.validate() != true) return; - final error = await ref - .watch(ClientController.provider.notifier) - .verify(passphraseController.text); - - snackbar.close(); - if (error != null) { + try { + inputError.value = await ref + .watch(ClientController.provider.notifier) + .verify(passphraseController.text); + } finally { isLoading.value = false; - if (context.mounted) { - scaffoldMessenger.showSnackBar( - .new( - backgroundColor: Theme.of( - context, - ).colorScheme.errorContainer, - content: Text( - "Verification failed. Is your passphrase correct?\nError: $error", - style: .new( - color: Theme.of( - context, - ).colorScheme.onErrorContainer, - ), - ), - ), - ); - } } }, child: Text("Verify"),