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: [ 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); } } }