diff --git a/lib/main.dart b/lib/main.dart index 8074263..122dbcc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,6 +14,7 @@ class ComunicApplication extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( + debugShowCheckedModeBanner: false, // We need to know whether the user is signed in or not to continue home: FutureBuilder( future: AccountCredentialsHelper().signedIn(), diff --git a/lib/ui/login_route.dart b/lib/ui/login_route.dart index 310c913..30f98e2 100644 --- a/lib/ui/login_route.dart +++ b/lib/ui/login_route.dart @@ -1,3 +1,5 @@ +import 'package:comunic/utils/input_utils.dart'; +import 'package:comunic/utils/intl_utils.dart'; import 'package:flutter/material.dart'; /// Login route @@ -10,8 +12,81 @@ class LoginRoute extends StatefulWidget { } class _LoginRouteState extends State { + String _currEmail; + String _currPassword; + + @override + void initState() { + super.initState(); + _currEmail = ""; + _currPassword = ""; + } + + void _emailChanged(String newEmail) { + setState(() { + _currEmail = newEmail; + }); + } + + void _passwordChanged(String newValue) { + setState(() { + _currPassword = newValue; + }); + } + + /// Call this whenever the user request to perform login + void _submitForm() { + + } + + /// Build login form + Widget _buildLoginForm(){ + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text(tr("Please sign into your Comunic account: ")), + //Email address + TextField( + keyboardType: TextInputType.emailAddress, + decoration: InputDecoration( + labelText: tr("Email address"), + alignLabelWithHint: true, + errorText: + _currEmail.length > 0 && !validateEmail(_currEmail) + ? tr("Invalid email address!") + : null), + onChanged: _emailChanged, + ), + + //Password + TextField( + obscureText: true, + decoration: InputDecoration( + labelText: tr("Password"), + alignLabelWithHint: true, + ), + onChanged: _passwordChanged, + ), + + RaisedButton( + child: Text(tr("Sign in")), + onPressed: !validateEmail(_currEmail) || _currPassword.length < 3 ? null : _submitForm, + ) + ], + ), + ), + ); + } + @override Widget build(BuildContext context) { - return Text("Hello world"); + return Scaffold( + appBar: AppBar( + title: Text("Comunic"), + ), + body: _buildLoginForm() + ); } -} \ No newline at end of file +} diff --git a/lib/utils/input_utils.dart b/lib/utils/input_utils.dart new file mode 100644 index 0000000..a049171 --- /dev/null +++ b/lib/utils/input_utils.dart @@ -0,0 +1,13 @@ +/// Input utilities +/// +/// @author Pierre HUBERT + +/// Check out whether a given email address is valid or not +/// +/// Taken from https://medium.com/@nitishk72/form-validation-in-flutter-d762fbc9212c +bool validateEmail(String value) { + Pattern pattern = + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; + RegExp regex = new RegExp(pattern); + return regex.hasMatch(value); +} diff --git a/lib/utils/intl_utils.dart b/lib/utils/intl_utils.dart new file mode 100644 index 0000000..57f2b79 --- /dev/null +++ b/lib/utils/intl_utils.dart @@ -0,0 +1,11 @@ +/// Internationalization utilities +/// +/// @author Pierre HUBERT + +/// Translate a string +/// +/// Translate a given [string] into the current language, if available +String tr(String string) { + //TODO : create translation system + return string; +} \ No newline at end of file