diff --git a/lib/main.dart b/lib/main.dart index 5f498a3..ca34cc4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,9 +6,9 @@ import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/providers/user_provider.dart'; import 'package:prosappco/src/screens/calendar.dart'; import 'package:prosappco/src/screens/city.dart'; -import 'package:prosappco/src/screens/login.dart'; +import 'package:prosappco/src/screens/login/login.dart'; import 'package:firebase_core/firebase_core.dart'; -import 'package:prosappco/src/screens/login_email.dart'; +import 'package:prosappco/src/screens/login/login_email.dart'; import 'package:prosappco/src/screens/my_services.dart'; import 'package:prosappco/src/screens/my_services_pro.dart'; import 'package:prosappco/src/screens/new_number.dart'; @@ -18,8 +18,9 @@ import 'package:prosappco/src/screens/professional_profile.dart'; import 'package:prosappco/src/screens/professional_revision.dart'; import 'package:prosappco/src/screens/profile.dart'; import 'package:prosappco/src/screens/profile_pro.dart'; -import 'package:prosappco/src/screens/register.dart'; +import 'package:prosappco/src/screens/register/register.dart'; import 'package:prosappco/src/screens/request_sent.dart'; +import 'package:prosappco/src/screens/reset_password/reset_password.dart'; import 'package:prosappco/src/screens/service.dart'; import 'package:prosappco/src/screens/solicitudes.dart'; import 'package:prosappco/src/services/local_notifications.dart'; @@ -82,7 +83,11 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MultiProvider( - providers: [ChangeNotifierProvider(create: (_) => UserProvider())], + providers: [ + ChangeNotifierProvider( + create: (_) => UserProvider(), + ), + ], child: GetMaterialApp( theme: ThemeData(fontFamily: 'Poppins'), debugShowCheckedModeBanner: false, @@ -108,6 +113,7 @@ class MyApp extends StatelessWidget { '/solicitud': (context) => SolicitudScreen(), '/misserviciospro': (context) => MyServicesProScreen(), '/misservicios': (context) => MyServicesScreen(), + '/resetpassword': (context) => const ResetPasswordScreen(), }, onGenerateRoute: (settings) { throw Exception('Ruta desconocida: ${settings.name}'); diff --git a/lib/src/authentication/authentication_repository.dart b/lib/src/authentication/authentication_repository.dart index 5579550..9c2b8b9 100644 --- a/lib/src/authentication/authentication_repository.dart +++ b/lib/src/authentication/authentication_repository.dart @@ -4,7 +4,7 @@ import 'package:get/get.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:prosappco/src/authentication/exceptions/register_failed.dart'; import 'package:prosappco/src/models/event_model.dart'; -import 'package:prosappco/src/screens/login.dart'; +import 'package:prosappco/src/screens/login/login.dart'; import 'package:prosappco/src/screens/service.dart'; class AuthenticationRepository extends GetxController { diff --git a/lib/src/screens/login.dart b/lib/src/screens/login/login.dart similarity index 100% rename from lib/src/screens/login.dart rename to lib/src/screens/login/login.dart diff --git a/lib/src/screens/login_email.dart b/lib/src/screens/login/login_email.dart similarity index 99% rename from lib/src/screens/login_email.dart rename to lib/src/screens/login/login_email.dart index 48324ce..e9ada9a 100644 --- a/lib/src/screens/login_email.dart +++ b/lib/src/screens/login/login_email.dart @@ -229,7 +229,7 @@ class _LoginEmailScreenState extends State { padding: const EdgeInsets.symmetric(vertical: 20), child: TextButton( onPressed: () { - // Agrega aquí la lógica para manejar la recuperación de contraseña + Navigator.pushNamed(context, '/resetpassword'); }, child: const Text( 'Olvidé la contraseña', diff --git a/lib/src/screens/profile.dart b/lib/src/screens/profile.dart index 565a323..0c279a2 100644 --- a/lib/src/screens/profile.dart +++ b/lib/src/screens/profile.dart @@ -426,7 +426,7 @@ class _ProfileScreenState extends State { @override Widget build(BuildContext context) { - final userProvider = Provider.of(context); + // final userProvider = Provider.of(context); String city = _ciudad.toString(); return Scaffold( diff --git a/lib/src/screens/register.dart b/lib/src/screens/register/register.dart similarity index 99% rename from lib/src/screens/register.dart rename to lib/src/screens/register/register.dart index 14159dc..cee3dea 100644 --- a/lib/src/screens/register.dart +++ b/lib/src/screens/register/register.dart @@ -9,7 +9,7 @@ import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/components/primary_btn.dart'; import 'package:prosappco/src/controllers/register_controller.dart'; import 'package:prosappco/src/models/setting_model.dart'; -import 'package:prosappco/src/screens/login.dart'; +import 'package:prosappco/src/screens/login/login.dart'; import 'package:prosappco/src/screens/web_view.dart'; import 'package:responsive_builder/responsive_builder.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/src/screens/reset_password/reset_password.dart b/lib/src/screens/reset_password/reset_password.dart new file mode 100644 index 0000000..8402ab8 --- /dev/null +++ b/lib/src/screens/reset_password/reset_password.dart @@ -0,0 +1,126 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:prosappco/src/components/pop_appbar.dart'; +import 'package:prosappco/src/components/primary_btn.dart'; +import 'package:prosappco/src/controllers/login_email_controller.dart'; + +class ResetPasswordScreen extends StatelessWidget { + const ResetPasswordScreen({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(LoginEmailController()); + + return Scaffold( + appBar: PopAppbar( + onPressed: () { + Navigator.pop(context); + }, + label: 'Restablecer Contraseña'), + body: SafeArea( + child: GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Center( + child: Container( + padding: const EdgeInsets.all(15), + color: Colors.transparent, + width: MediaQuery.of(context).size.width * 0.9, + child: Column( + children: [ + const SizedBox(height: 20), + const Text( + 'Restablecer contraseña', + style: TextStyle(fontWeight: FontWeight.w800, fontSize: 25), + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + const Text( + 'Ingresa ingresa tu correo electrónico y te enviaremos un enlace para restablecer tu contraseña', + style: TextStyle(color: Colors.grey, fontSize: 12), + textAlign: TextAlign.center, + ), + const SizedBox(height: 40), + const Padding( + padding: EdgeInsets.only(bottom: 5), + child: Align( + alignment: Alignment.topLeft, + child: Text('Email', + style: TextStyle( + fontSize: 18.0, color: Color(0xFF65676B))), + ), + ), + TextFormField( + controller: controller.email, + validator: (String? value) { + if (value == null || value.isEmpty) { + return 'Por favor, ingresa un Email'; + } + final RegExp emailRegExp = + RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); + if (!emailRegExp.hasMatch(value)) { + return 'Por favor, ingresa un Email válido'; + } + return null; + }, + decoration: const InputDecoration( + border: OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFFECECEC)), + borderRadius: BorderRadius.all( + Radius.circular(50), + )), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFFECECEC)), + borderRadius: BorderRadius.all( + Radius.circular(50), + )), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFFECECEC)), + borderRadius: BorderRadius.all( + Radius.circular(50), + )), + errorBorder: OutlineInputBorder( + borderSide: + BorderSide(color: Color.fromARGB(255, 184, 0, 0)), + borderRadius: BorderRadius.all( + Radius.circular(50), + )), + hintText: 'Hello@gmail.com', + fillColor: Color.fromARGB(255, 239, 239, 239), + filled: true, + prefixIcon: Icon(Icons.email_outlined), + hintStyle: TextStyle( + color: Colors.grey, + ), + ), + ), + const SizedBox(height: 80), + PrimaryButtom( + onPressed: () async { + try { + await FirebaseAuth.instance.sendPasswordResetEmail( + email: controller.email.text.trim()); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'Se ha enviado un enlace de restablecimiento de contraseña a tu correo electrónico.'), + ), + ); + Navigator.pop(context); + } catch (e) { + ScaffoldMessenger.of(context) + .showSnackBar(const SnackBar( + content: Text( + 'Hubo un error al enviar el enlace de restablecimiento de contraseña.'), + )); + } + }, + label: 'Enviar'), + ], + ), + ), + ), + )), + ); + } +} diff --git a/lib/src/screens/service.dart b/lib/src/screens/service.dart index 52792c5..95cf0eb 100644 --- a/lib/src/screens/service.dart +++ b/lib/src/screens/service.dart @@ -261,7 +261,7 @@ class _ServiceScreenState extends State { } void _checkForUpdate(String? settings) { - if (appVersion != settings) { + if (appVersion == settings) { showDialog( context: context, builder: (context) {