diff options
Diffstat (limited to 'mobile/lib/signup.dart')
| -rw-r--r-- | mobile/lib/signup.dart | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/mobile/lib/signup.dart b/mobile/lib/signup.dart new file mode 100644 index 0000000..18a27ad --- /dev/null +++ b/mobile/lib/signup.dart @@ -0,0 +1,200 @@ +import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:fluttertoast/fluttertoast.dart'; + +class SignUpPage extends StatefulWidget { + const SignUpPage({ + Key? key, + }) : super(key: key); + + @override + State<SignUpPage> createState() => _SignUpPageState(); +} + +class _SignUpPageState extends State<SignUpPage> { + final GlobalKey<FormState> _formKey = GlobalKey(); + + final FocusNode _focusNodePassword = FocusNode(); + final FocusNode _focusNodeConfirmPassword = FocusNode(); + final TextEditingController _controllerUsername = TextEditingController(); + final TextEditingController _controllerPassword = TextEditingController(); + final TextEditingController _corfirmPassword = 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: [ + const SizedBox(height: 20), + Image.asset( + "assets/logo.png", + height: 190, + ), + Text( + "Welcome ", + style: Theme.of(context).textTheme.headlineMedium, + ), + Text( + "Create 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: 10), + TextFormField( + controller: _corfirmPassword, + focusNode: _focusNodeConfirmPassword, + obscureText: _obscurePassword, + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + labelText: "Confirm 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."; + } else if (_controllerPassword.text.trim() != + _corfirmPassword.text.trim()) { + return "Password Must match"; + } + + 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 + .createUserWithEmailAndPassword( + 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("Sign Up"), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text("Already have an account?"), + TextButton( + onPressed: () { + _formKey.currentState?.reset(); + Navigator.pushReplacementNamed(context, "/login"); + }, + child: const Text("Login"), + ), + ], + ), + ], + ), + ], + ), + ), + ), + ); + } + + @override + void dispose() { + _focusNodePassword.dispose(); + _controllerUsername.dispose(); + _controllerPassword.dispose(); + _corfirmPassword.dispose(); + super.dispose(); + } +} |
