diff options
Diffstat (limited to 'mobile/lib/login.dart')
| -rw-r--r-- | mobile/lib/login.dart | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/mobile/lib/login.dart b/mobile/lib/login.dart new file mode 100644 index 0000000..b210650 --- /dev/null +++ b/mobile/lib/login.dart @@ -0,0 +1,161 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:firebase_auth/firebase_auth.dart'; + +class LoginPage extends StatefulWidget { + const LoginPage({ + Key? key, + }) : super(key: key); + + @override + State<LoginPage> createState() => _LoginPageState(); +} + +class _LoginPageState extends State<LoginPage> { + final GlobalKey<FormState> _formKey = GlobalKey(); + + final FocusNode _focusNodePassword = FocusNode(); + final TextEditingController _controllerUsername = TextEditingController(); + final TextEditingController _controllerPassword = TextEditingController(); + + bool _obscurePassword = true; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.grey[300], + body: Form( + key: _formKey, + child: SingleChildScrollView( + padding: const EdgeInsets.all(30.0), + child: Column( + children: [ + Image.asset( + "assets/logo.png", + height: 190, + ), + Text( + "Welcome back", + style: Theme.of(context).textTheme.headlineMedium, + ), + Text( + "Login to your account", + style: Theme.of(context).textTheme.bodySmall, + ), + const SizedBox(height: 40), + TextFormField( + controller: _controllerUsername, + keyboardType: TextInputType.name, + decoration: InputDecoration( + labelText: "Email", + prefixIcon: const Icon(Icons.email_outlined), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + onEditingComplete: () => _focusNodePassword.requestFocus(), + validator: (String? value) { + if (value == null || value.isEmpty) { + return "Please enter username."; + } + + return null; + }, + ), + const SizedBox(height: 10), + TextFormField( + controller: _controllerPassword, + focusNode: _focusNodePassword, + obscureText: _obscurePassword, + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + labelText: "Password", + prefixIcon: const Icon(Icons.password_outlined), + suffixIcon: IconButton( + onPressed: () { + setState(() { + _obscurePassword = !_obscurePassword; + }); + }, + icon: _obscurePassword + ? const Icon(Icons.visibility_outlined) + : const Icon(Icons.visibility_off_outlined)), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + validator: (String? value) { + if (value == null || value.isEmpty) { + return "Please enter password."; + } + + return null; + }, + ), + const SizedBox(height: 60), + Column( + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + minimumSize: const Size.fromHeight(50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + backgroundColor: Color(0xFF355291), + ), + onPressed: () async { + if (_formKey.currentState?.validate() ?? false) { + try { + await FirebaseAuth.instance + .signInWithEmailAndPassword( + email: _controllerUsername.text.trim(), + password: _controllerPassword.text.trim()) + .then((value) => + Navigator.pushNamedAndRemoveUntil( + context, '/', (route) => false)); + } on FirebaseAuthException catch (e) { + Fluttertoast.showToast( + msg: e.message.toString(), + gravity: ToastGravity.SNACKBAR); + } + } + }, + child: const Text("Login"), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text("Don't have an account?"), + TextButton( + onPressed: () { + _formKey.currentState?.reset(); + Navigator.pushNamedAndRemoveUntil( + context, "/signup", (route) => false); + }, + child: const Text("Signup"), + ), + ], + ), + ], + ), + ], + ), + ), + ), + ); + } + + @override + void dispose() { + _focusNodePassword.dispose(); + _controllerUsername.dispose(); + _controllerPassword.dispose(); + super.dispose(); + } +} |
