mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-10-23 15:03:22 +00:00
112 lines
3.1 KiB
Dart
112 lines
3.1 KiB
Dart
|
import 'package:comunic/helpers/account_helper.dart';
|
||
|
import 'package:comunic/ui/widgets/safe_state.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/cupertino.dart';
|
||
|
import 'package:flutter/material.dart';
|
||
|
|
||
|
/// Reset password route
|
||
|
///
|
||
|
/// @author Pierre Hubert
|
||
|
|
||
|
class ResetPasswordRoute extends StatelessWidget {
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return Scaffold(
|
||
|
appBar: AppBar(
|
||
|
title: Text(tr("Password forgotten")),
|
||
|
),
|
||
|
body: Center(
|
||
|
child: ConstrainedBox(
|
||
|
constraints: BoxConstraints(maxWidth: 300),
|
||
|
child: _ResetPasswordBody(),
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class _ResetPasswordBody extends StatefulWidget {
|
||
|
@override
|
||
|
_ResetPasswordBodyState createState() => _ResetPasswordBodyState();
|
||
|
}
|
||
|
|
||
|
class _ResetPasswordBodyState extends SafeState<_ResetPasswordBody> {
|
||
|
var _loading = false;
|
||
|
|
||
|
/// Step 1 - check email address
|
||
|
String _emailAddress;
|
||
|
final _emailController = TextEditingController();
|
||
|
|
||
|
String get _inputEmail => _emailController.text;
|
||
|
|
||
|
bool get _isEmailValid =>
|
||
|
_inputEmail.isNotEmpty && validateEmail(_inputEmail);
|
||
|
|
||
|
/// Step 2 - Offer options
|
||
|
bool _hasSecurityQuestions;
|
||
|
|
||
|
void _setLoading(bool loading) => setState(() => _loading = loading);
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
if (_loading) return buildCenteredProgressBar();
|
||
|
|
||
|
if (_emailAddress == null) return _buildEnterEmailAddressScreen();
|
||
|
}
|
||
|
|
||
|
Widget _buildEnterEmailAddressScreen() {
|
||
|
return Column(
|
||
|
mainAxisSize: MainAxisSize.min,
|
||
|
children: <Widget>[
|
||
|
TextField(
|
||
|
controller: _emailController,
|
||
|
onChanged: (s) => setState(() {}),
|
||
|
onSubmitted: _isEmailValid ? (s) => _checkEmail() : null,
|
||
|
textInputAction: TextInputAction.done,
|
||
|
keyboardType: TextInputType.emailAddress,
|
||
|
decoration: InputDecoration(
|
||
|
icon: Icon(Icons.email),
|
||
|
alignLabelWithHint: true,
|
||
|
labelText: tr("Email address..."),
|
||
|
suffixIcon: IconButton(
|
||
|
icon: Icon(Icons.check),
|
||
|
onPressed: _isEmailValid ? _checkEmail : null,
|
||
|
),
|
||
|
errorText: _inputEmail.isEmpty || _isEmailValid
|
||
|
? null
|
||
|
: tr("Invalid email address!"),
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// Check given email address
|
||
|
void _checkEmail() async {
|
||
|
try {
|
||
|
_setLoading(true);
|
||
|
|
||
|
// Check if email address exists or not
|
||
|
if (!await AccountHelper.existsMailAccount(_inputEmail)) {
|
||
|
_setLoading(false);
|
||
|
showSimpleSnack(context, tr("Specified email address was not found!"));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
_hasSecurityQuestions =
|
||
|
await AccountHelper.hasSecurityQuestions(_inputEmail);
|
||
|
|
||
|
// We retain email address only if everything went well
|
||
|
_emailAddress = _inputEmail;
|
||
|
_setLoading(false);
|
||
|
} catch (e, s) {
|
||
|
print("Could not check given email! $e\n$s");
|
||
|
showSimpleSnack(
|
||
|
context, tr("An error occurred while checking your options !"));
|
||
|
_setLoading(false);
|
||
|
}
|
||
|
}
|
||
|
}
|