fix login con database
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
import 'home_screen_placeholder.dart'; // 📍 Ajusta las carpetas '../' según la ubicación exacta en tu proyecto
|
||||
import '../../../../core/network/mysql_service.dart'; // 📍 Ajusta las carpetas '../' según tu proyecto
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import '../../../../core/router/app_router.dart'; // 📍 Importación de rutas verificada
|
||||
import '../../../../core/router/app_router.dart';
|
||||
|
||||
import '../../../../core/theme/app_theme.dart';
|
||||
import '../bloc/auth_bloc.dart';
|
||||
import '../bloc/auth_event.dart';
|
||||
import '../bloc/auth_state.dart';
|
||||
import '../widgets/privacy_notice_card.dart';
|
||||
|
||||
@@ -19,8 +20,10 @@ class LoginScreen extends StatefulWidget {
|
||||
class _LoginScreenState extends State<LoginScreen>
|
||||
with SingleTickerProviderStateMixin {
|
||||
final _formKey = GlobalKey<FormState>();
|
||||
final _identifierController = TextEditingController();
|
||||
final _passwordController = TextEditingController();
|
||||
final _identifierController =
|
||||
TextEditingController(); // Controlador para el correo
|
||||
final _passwordController =
|
||||
TextEditingController(); // Controlador para la contraseña
|
||||
|
||||
bool _obscurePassword = true;
|
||||
|
||||
@@ -50,14 +53,76 @@ class _LoginScreenState extends State<LoginScreen>
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _submit(BuildContext context) {
|
||||
// 📍 CONSULTA REAL SELECT A TU TABLA DE MYSQL
|
||||
void _submit(BuildContext context) async {
|
||||
if (_formKey.currentState?.validate() ?? false) {
|
||||
context.read<AuthBloc>().add(
|
||||
AuthLoginRequested(
|
||||
identifier: _identifierController.text.trim(),
|
||||
password: _passwordController.text,
|
||||
),
|
||||
try {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text('Validando credenciales en MySQL Celaya...')),
|
||||
);
|
||||
|
||||
// 1. Obtener la conexión por el cable USB Mapped
|
||||
final conn = await MySqlService().getConnection();
|
||||
|
||||
// 2. Ejecutar la búsqueda con los nombres exactos de tus columnas
|
||||
|
||||
// 2. Modificamos el SELECT para buscar SOLO por email
|
||||
final result = await conn.execute(
|
||||
"SELECT email, contrasena_hash, rol FROM usuarios WHERE email = :email",
|
||||
{
|
||||
"email": _identifierController.text.trim(),
|
||||
},
|
||||
);
|
||||
|
||||
if (!mounted) return;
|
||||
|
||||
if (result.rows.isNotEmpty) {
|
||||
final usuarioEncontrado = result.rows.first.assoc();
|
||||
final contrasenaEnBd = usuarioEncontrado['contrasena_hash'];
|
||||
final email = usuarioEncontrado['email'];
|
||||
final rol = usuarioEncontrado['rol'];
|
||||
|
||||
// 3. Validamos la contraseña directamente en Flutter comparando textos limpios
|
||||
if (contrasenaEnBd?.trim() == _passwordController.text.trim()) {
|
||||
|
||||
if (!mounted) return;
|
||||
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text("¡Bienvenido de nuevo, $email ($rol)!")),
|
||||
);
|
||||
|
||||
// 📍 CORRECCIÓN DEFINITIVA: Usamos GoRouter nativo en lugar de Navigator
|
||||
// Esto elimina por completo el conflicto de aserción en el árbol de widgets
|
||||
context.go('/home?colonia=Centro');
|
||||
|
||||
} else {
|
||||
// Contraseña mal mapeada en la BD
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text('Contraseña incorrecta para este usuario'),
|
||||
backgroundColor: Colors.orange),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// El correo de plano no existe en MySQL Workbench
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text('El correo electrónico no está registrado'),
|
||||
backgroundColor: Colors.orange),
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
if (!mounted) return;
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
"Error al conectar con MySQL: $e"), // 📍 CORREGIDO: Sin contra-barra para que pinte el error real
|
||||
backgroundColor: Colors.red,
|
||||
duration: const Duration(seconds: 5),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,15 +200,11 @@ class _LoginScreenState extends State<LoginScreen>
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: const [
|
||||
Text(
|
||||
'Bienvenido a WasteNotify',
|
||||
style: TextStyle(fontSize: 26, fontWeight: FontWeight.bold),
|
||||
),
|
||||
Text('Bienvenido a WasteNotify',
|
||||
style: TextStyle(fontSize: 26, fontWeight: FontWeight.bold)),
|
||||
SizedBox(height: 8),
|
||||
Text(
|
||||
'Inicia sesión para continuar',
|
||||
style: TextStyle(fontSize: 14, color: Colors.grey),
|
||||
),
|
||||
Text('Inicia sesión para continuar',
|
||||
style: TextStyle(fontSize: 14, color: Colors.grey)),
|
||||
],
|
||||
);
|
||||
}
|
||||
@@ -256,4 +317,4 @@ class _LoginScreenState extends State<LoginScreen>
|
||||
|
||||
// Placeholders para evitar errores si no están definidos
|
||||
Widget _buildDemoHint() => const SizedBox.shrink();
|
||||
} // 📍
|
||||
} // 📍 Cierre de la clase _LoginScreenState
|
||||
|
||||
Reference in New Issue
Block a user