mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-03 19:54:12 +00:00 
			
		
		
		
	Create login widget
This commit is contained in:
		
							
								
								
									
										109
									
								
								lib/ui/widgets/login_widget.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								lib/ui/widgets/login_widget.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,109 @@
 | 
			
		||||
import 'package:comunic/helpers/account_helper.dart';
 | 
			
		||||
import 'package:comunic/models/authentication_details.dart';
 | 
			
		||||
import 'package:comunic/utils/input_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/intl_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/ui_utils.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
/// Login widget
 | 
			
		||||
///
 | 
			
		||||
/// Used to authenticate user
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
class LoginWidget extends StatefulWidget {
 | 
			
		||||
  final void Function() onSignedIn;
 | 
			
		||||
 | 
			
		||||
  const LoginWidget({Key key, @required this.onSignedIn}) : super(key: key);
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  _LoginWidgetState createState() => _LoginWidgetState();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class _LoginWidgetState extends State<LoginWidget> {
 | 
			
		||||
  final _emailEditingController = TextEditingController();
 | 
			
		||||
  final _passwordEditionController = TextEditingController();
 | 
			
		||||
  bool _loading = false;
 | 
			
		||||
  AuthResult _authResult;
 | 
			
		||||
 | 
			
		||||
  String get _currEmail => _emailEditingController.text;
 | 
			
		||||
 | 
			
		||||
  String get _currPassword => _passwordEditionController.text;
 | 
			
		||||
 | 
			
		||||
  bool get _canSubmit => validateEmail(_currEmail) && _currPassword.length >= 3;
 | 
			
		||||
 | 
			
		||||
  /// Build error card
 | 
			
		||||
  Widget _buildErrorCard() {
 | 
			
		||||
    if (_authResult == null) return null;
 | 
			
		||||
 | 
			
		||||
    //Determine the right message
 | 
			
		||||
    final message = (_authResult == AuthResult.INVALID_CREDENTIALS
 | 
			
		||||
        ? tr("Invalid credentials!")
 | 
			
		||||
        : (_authResult == AuthResult.TOO_MANY_ATTEMPTS
 | 
			
		||||
            ? tr(
 | 
			
		||||
                "Too many unsuccessful login attempts! Please try again later...")
 | 
			
		||||
            : tr("A network error occurred!")));
 | 
			
		||||
 | 
			
		||||
    return buildErrorCard(message);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) => Column(
 | 
			
		||||
        children: [
 | 
			
		||||
          Container(
 | 
			
		||||
            child: _buildErrorCard(),
 | 
			
		||||
          ),
 | 
			
		||||
          //Email address
 | 
			
		||||
          TextField(
 | 
			
		||||
            controller: _emailEditingController,
 | 
			
		||||
            keyboardType: TextInputType.emailAddress,
 | 
			
		||||
            decoration: InputDecoration(
 | 
			
		||||
                labelText: tr("Email address"),
 | 
			
		||||
                alignLabelWithHint: true,
 | 
			
		||||
                errorText: _currEmail.length > 0 && !validateEmail(_currEmail)
 | 
			
		||||
                    ? tr("Invalid email address!")
 | 
			
		||||
                    : null),
 | 
			
		||||
            onChanged: (s) => setState(() {}),
 | 
			
		||||
          ),
 | 
			
		||||
 | 
			
		||||
          //Password
 | 
			
		||||
          TextField(
 | 
			
		||||
            obscureText: true,
 | 
			
		||||
            decoration: InputDecoration(
 | 
			
		||||
              labelText: tr("Password"),
 | 
			
		||||
              alignLabelWithHint: true,
 | 
			
		||||
            ),
 | 
			
		||||
            onChanged: (s) => setState(() {}),
 | 
			
		||||
            onSubmitted: _canSubmit ? (s) => _submitForm(context) : null,
 | 
			
		||||
          ),
 | 
			
		||||
 | 
			
		||||
          Container(
 | 
			
		||||
            padding: EdgeInsets.all(8.0),
 | 
			
		||||
            child: _loading
 | 
			
		||||
                ? CircularProgressIndicator()
 | 
			
		||||
                : ElevatedButton(
 | 
			
		||||
                    child: Text(tr("Sign in")),
 | 
			
		||||
                    onPressed: _canSubmit ? () => _submitForm(context) : null,
 | 
			
		||||
                  ),
 | 
			
		||||
          ),
 | 
			
		||||
        ],
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
  /// Call this whenever the user request to perform login
 | 
			
		||||
  Future<void> _submitForm(BuildContext context) async {
 | 
			
		||||
    setState(() {
 | 
			
		||||
      _loading = true;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    final loginResult = await AccountHelper().signIn(
 | 
			
		||||
        AuthenticationDetails(email: _currEmail, password: _currPassword));
 | 
			
		||||
 | 
			
		||||
    if (loginResult == AuthResult.SUCCESS)
 | 
			
		||||
      widget.onSignedIn();
 | 
			
		||||
    else
 | 
			
		||||
      setState(() {
 | 
			
		||||
        _authResult = loginResult;
 | 
			
		||||
        _loading = false;
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user