diff --git a/lib/login_page.dart b/lib/login_page.dart index ed51647..3b2ee5f 100644 --- a/lib/login_page.dart +++ b/lib/login_page.dart @@ -18,8 +18,11 @@ class _LoginPageState extends State { final TextEditingController _emailController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); + final _formKey = GlobalKey(); + final StorageHelper _storageHelper = StorageHelper(); String? _error; + bool loggingIn = false; @override void initState() { @@ -83,45 +86,74 @@ class _LoginPageState extends State { ); } + String? validateNotEmpty(String? content) { + if (content == null || content.isEmpty) { + return "Do not leave this field empty"; + } + return null; + } + + void handleLoginPressed() async { + if (loggingIn) return; + + loggingIn = true; + if (_formKey.currentState!.validate()) { + await _login( + _urlController.text, + _emailController.text, + _passwordController.text, + ); + } + loggingIn = false; + } + @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Login')), body: Padding( padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - TextField( - controller: _urlController, - decoration: InputDecoration(labelText: 'Url'), - ), - TextField( - controller: _emailController, - decoration: InputDecoration(labelText: 'Email'), - ), - TextField( - controller: _passwordController, - decoration: InputDecoration(labelText: 'Password'), - obscureText: true, - ), - if (_error != null) - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Text(_error!, style: TextStyle(color: Colors.red)), + child: Form( + key: _formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextFormField( + controller: _urlController, + validator: validateNotEmpty, + decoration: InputDecoration(labelText: 'Url'), + textInputAction: TextInputAction.next, ), - SizedBox(height: 16), - ElevatedButton( - onPressed: () { - _login( - _urlController.text, - _emailController.text, - _passwordController.text, - ); - }, - child: Text('Login'), - ), - ], + TextFormField( + controller: _emailController, + validator: validateNotEmpty, + autofocus: true, + decoration: InputDecoration(labelText: 'Email'), + textInputAction: TextInputAction.next, + ), + TextFormField( + controller: _passwordController, + validator: validateNotEmpty, + // focusNode: _passwordFocusNode, + decoration: InputDecoration(labelText: 'Password'), + obscureText: true, + textInputAction: TextInputAction + .next, // with submit or go, onFieldSubmitted is not called + onFieldSubmitted: (_) => handleLoginPressed(), + ), + // ), + SizedBox(height: 5), + ElevatedButton( + onPressed: loggingIn ? null : handleLoginPressed, + child: Text('Login'), + ), + if (_error != null) + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text(_error!, style: TextStyle(color: Colors.red)), + ), + ], + ), ), ), );