|
@@ -1,9 +1,11 @@
|
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
|
+import '../../models/models.dart';
|
|
|
import '../../themes/themes.dart';
|
|
|
import '../../viewmodels/viewmodels.dart';
|
|
|
import '../../widgets/widgets.dart';
|
|
|
+import '../home/home_screen.dart';
|
|
|
|
|
|
class LoginScreen extends StatefulWidget {
|
|
|
const LoginScreen({Key? key}) : super(key: key);
|
|
@@ -14,24 +16,48 @@ class LoginScreen extends StatefulWidget {
|
|
|
|
|
|
class _LoginScreenState extends State<LoginScreen> {
|
|
|
final _correo = TextEditingController();
|
|
|
- final _pass = TextEditingController();
|
|
|
+ Sucursal? _selectedSucursal;
|
|
|
|
|
|
@override
|
|
|
void dispose() {
|
|
|
super.dispose();
|
|
|
_correo.dispose();
|
|
|
- _pass.dispose();
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void initState() {
|
|
|
+ super.initState();
|
|
|
+
|
|
|
+ WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
+ final sucursalViewModel =
|
|
|
+ Provider.of<SucursalViewModel>(context, listen: false);
|
|
|
+ sucursalViewModel.sincronizarSucursales().then((_) {
|
|
|
+ setState(() {
|
|
|
+ final sucursales = sucursalViewModel.sucursales;
|
|
|
+ _selectedSucursal = sucursales.firstWhere(
|
|
|
+ (sucursal) => sucursal.seleccionado == 1,
|
|
|
+ orElse: () => sucursales.isNotEmpty ? sucursales[0] : Sucursal(),
|
|
|
+ );
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ Provider.of<PermisoViewModel>(context, listen: false)
|
|
|
+ .sincronizarPermisos();
|
|
|
+ Provider.of<UsuarioViewModel>(context, listen: false)
|
|
|
+ .sincronizarUsuarios();
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
Widget build(BuildContext context) {
|
|
|
final size = MediaQuery.sizeOf(context);
|
|
|
final loginViewModel = Provider.of<LoginViewModel>(context);
|
|
|
- final obscureText = loginViewModel.obscureText;
|
|
|
+ final sucursalViewModel = Provider.of<SucursalViewModel>(context);
|
|
|
+ final sucursales = sucursalViewModel.sucursales;
|
|
|
final errores = loginViewModel.errores;
|
|
|
|
|
|
return Scaffold(
|
|
|
- backgroundColor: Color.fromRGBO(245, 245, 245, 1),
|
|
|
+ backgroundColor: const Color.fromRGBO(245, 245, 245, 1),
|
|
|
body: SingleChildScrollView(
|
|
|
child: Padding(
|
|
|
padding: const EdgeInsets.all(8.0),
|
|
@@ -49,6 +75,7 @@ class _LoginScreenState extends State<LoginScreen> {
|
|
|
textAlign: TextAlign.center,
|
|
|
),
|
|
|
const SizedBox(height: 20),
|
|
|
+ // Campo de correo
|
|
|
SizedBox(
|
|
|
width: size.width < 1200 ? size.width : size.width * .35,
|
|
|
child: Card(
|
|
@@ -59,7 +86,26 @@ class _LoginScreenState extends State<LoginScreen> {
|
|
|
padding: const EdgeInsets.all(15),
|
|
|
child: Column(
|
|
|
children: [
|
|
|
- //CORREO ELECTRONICO
|
|
|
+ AppDropdownModel<Sucursal>(
|
|
|
+ etiqueta: 'Seleccione una sucursal',
|
|
|
+ hint: 'Elija una sucursal',
|
|
|
+ selectedValue: _selectedSucursal,
|
|
|
+ onChanged: (Sucursal? newValue) {
|
|
|
+ setState(() {
|
|
|
+ _selectedSucursal = newValue;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ items: sucursales.map((Sucursal sucursal) {
|
|
|
+ return DropdownMenuItem<Sucursal>(
|
|
|
+ value: sucursal,
|
|
|
+ child: Text(
|
|
|
+ sucursal.nombre ?? '',
|
|
|
+ style: const TextStyle(color: Colors.black),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }).toList(),
|
|
|
+ ),
|
|
|
+ const SizedBox(height: 5),
|
|
|
AppTextField(
|
|
|
autofillHints: [AutofillHints.username],
|
|
|
prefixIcon: const Icon(Icons.mail),
|
|
@@ -69,38 +115,13 @@ class _LoginScreenState extends State<LoginScreen> {
|
|
|
controller: _correo,
|
|
|
keyboardType: TextInputType.emailAddress,
|
|
|
),
|
|
|
- const SizedBox(height: 15),
|
|
|
- //CONTRASEÑA
|
|
|
- AppTextField(
|
|
|
- autofillHints: [AutofillHints.newPassword],
|
|
|
- maxLines: 1,
|
|
|
- obscureText: obscureText,
|
|
|
- prefixIcon: const Icon(Icons.lock),
|
|
|
- suffixIcon: IconButton(
|
|
|
- onPressed: () {
|
|
|
- loginViewModel.showPassword();
|
|
|
- },
|
|
|
- icon: obscureText
|
|
|
- ? const Icon(Icons.remove_red_eye_outlined)
|
|
|
- : const Icon(Icons.remove_red_eye),
|
|
|
- ),
|
|
|
- onSubmitted: (v) async {
|
|
|
- if (v.isEmpty) return;
|
|
|
- await loginViewModel.login(
|
|
|
- _correo.text, _pass.text);
|
|
|
- },
|
|
|
- etiqueta: 'Contraseña',
|
|
|
- hintText: 'Introduzca su contraseña',
|
|
|
- errorText: errores?['clave'],
|
|
|
- controller: _pass,
|
|
|
- keyboardType: TextInputType.visiblePassword,
|
|
|
- ),
|
|
|
],
|
|
|
),
|
|
|
),
|
|
|
),
|
|
|
),
|
|
|
const SizedBox(height: 20),
|
|
|
+ // Botón de login
|
|
|
Align(
|
|
|
alignment: Alignment.center,
|
|
|
child: SizedBox(
|
|
@@ -117,35 +138,47 @@ class _LoginScreenState extends State<LoginScreen> {
|
|
|
MaterialStatePropertyAll(AppTheme.secondary),
|
|
|
),
|
|
|
onPressed: () async {
|
|
|
- await loginViewModel.login(_correo.text, _pass.text);
|
|
|
- String mensaje = "";
|
|
|
- if (loginViewModel.errores!["correo"] != null) {
|
|
|
- mensaje += "\n${loginViewModel.errores!["correo"]}";
|
|
|
- }
|
|
|
- if (loginViewModel.errores!["pass"] != null) {
|
|
|
- mensaje += "\n${loginViewModel.errores!["pass"]}";
|
|
|
- }
|
|
|
- if (mensaje.isNotEmpty && context.mounted) {
|
|
|
- return showDialog(
|
|
|
- context: context,
|
|
|
- builder: (context) {
|
|
|
- return AlertDialog(
|
|
|
- title: const Text("Alerta"),
|
|
|
- content: Text(mensaje),
|
|
|
- actions: [
|
|
|
- Row(children: [
|
|
|
- Expanded(
|
|
|
- child: TextButton(
|
|
|
- onPressed: () async {
|
|
|
- Navigator.pop(context);
|
|
|
- },
|
|
|
- child: const Text('Continuar'),
|
|
|
- ))
|
|
|
- ])
|
|
|
- ],
|
|
|
- );
|
|
|
- },
|
|
|
+ await loginViewModel.login(_correo.text);
|
|
|
+
|
|
|
+ if (loginViewModel.status == Status.authenticated) {
|
|
|
+ // Actualizar la sucursal seleccionada si el login es exitoso
|
|
|
+ if (_selectedSucursal != null) {
|
|
|
+ await sucursalViewModel
|
|
|
+ .setSelectedSucursal(_selectedSucursal!);
|
|
|
+ }
|
|
|
+
|
|
|
+ Navigator.pushReplacement(
|
|
|
+ context,
|
|
|
+ MaterialPageRoute(
|
|
|
+ builder: (context) => const HomeScreen()),
|
|
|
);
|
|
|
+ } else {
|
|
|
+ String mensaje = "";
|
|
|
+ if (loginViewModel.errores?["correo"] != null) {
|
|
|
+ mensaje += "\n${loginViewModel.errores!["correo"]}";
|
|
|
+ }
|
|
|
+ if (mensaje.isNotEmpty && context.mounted) {
|
|
|
+ return showDialog(
|
|
|
+ context: context,
|
|
|
+ builder: (context) {
|
|
|
+ return AlertDialog(
|
|
|
+ title: const Text("Alerta"),
|
|
|
+ content: Text(mensaje),
|
|
|
+ actions: [
|
|
|
+ Row(children: [
|
|
|
+ Expanded(
|
|
|
+ child: TextButton(
|
|
|
+ onPressed: () async {
|
|
|
+ Navigator.pop(context);
|
|
|
+ },
|
|
|
+ child: const Text('Continuar'),
|
|
|
+ ))
|
|
|
+ ])
|
|
|
+ ],
|
|
|
+ );
|
|
|
+ },
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
child: const Row(
|