import 'package:carpool/drawer.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; 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 createState() => _SignUpPageState(); } class _SignUpPageState extends State { final GlobalKey _formKey = GlobalKey(); final FocusNode _focusNodePassword = FocusNode(); final FocusNode _focusNodeConfirmPassword = FocusNode(); final TextEditingController _controllerUsername = TextEditingController(); final TextEditingController _controllerPassword = TextEditingController(); final TextEditingController _controllerName = TextEditingController(); final TextEditingController _controllerPhoneNumber = TextEditingController(); final TextEditingController _corfirmPassword = TextEditingController(); bool _obscurePassword = true; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Sign Up')), drawer: CustomDrawer(), 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: 140, ), 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: 10), TextFormField( controller: _controllerName, keyboardType: TextInputType.name, decoration: InputDecoration( labelText: "Name", border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), validator: (String? value) { if (value == null || value.isEmpty) { return "Please enter name."; } return null; }, ), const SizedBox(height: 10), TextFormField( controller: _controllerPhoneNumber, keyboardType: TextInputType.number, decoration: InputDecoration( labelText: "Phone Number", border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), validator: (String? value) { if (value == null || value.isEmpty) { return "Please enter phone number."; } return null; }, ), const SizedBox(height: 60), const SizedBox(height: 60), Column( children: [ ElevatedButton( style: ElevatedButton.styleFrom( minimumSize: const Size.fromHeight(50), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), backgroundColor: const Color(0xFF355291), ), onPressed: () async { if (_formKey.currentState?.validate() ?? false) { try { await FirebaseAuth.instance .createUserWithEmailAndPassword( email: _controllerUsername.text.trim(), password: _controllerPassword.text.trim()); FirebaseFirestore firestore = FirebaseFirestore.instance; User? user = FirebaseAuth.instance.currentUser; CollectionReference collection = firestore.collection('users'); Map data = { 'name': _controllerName.text.trim(), 'phoneNumber': _controllerPhoneNumber.text.trim(), 'uid': user?.uid, }; try { // Add a new document with an automatically generated ID await collection.add(data); print('Document added successfully!'); } catch (e) { print('Error adding document: $e'); } Navigator.pushNamedAndRemoveUntil( context, "/login", (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(); _controllerName.dispose(); _controllerPhoneNumber.dispose(); super.dispose(); } }