2021-04-17 07:52:05 +00:00
|
|
|
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();
|
2021-04-17 07:55:27 +00:00
|
|
|
final _passwordEditingController = TextEditingController();
|
2021-04-17 07:52:05 +00:00
|
|
|
bool _loading = false;
|
|
|
|
AuthResult _authResult;
|
|
|
|
|
|
|
|
String get _currEmail => _emailEditingController.text;
|
|
|
|
|
2021-04-17 07:55:27 +00:00
|
|
|
String get _currPassword => _passwordEditingController.text;
|
2021-04-17 07:52:05 +00:00
|
|
|
|
|
|
|
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(
|
2021-04-17 07:55:27 +00:00
|
|
|
controller: _passwordEditingController,
|
2021-04-17 07:52:05 +00:00
|
|
|
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;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|