Sfoglia il codice sorgente

Utilización SessionStorage para mantener sesión iniciada

OscarGil03 6 mesi fa
parent
commit
fd910044da

+ 6 - 1
lib/data/session/session_storage.dart

@@ -14,7 +14,7 @@ class SessionStorage {
     final preferences = await _getPreferences();
     await preferences.setInt('id', id);
   }
-  
+
   Future<void> saveCorreo(String value) async {
     final preferences = await _getPreferences();
     await preferences.setString('correo', value);
@@ -59,4 +59,9 @@ class SessionStorage {
     final preferences = await _getPreferences();
     await preferences.remove('token');
   }
+
+  Future<void> clearId() async {
+    final preferences = await _getPreferences();
+    await preferences.remove('id');
+  }
 }

+ 3 - 3
lib/models/categoria_producto_model.dart

@@ -17,9 +17,9 @@ class CategoriaProducto extends Basico {
 
   @override
   Map<String, dynamic> toJson() {
-    print("Convirtiendo Producto a JSON");
-    print("ID: $id, descripcion: $descripcion, Nombre: $nombre");
-    print("creado: $creado, modificado: $modificado, eliminado: $eliminado");
+    // print("Convirtiendo Producto a JSON");
+    // print("ID: $id, descripcion: $descripcion, Nombre: $nombre");
+    // print("creado: $creado, modificado: $modificado, eliminado: $eliminado");
 
     return {
       'id': id,

+ 6 - 6
lib/models/producto_model.dart

@@ -38,12 +38,12 @@ class Producto extends Basico {
 
   @override
   Map<String, dynamic> toJson() {
-    print("Convirtiendo Producto a JSON");
-    print("ID: $id, Categoria: $idCategoria, Nombre: $nombre");
-    print("Descripcion: $descripcion, imagen: $imagen, venta: $venta");
-    print("existencia: $existencia, precio: $precio, verMenu: $verMenu");
-    print("codigo: $codigo, descuento: $descuento, creado: $creado");
-    print("eliminado: $eliminado, modificado: $modificado");
+    // print("Convirtiendo Producto a JSON");
+    // print("ID: $id, Categoria: $idCategoria, Nombre: $nombre");
+    // print("Descripcion: $descripcion, imagen: $imagen, venta: $venta");
+    // print("existencia: $existencia, precio: $precio, verMenu: $verMenu");
+    // print("codigo: $codigo, descuento: $descuento, creado: $creado");
+    // print("eliminado: $eliminado, modificado: $modificado");
 
     return {
       'id': id,

+ 4 - 1
lib/services/repo_service.dart

@@ -1057,7 +1057,10 @@ class RepoService<T> {
         orElse: () => Usuario(),
       );
 
-      if (usuarioLocal.id != 0) {
+      if (usuarioLocal.id != 0 &&
+          usuarioApi.modificado != null &&
+          (usuarioLocal.modificado == null ||
+              usuarioApi.modificado!.isAfter(usuarioLocal.modificado!))) {
         await RepoService().guardar(usuarioApi);
         await _guardarPermisosUsuario(db, usuarioApi.id!, usuarioApi.permisos!);
       } else {

+ 33 - 3
lib/viewmodels/login_view_model.dart

@@ -1,4 +1,5 @@
 import 'package:flutter/material.dart';
+import '../data/session/session_storage.dart'; // Asegúrate de importar SessionStorage
 import '../models/models.dart';
 import '../services/login_service.dart';
 import '../services/services.dart';
@@ -13,6 +14,9 @@ class LoginViewModel extends ChangeNotifier {
   bool _obscureText = true;
   Usuario? _usuario;
   int? _idUsuario;
+  bool _isLoading = true; // Indica si está verificando la sesión
+
+  bool get isLoading => _isLoading; // Getter para el estado de carga
 
   // Getters
   Usuario? get usuario => _usuario;
@@ -36,6 +40,11 @@ class LoginViewModel extends ChangeNotifier {
         _status = Status.authenticated;
         _errores = null;
         _idUsuario = usuario.id;
+
+        // Guardar el id del usuario en SessionStorage
+        await SessionStorage().saveId(_idUsuario!);
+        print("ID guardado en SharedPreferences: $_idUsuario");
+
         notifyListeners();
       } else {
         print("Correo no válido: $correo");
@@ -51,17 +60,38 @@ class LoginViewModel extends ChangeNotifier {
     }
   }
 
-  void showPassword() {
-    _obscureText = !_obscureText;
+  Future<void> checkSession() async {
+    _isLoading = true; // Inicia el estado de carga
+    notifyListeners();
+
+    int? idUsuarioGuardado = await SessionStorage().getId();
+    if (idUsuarioGuardado != null) {
+      print("Sesión encontrada para el ID de usuario: $idUsuarioGuardado");
+      _idUsuario = idUsuarioGuardado;
+      _status = Status.authenticated;
+    } else {
+      print("No se encontró ninguna sesión activa.");
+      _status = Status.unauthenticated;
+    }
+
+    _isLoading = false; // Termina el estado de carga
     notifyListeners();
   }
 
-  void logOut() {
+  void logOut() async {
     print("Cerrando sesión...");
     _usuario = null;
     _idUsuario = null;
     _status = Status.unauthenticated;
     _errores = {};
+
+    await SessionStorage().clearId();
+    print("ID de usuario eliminado de SharedPreferences.");
+    notifyListeners();
+  }
+
+  void showPassword() {
+    _obscureText = !_obscureText;
     notifyListeners();
   }
 }

+ 4 - 4
lib/viewmodels/producto_view_model.dart

@@ -186,7 +186,7 @@ class ProductoViewModel<T> extends ChangeNotifier {
       final response = ApiResponse(await BaseService()
           .get('/pos/categoria', queryParameters: parametros));
 
-      print(response.resultados);
+      //print(response.resultados);
 
       if (response.isOk && response.resultados != null) {
         List<CategoriaProducto> categoriasApi = response.resultados!
@@ -235,18 +235,18 @@ class ProductoViewModel<T> extends ChangeNotifier {
   }
 
   Future<void> sincronizarProductosYCategorias() async {
-    print('Sincronizando productos');
+    //print('Sincronizando productos');
     setIsLoading(true);
     try {
       bool categoriasSincronizadas = await sincronizarCategorias();
-      print('Categorias sincronizadas: $categoriasSincronizadas');
+      //print('Categorias sincronizadas: $categoriasSincronizadas');
 
       if (categoriasSincronizadas) {
         bool productosSincronizados = await sincronizarProductos();
         if (productosSincronizados) {
           await fetchLocalAll();
         }
-        print('Productos sincronizados: $productosSincronizados');
+        //print('Productos sincronizados: $productosSincronizados');
       }
       notifyListeners();
     } catch (e, stackTrace) {

+ 38 - 15
lib/views/login/login_screen.dart

@@ -28,30 +28,53 @@ class _LoginScreenState extends State<LoginScreen> {
   void initState() {
     super.initState();
 
+    // Verifica la sesión almacenada
     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(),
+      final loginViewModel =
+          Provider.of<LoginViewModel>(context, listen: false);
+
+      // Verificar la sesión
+      loginViewModel.checkSession().then((_) {
+        if (loginViewModel.status == Status.authenticated) {
+          print("Sesión activa detectada, redirigiendo al HomeScreen.");
+          Navigator.pushReplacement(
+            context,
+            MaterialPageRoute(builder: (context) => const HomeScreen()),
           );
-        });
-      });
+        } else {
+          print("No se detectó sesión, mostrando la pantalla de login.");
+          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();
+          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);
+
+    // Mostrar la pantalla de carga `Cargando` mientras verifica la sesión
+    if (loginViewModel.isLoading) {
+      return const Cargando(); // Usa tu widget Cargando aquí
+    }
+
+    final size = MediaQuery.sizeOf(context);
     final sucursalViewModel = Provider.of<SucursalViewModel>(context);
     final sucursales = sucursalViewModel.sucursales;
     final errores = loginViewModel.errores;