170 lines
5.3 KiB
Dart
170 lines
5.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:firebase_auth/firebase_auth.dart';
|
|
import '../components/my_button.dart';
|
|
import '../components/my_textfield.dart';
|
|
import '../utils/helper_dialogs.dart';
|
|
import '../services/auth/auth_service.dart';
|
|
import '../services/user_service.dart';
|
|
|
|
class RegisterPage extends StatelessWidget {
|
|
final TextEditingController _nameController = TextEditingController();
|
|
final TextEditingController _lastnameController = TextEditingController();
|
|
final TextEditingController _emailController = TextEditingController();
|
|
final TextEditingController _passwordController = TextEditingController();
|
|
final TextEditingController _confirmPassController = TextEditingController();
|
|
|
|
// tap to go to login page
|
|
final void Function()? onTap;
|
|
|
|
RegisterPage({super.key, required this.onTap});
|
|
|
|
// register method
|
|
Future<void> register(BuildContext context) async {
|
|
final auth = AuthService();
|
|
|
|
// check if passwords match
|
|
if (_passwordController.text == _confirmPassController.text) {
|
|
try {
|
|
await auth
|
|
.signUpWithEmailPassword(
|
|
_emailController.text, _passwordController.text)
|
|
.then((userCredential) {
|
|
UserService.saveUserRegistrationData(
|
|
userCredential,
|
|
_emailController.text,
|
|
_nameController.text,
|
|
_lastnameController.text);
|
|
});
|
|
} on FirebaseAuthException catch (e) {
|
|
if (context.mounted) {
|
|
showMsg(
|
|
context,
|
|
e.code.isNotEmpty ? e.code : 'Registration error',
|
|
'${e.message}',
|
|
);
|
|
}
|
|
}
|
|
} else {
|
|
showMsg(context, 'Registration error', 'Passwords do not match!');
|
|
}
|
|
}
|
|
|
|
bool _validateFields(BuildContext context) {
|
|
if ((_nameController.text.trim().isEmpty &&
|
|
_lastnameController.text.trim().isEmpty) ||
|
|
_emailController.text.trim().isEmpty ||
|
|
_passwordController.text.trim().isEmpty) {
|
|
showMsg(
|
|
context,
|
|
'Missing information',
|
|
'Please enter your name, email and password',
|
|
);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
backgroundColor: Theme.of(context).colorScheme.surface,
|
|
body: SafeArea(
|
|
child: Center(
|
|
child: SingleChildScrollView(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
const SizedBox(height: 25),
|
|
// logo and register message
|
|
Icon(
|
|
Icons.people_alt,
|
|
size: 60,
|
|
color: Theme.of(context).colorScheme.primary,
|
|
),
|
|
const SizedBox(height: 16),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 25.0),
|
|
child: Text(
|
|
textAlign: TextAlign.center,
|
|
'Create an account '
|
|
'and start connecting with potential co-founders.',
|
|
style: TextStyle(
|
|
color: Theme.of(context).colorScheme.primary,
|
|
fontSize: 16,
|
|
),
|
|
),
|
|
),
|
|
|
|
const SizedBox(height: 25),
|
|
|
|
// text fields
|
|
MyTextField(
|
|
hintText: 'First Name',
|
|
obscureText: false,
|
|
controller: _nameController,
|
|
),
|
|
MyTextField(
|
|
hintText: 'Last Name',
|
|
obscureText: false,
|
|
controller: _lastnameController,
|
|
),
|
|
|
|
MyTextField(
|
|
hintText: 'E-Mail',
|
|
obscureText: false,
|
|
controller: _emailController,
|
|
),
|
|
|
|
MyTextField(
|
|
hintText: 'Password',
|
|
obscureText: true,
|
|
controller: _passwordController,
|
|
),
|
|
MyTextField(
|
|
hintText: 'Confirm Password',
|
|
obscureText: true,
|
|
controller: _confirmPassController,
|
|
),
|
|
|
|
const SizedBox(height: 25),
|
|
|
|
// register button
|
|
MyButton(
|
|
text: 'Register',
|
|
onTap: () => {
|
|
if (_validateFields(context)) {register(context)}
|
|
},
|
|
),
|
|
|
|
const SizedBox(height: 25),
|
|
|
|
// register now
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
'Already have an account? ',
|
|
style: TextStyle(
|
|
color: Theme.of(context).colorScheme.primary,
|
|
),
|
|
),
|
|
GestureDetector(
|
|
onTap: onTap,
|
|
child: const Text(
|
|
'Login now',
|
|
style: TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|