import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/user_authenticator.dart'; class SignInWidget extends StatefulWidget { final Function() onReconfigurationRequested; const SignInWidget( this.onReconfigurationRequested, { Key key, }) : super(key: key); @override _SignInWidgetState createState() => _SignInWidgetState(); } class _SignInWidgetState extends State { String _username, _password, _repeatedPassword; @override void initState() { super.initState(); } @override Widget build(BuildContext context) { if (Configuration.instance.getToken() == null) { // Has probably not signed up return _getSignUpWidget(context); } else { return _getSignInWidget(context); } } Widget _getSignUpWidget(BuildContext context) { return Container( child: Column( children: [ Padding( padding: const EdgeInsets.fromLTRB(0, 16, 0, 0), child: Text("Create an account to get started"), ), TextFormField( decoration: InputDecoration( hintText: 'username', contentPadding: EdgeInsets.all(20), ), autofocus: true, autocorrect: false, onChanged: (value) { setState(() { _username = value; }); }, ), TextFormField( decoration: InputDecoration( hintText: 'password', contentPadding: EdgeInsets.all(20), ), autocorrect: false, obscureText: true, onChanged: (value) { setState(() { _password = value; }); }, ), TextFormField( decoration: InputDecoration( hintText: 'repeat password', contentPadding: EdgeInsets.all(20), ), autocorrect: false, obscureText: true, onChanged: (value) { setState(() { _repeatedPassword = value; }); }, ), CupertinoButton( child: Text("Sign Up"), onPressed: () async { if (_password != _repeatedPassword) { _showPasswordMismatchDialog(); } else { try { final userCreated = await UserAuthenticator.instance .create(_username, _password); if (userCreated) { Navigator.of(context).pop(); } else { _showGenericErrorDialog(); } } catch (e) { _showGenericErrorDialog(error: e); } } }, ), ], )); } Widget _getSignInWidget(BuildContext context) { return Container( child: Column( children: [ TextFormField( initialValue: Configuration.instance.getUsername(), decoration: InputDecoration( hintText: 'username', contentPadding: EdgeInsets.all(20), ), autofocus: true, autocorrect: false, onChanged: (value) { setState(() { _username = value; }); }, ), TextFormField( initialValue: Configuration.instance.getPassword(), decoration: InputDecoration( hintText: 'password', contentPadding: EdgeInsets.all(20), ), autocorrect: false, obscureText: true, onChanged: (value) { setState(() { _password = value; }); }, ), CupertinoButton( child: Text("Sign In"), onPressed: () async { final loggedIn = await UserAuthenticator.instance.login(_username, _password); if (loggedIn) { Navigator.of(context).pop(); } else { _showAuthenticationFailedErrorDialog(); } }, ), ], )); } void _showPasswordMismatchDialog() { showDialog( context: context, barrierDismissible: false, // user must tap button! builder: (BuildContext context) { return CupertinoAlertDialog( title: Text("Passwords don't match"), content: Padding( padding: const EdgeInsets.fromLTRB(0, 16, 0, 0), child: Text("Please make sure that the passwords you enter match."), ), actions: [ CupertinoDialogAction( child: Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); } void _showGenericErrorDialog({Exception error}) { showDialog( context: context, barrierDismissible: false, // user must tap button! builder: (BuildContext context) { return CupertinoAlertDialog( title: Text("Ooops."), content: Padding( padding: const EdgeInsets.fromLTRB(0, 16, 0, 0), child: error == null ? Text("Something went wrong.") : Text(error.toString()), ), actions: [ CupertinoDialogAction( child: Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); } void _showAuthenticationFailedErrorDialog() { showDialog( context: context, barrierDismissible: false, // user must tap button! builder: (BuildContext context) { return CupertinoAlertDialog( title: Text('Login failed'), content: Padding( padding: const EdgeInsets.fromLTRB(0, 16, 0, 0), child: Text( 'Please make sure that the credentials entered are correct.'), ), actions: [ CupertinoDialogAction( child: Text('Reconfigure'), onPressed: () { Navigator.of(context).pop(); Configuration.instance.setEndpoint(null); widget.onReconfigurationRequested(); }, ), CupertinoDialogAction( child: Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); } }