import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:prosappco/components/general_primary_button.dart'; import 'package:user_repository/user_repository.dart'; import '../../blocs/sign_up_bloc/sign_up_bloc.dart'; import '../../components/strings.dart'; import '../../components/textfield.dart'; class SignUpScreen extends StatefulWidget { const SignUpScreen({super.key}); @override State createState() => _SignUpScreenState(); } class _SignUpScreenState extends State { final _formKey = GlobalKey(); final emailController = TextEditingController(); final passwordController = TextEditingController(); bool obscurePassword = true; IconData iconPassword = CupertinoIcons.eye_fill; final nameController = TextEditingController(); bool signUpRequired = false; bool containsUpperCase = false; bool containsLowerCase = false; bool containsNumber = false; bool containsSpecialChar = false; bool contains8Length = false; @override Widget build(BuildContext context) { final width = MediaQuery.of(context).size.width; return BlocListener( listener: (context, state) { if (state is SignUpSuccess) { setState(() { signUpRequired = false; }); } else if (state is SignUpProcess) { setState(() { signUpRequired = true; }); } else if (state is SignUpFailure) { return; } }, child: Column( children: [ SizedBox( width: double.infinity, child: Row( children: [ IconButton( onPressed: () { Navigator.pop(context); }, icon: const Icon( CupertinoIcons.arrow_left, size: 30, ), ), Text( 'Registrate', style: TextStyle( // fontSize: 30, fontSize: width * 0.08, fontWeight: FontWeight.bold, ), ), ], ), ), Form( key: _formKey, child: Center( child: Column( children: [ const SizedBox(height: 20), SizedBox( width: MediaQuery.of(context).size.width * 0.9, child: MyTextField( controller: emailController, hintText: 'Email', obscureText: false, keyboardType: TextInputType.emailAddress, prefixIcon: const Icon(CupertinoIcons.mail_solid), validator: (val) { if (val!.isEmpty) { return 'Please fill in this field'; } else if (!emailRexExp.hasMatch(val)) { return 'Please enter a valid email'; } return null; }), ), const SizedBox(height: 10), SizedBox( width: MediaQuery.of(context).size.width * 0.9, child: MyTextField( controller: passwordController, hintText: 'Password', obscureText: obscurePassword, keyboardType: TextInputType.visiblePassword, prefixIcon: const Icon(CupertinoIcons.lock_fill), onChanged: (val) { if (val!.contains(RegExp(r'[A-Z]'))) { setState(() { containsUpperCase = true; }); } else { setState(() { containsUpperCase = false; }); } if (val.contains(RegExp(r'[a-z]'))) { setState(() { containsLowerCase = true; }); } else { setState(() { containsLowerCase = false; }); } if (val.contains(RegExp(r'[0-9]'))) { setState(() { containsNumber = true; }); } else { setState(() { containsNumber = false; }); } if (val.contains(specialCharRexExp)) { setState(() { containsSpecialChar = true; }); } else { setState(() { containsSpecialChar = false; }); } if (val.length >= 8) { setState(() { contains8Length = true; }); } else { setState(() { contains8Length = false; }); } return null; }, suffixIcon: IconButton( onPressed: () { setState(() { obscurePassword = !obscurePassword; if (obscurePassword) { iconPassword = CupertinoIcons.eye_fill; } else { iconPassword = CupertinoIcons.eye_slash_fill; } }); }, icon: Icon(iconPassword), ), validator: (val) { if (val!.isEmpty) { return 'Please fill in this field'; } else if (!passwordRexExp.hasMatch(val)) { return 'Please enter a valid password'; } return null; }), ), const SizedBox(height: 10), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.start, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "⚈ 1 uppercase", style: TextStyle( color: containsUpperCase ? Colors.green : Theme.of(context) .colorScheme .onBackground), ), Text( "⚈ 1 lowercase", style: TextStyle( color: containsLowerCase ? Colors.green : Theme.of(context) .colorScheme .onBackground), ), ], ), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "⚈ 8 minimum character", style: TextStyle( color: contains8Length ? Colors.green : Theme.of(context) .colorScheme .onBackground), ), Text( "⚈ 1 number", style: TextStyle( color: containsNumber ? Colors.green : Theme.of(context) .colorScheme .onBackground), ), ], ), ], ), const SizedBox(height: 10), SizedBox( width: MediaQuery.of(context).size.width * 0.9, child: MyTextField( labelText: 'Nombre', controller: nameController, hintText: 'Ingresa tu nombre', obscureText: false, keyboardType: TextInputType.name, prefixIcon: const Icon(CupertinoIcons.person_fill), validator: (val) { if (val!.isEmpty) { return 'Please fill in this field'; } else if (val.length > 30) { return 'Name too long'; } return null; },), ), SizedBox(height: MediaQuery.of(context).size.height * 0.02), !signUpRequired ? SizedBox( width: MediaQuery.of(context).size.width * 0.5, child: GeneralPrimaryButton( label: 'Registrarme', onPressed: () { if (_formKey.currentState!.validate()) { MyUser myUser = MyUser.empty; myUser = myUser.copyWith( email: emailController.text, name: nameController.text, ); setState(() { context.read().add(SignUpRequired( myUser, passwordController.text)); }); } }, ), ) : const CircularProgressIndicator(), ], ), ), ), ], ), ); } }