24 Ревизии e143f95ffe ... 5c3022dbb0

Автор SHA1 Съобщение Дата
  c90Beretta 5c3022dbb0 Fetch por Categorias on work преди 1 месец
  c90Beretta 3035913b49 horario works преди 1 месец
  c90Beretta d0331f391e Merge remote-tracking branch 'origin/desarrollo' into BRNDEV преди 1 месец
  c90Beretta 90ec430e5a minor fixes преди 1 месец
  c90Beretta f676a93737 Pre work преди 1 месец
  c90Beretta 3ed66e60aa Perfil SCreen on Work преди 2 месеца
  c90Beretta 7632e845af Carrito fixes преди 2 месеца
  c90Beretta c9e89997b1 Veentana de Pedido преди 2 месеца
  c90Beretta a205a18890 Producto Screen on work преди 2 месеца
  c90Beretta 9f29c8f503 Product Screen преди 2 месеца
  c90Beretta 49c4260a9e Minor Fixes преди 2 месеца
  c90Beretta d35a482ab0 Sliver Changes преди 2 месеца
  c90Beretta d581493595 SLiver Child View преди 2 месеца
  c90Beretta 02e38ee78f Vista Cliente преди 2 месеца
  c90Beretta 0ad01a3efb minor fixes преди 2 месеца
  OscarGil03 f51cccea1c Home view model con fetch de categorias y productos por categoria преди 2 месеца
  OscarGil03 fd8f487ac1 Estructura abtstract factory y Cierre de sesion преди 2 месеца
  OscarGil03 e334a3e9ff Merge branch 'master' into OGdev преди 2 месеца
  OscarGil03 bc279f38eb Cerrar sesión преди 2 месеца
  OscarGil03 8251b26aa0 Sincronizacion de categorias, productos y mesas преди 2 месеца
  OscarGil03 492f24b6ce Login funcional преди 2 месеца
  c90Beretta 9bb1be051d Cambio de Estructura преди 2 месеца
  c90Beretta d492881b8b First Commit преди 2 месеца
  OscarGil03 2b4751c79d Primer Commit преди 2 месеца

+ 1 - 2
android/gradle.properties

@@ -1,4 +1,3 @@
 org.gradle.jvmargs=-Xmx4G
 android.useAndroidX=true
-android.enableJetifier=true
-org.gradle.java.home=/opt/homebrew/Cellar/openjdk@17/17.0.14/libexec/openjdk.jdk/Contents/Home
+android.enableJetifier=true

+ 1 - 3
android/gradle/wrapper/gradle-wrapper.properties

@@ -1,7 +1,5 @@
-#Wed Feb 26 19:48:01 MST 2025
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-org.gradle.java.home=/opt/homebrew/Cellar/openjdk@17/17.0.14/libexec/openjdk.jdk/Contents/Home
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip

BIN
assets/props.png


+ 1 - 0
lib/core/models/producto_model.dart

@@ -21,6 +21,7 @@ class Producto extends Basico {
   List<Media>? media;
   int? idWeb;
   String? sincronizado;
+  int? cantidad;
 
   Producto({
     super.id,

+ 4 - 0
lib/main.dart

@@ -4,6 +4,7 @@ import 'package:provider/provider.dart';
 import 'package:sqflite_common_ffi/sqflite_ffi.dart';
 import 'package:turquessa_mesas_hoster/mvvm/views/home/carrito/Recojer_screen.dart';
 import 'package:turquessa_mesas_hoster/mvvm/views/home/carrito/carrito_screen.dart';
+import 'package:turquessa_mesas_hoster/mvvm/views/home/perfil/perfil_screen.dart';
 import 'package:turquessa_mesas_hoster/mvvm/views/home/producto/producto_screen.dart';
 import 'dart:io';
 
@@ -80,7 +81,9 @@ class MyApp extends StatelessWidget {
       locale: const Locale("en", "ES"),
       debugShowCheckedModeBanner: false,
       title: 'Turquessa',
+      // darkTheme: AppTheme.darkTheme,
       theme: AppTheme.lightTheme,
+      // themeMode: ThemeMode.system,
       initialRoute: 'home',
       routes: {
         'login': (context) => const LoginScreen(),
@@ -88,6 +91,7 @@ class MyApp extends StatelessWidget {
         'producto': (context) =>
             ProductScreen(product: Product.staticSandwich()),
         'carrito': (context) => const CarritoScreen(),
+        'perfil': (context) => const PerfilScreen(),
         'Recojer': (context) => const RecojerScreen(),
       },
     );

+ 17 - 0
lib/mvvm/viewmodels/carrito_view_model.dart

@@ -0,0 +1,17 @@
+import 'package:flutter/material.dart';
+import 'package:turquessa_mesas_hoster/core/models/producto_model.dart';
+
+class CarritoViewModel extends ChangeNotifier {
+  List<Producto> _productos = [];
+  int _cantidad = 0;
+
+  List<Producto> get productos => _productos;
+  int get cantidad => _cantidad;
+
+  // void agregarCarrito(Producto producto) {
+  //   int index = _productos.indexWhere((item) => item.id == producto.id);
+  //   if (index >= 0) {
+  //       _productos[index].cantidad += 1;
+  //   }
+  // }
+}

+ 48 - 0
lib/mvvm/viewmodels/home_view_model.dart

@@ -1,3 +1,5 @@
+import 'dart:ffi';
+
 import 'package:flutter/material.dart';
 import 'package:sqflite/sqflite.dart';
 import '../../core/services/reposit_factory.dart';
@@ -5,6 +7,8 @@ import '../../core/services/services.dart';
 import '../../core/models/models.dart';
 
 class HomeViewModel extends ChangeNotifier {
+  //drawer
+  final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
   final Repository<Producto> productoRepository;
   final Repository<CategoriaProducto> categoriaRepository;
 
@@ -12,6 +16,8 @@ class HomeViewModel extends ChangeNotifier {
     required this.productoRepository,
     required this.categoriaRepository,
   });
+  bool _isOpen = false;
+  bool get isopen => _isOpen;
 
   String _busqueda = "";
   String get busqueda => _busqueda;
@@ -79,6 +85,48 @@ class HomeViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
+  void openDrawer() {
+    print(scaffoldKey.currentState);
+    scaffoldKey.currentState?.openDrawer();
+  }
+
+  void closeDrawer() {
+    scaffoldKey.currentState?.closeDrawer();
+  }
+
+  bool isDrawerOpen() {
+    return scaffoldKey.currentState?.isDrawerOpen ?? false;
+  }
+
+  void toggleDrawer() {
+    if (isDrawerOpen()) {
+      closeDrawer();
+    } else {
+      openDrawer();
+    }
+  }
+
+  void isHorarioServicio() {
+    DateTime now = DateTime.now();
+    int hora = now.hour;
+    int minuto = now.minute;
+    int weekday = now.weekday;
+
+// 1 = Lunes, 7 = Domingo
+    bool isOpen = false;
+
+    if (weekday >= 1 && weekday <= 6) {
+      // Lunes a Sábado: 8:00 a.m. - 10:00 p.m.
+      isOpen = (hora >= 8 && hora < 22) || (hora == 22 && minuto == 0);
+    } else if (weekday == 7) {
+      // Domingo: 4:00 p.m. - 10:00 p.m.
+      isOpen = (hora >= 16 && hora < 22) || (hora == 22 && minuto == 0);
+    }
+
+    _isOpen = isOpen;
+    notifyListeners();
+  }
+
   // void nextPage() {
   //   if (_currentPage < totalPages) {
   //     fetchLocal(page: _currentPage + 1);

+ 30 - 0
lib/mvvm/views/home/cateforias_filter_screen.dart

@@ -0,0 +1,30 @@
+import 'package:animate_do/animate_do.dart';
+import 'package:flutter/material.dart';
+import 'package:turquessa_mesas_hoster/utils/themes.dart';
+
+void mostrarCategoriasBottomSheet(BuildContext context) {
+  showModalBottomSheet(
+      context: context,
+      isScrollControlled: true,
+      backgroundColor: AppTheme.primary,
+      builder: (context) => BounceInUp(
+            duration: const Duration(milliseconds: 450),
+            child: Container(
+              height: MediaQuery.of(context).size.height * 0.7,
+              color: AppTheme.primary,
+              decoration: BoxDecoration(
+                color: AppTheme.secondary,
+                borderRadius: const BorderRadius.only(
+                  topLeft: Radius.circular(25),
+                  topRight: Radius.circular(25),
+                ),
+              ),
+              child: SingleChildScrollView(
+                child: Column(
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [],
+                ),
+              ),
+            ),
+          ));
+}

+ 193 - 116
lib/mvvm/views/home/categorias_navbar.dart

@@ -1,7 +1,10 @@
 import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:turquessa_mesas_hoster/mvvm/viewmodels/home_view_model.dart';
 
 class CategoriasNavBar extends StatefulWidget {
-  const CategoriasNavBar({super.key});
+  GlobalKey<ScaffoldState> get scaffoldkey => GlobalKey<ScaffoldState>();
+  const CategoriasNavBar({super.key, required});
 
   @override
   State<CategoriasNavBar> createState() => _CategoriasNavBarState();
@@ -9,123 +12,197 @@ class CategoriasNavBar extends StatefulWidget {
 
 class _CategoriasNavBarState extends State<CategoriasNavBar> {
   @override
+  void initState() {
+    super.initState();
+    WidgetsBinding.instance.addPostFrameCallback((_) {
+      final homeViewModel = Provider.of<HomeViewModel>(context, listen: false);
+    });
+  }
+
+  @override
   Widget build(BuildContext context) {
-    return Column(
-      children: [
-        Container(
-          color: Colors.black,
-          padding: const EdgeInsets.symmetric(vertical: 15),
-          child: Row(
-            children: [
-              const SizedBox(width: 20),
-              const Icon(Icons.search, color: Colors.white, size: 28),
-              const SizedBox(width: 20),
-              const Icon(Icons.menu, color: Colors.white, size: 28),
-              const SizedBox(width: 40),
-              Container(
-                padding: const EdgeInsets.only(bottom: 5),
-                decoration: const BoxDecoration(
-                  border: Border(
-                    bottom: BorderSide(
-                      color: Color.fromARGB(255, 47, 208, 229),
-                      width: 3.0,
-                    ),
-                  ),
-                ),
-                child: const Text(
-                  "Café",
-                  style: TextStyle(
-                    color: Color.fromARGB(255, 47, 208, 229),
-                    fontSize: 18,
-                    fontWeight: FontWeight.bold,
-                  ),
-                ),
-              ),
-              const SizedBox(width: 40),
-              const Text(
-                'Bolsa',
-                style: TextStyle(
-                  color: Colors.white,
-                  fontSize: 18,
-                  fontWeight: FontWeight.bold,
-                ),
-              ),
-              const SizedBox(width: 40),
-              const Text(
-                'Brunch',
-                style: TextStyle(
-                  color: Colors.white,
-                  fontSize: 18,
-                  fontWeight: FontWeight.bold,
-                ),
-              ),
-              const SizedBox(width: 40),
-              const Text(
-                'Desserts',
-                style: TextStyle(
-                  color: Colors.white,
-                  fontSize: 18,
-                  fontWeight: FontWeight.bold,
-                ),
-              ),
-              const SizedBox(width: 40),
-              const Text(
-                'Drinks',
-                style: TextStyle(
-                  color: Colors.white,
-                  fontSize: 18,
-                  fontWeight: FontWeight.bold,
-                ),
-              ),
-              const SizedBox(width: 40),
-              const Text(
-                'Smoothies',
-                style: TextStyle(
-                  color: Colors.white,
-                  fontSize: 18,
-                  fontWeight: FontWeight.bold,
-                ),
-              ),
-              const SizedBox(width: 40),
-              const Text(
-                'Tés',
-                style: TextStyle(
-                  color: Colors.white,
-                  fontSize: 18,
-                  fontWeight: FontWeight.bold,
-                ),
-              ),
-              const SizedBox(width: 40),
-              const Text(
-                'Tisanas',
-                style: TextStyle(
-                  color: Colors.white,
-                  fontSize: 18,
-                  fontWeight: FontWeight.bold,
-                ),
-              ),
-              const SizedBox(width: 40),
-              const Text(
-                'Vip',
-                style: TextStyle(
-                  color: Colors.white,
-                  fontSize: 18,
-                  fontWeight: FontWeight.bold,
-                ),
-              ),
-              const SizedBox(width: 40),
-              const Text(
-                'Libros',
-                style: TextStyle(
-                  color: Colors.white,
-                  fontSize: 18,
-                  fontWeight: FontWeight.bold,
-                ),
-              ),
-            ],
+    final homeViewModel = Provider.of<HomeViewModel>(context, listen: false);
+    return SingleChildScrollView(
+      scrollDirection: Axis.horizontal,
+      child: Column(
+        children: [
+          Container(
+            color: Colors.black,
+            padding: const EdgeInsets.symmetric(vertical: 15),
+            child: Row(
+              children: [
+                const SizedBox(width: 20),
+                const Icon(Icons.search, color: Colors.white, size: 28),
+                const SizedBox(width: 20),
+                GestureDetector(
+                    onTap: () {
+                      homeViewModel.openDrawer();
+                    },
+                    child:
+                        const Icon(Icons.menu, color: Colors.white, size: 28)),
+                const SizedBox(width: 40),
+                //! Menu items
+                homeViewModel.categorias.isEmpty
+                    ? const Center(
+                        child: CircularProgressIndicator(),
+                      )
+                    : Row(
+                        children: homeViewModel.categorias
+                            .map((e) => Padding(
+                                padding:
+                                    const EdgeInsets.symmetric(horizontal: 8),
+                                child: GestureDetector(
+                                  onTap: () {
+                                    homeViewModel.selectCategoria(e);
+                                  },
+                                  child: AnimatedContainer(
+                                    duration: const Duration(milliseconds: 300),
+                                    curve: Curves.easeInOut,
+                                    padding: const EdgeInsets.only(bottom: 5),
+                                    decoration: BoxDecoration(
+                                      border: Border(
+                                        bottom: BorderSide(
+                                          color:
+                                              homeViewModel.selectedCategoria ==
+                                                      e
+                                                  ? const Color.fromARGB(
+                                                      255, 47, 208, 229)
+                                                  : Colors.transparent,
+                                          width:
+                                              homeViewModel.selectedCategoria ==
+                                                      e
+                                                  ? 3.0
+                                                  : 0.0,
+                                        ),
+                                      ),
+                                    ),
+                                    child: AnimatedDefaultTextStyle(
+                                      duration:
+                                          const Duration(milliseconds: 300),
+                                      curve: Curves.easeInOut,
+                                      style: TextStyle(
+                                        color:
+                                            homeViewModel.selectedCategoria == e
+                                                ? const Color.fromARGB(
+                                                    255, 47, 208, 229)
+                                                : Colors.white,
+                                        fontSize:
+                                            homeViewModel.selectedCategoria == e
+                                                ? 20
+                                                : 18,
+                                        fontWeight: FontWeight.bold,
+                                      ),
+                                      child: Text(e.nombre!),
+                                    ),
+                                  ),
+                                )))
+                            .toList(),
+                      ),
+                // Container(
+                //   padding: const EdgeInsets.only(bottom: 5),
+                //   decoration: const BoxDecoration(
+                //     border: Border(
+                //       bottom: BorderSide(
+                //         color: Color.fromARGB(255, 47, 208, 229),
+                //         width: 3.0,
+                //       ),
+                //     ),
+                //   ),
+                //   child: const Text(
+                //     "Café",
+                //     style: TextStyle(
+                //       color: Color.fromARGB(255, 47, 208, 229),
+                //       fontSize: 18,
+                //       fontWeight: FontWeight.bold,
+                //     ),
+                //   ),
+                // ),
+                // const SizedBox(width: 40),
+                // const Text(
+                //   'Bolsa',
+                //   style: TextStyle(
+                //     color: Colors.white,
+                //     fontSize: 18,
+                //     fontWeight: FontWeight.bold,
+                //   ),
+                // ),
+                // const SizedBox(width: 40),
+                // const Text(
+                //   'Brunch',
+                //   style: TextStyle(
+                //     color: Colors.white,
+                //     fontSize: 18,
+                //     fontWeight: FontWeight.bold,
+                //   ),
+                // ),
+                // const SizedBox(width: 40),
+                // const Text(
+                //   'Desserts',
+                //   style: TextStyle(
+                //     color: Colors.white,
+                //     fontSize: 18,
+                //     fontWeight: FontWeight.bold,
+                //   ),
+                // ),
+                // const SizedBox(width: 40),
+                // const Text(
+                //   'Drinks',
+                //   style: TextStyle(
+                //     color: Colors.white,
+                //     fontSize: 18,
+                //     fontWeight: FontWeight.bold,
+                //   ),
+                // ),
+                // const SizedBox(width: 40),
+                // const Text(
+                //   'Smoothies',
+                //   style: TextStyle(
+                //     color: Colors.white,
+                //     fontSize: 18,
+                //     fontWeight: FontWeight.bold,
+                //   ),
+                // ),
+                // const SizedBox(width: 40),
+                // const Text(
+                //   'Tés',
+                //   style: TextStyle(
+                //     color: Colors.white,
+                //     fontSize: 18,
+                //     fontWeight: FontWeight.bold,
+                //   ),
+                // ),
+                // const SizedBox(width: 40),
+                // const Text(
+                //   'Tisanas',
+                //   style: TextStyle(
+                //     color: Colors.white,
+                //     fontSize: 18,
+                //     fontWeight: FontWeight.bold,
+                //   ),
+                // ),
+                // const SizedBox(width: 40),
+                // const Text(
+                //   'Vip',
+                //   style: TextStyle(
+                //     color: Colors.white,
+                //     fontSize: 18,
+                //     fontWeight: FontWeight.bold,
+                //   ),
+                // ),
+                // const SizedBox(width: 40),
+                // const Text(
+                //   'Libros',
+                //   style: TextStyle(
+                //     color: Colors.white,
+                //     fontSize: 18,
+                //     fontWeight: FontWeight.bold,
+                //   ),
+                // ),
+              ],
+            ),
           ),
-        ),
-      ],
+        ],
+      ),
     );
   }
 }

+ 30 - 101
lib/mvvm/views/home/home_screen.dart

@@ -9,93 +9,8 @@ import 'package:turquessa_mesas_hoster/mvvm/views/home/categorias_navbar.dart';
 import 'package:turquessa_mesas_hoster/mvvm/viewmodels/home_view_model.dart';
 import 'package:turquessa_mesas_hoster/utils/widgets/modal_infonegaocio.dart';
 import 'package:turquessa_mesas_hoster/mvvm/views/home/producto/producto_screen.dart';
-
-const List<Map<String, dynamic>> items = [
-  {
-    'nombre': 'Hamburguesa de res',
-    'descripcion': 'Hamburguesa de res con queso cheddar',
-    'precio': '\$ 120.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de res',
-    'descripcion': 'Hamburguesa de res con queso cheddar',
-    'precio': '\$ 120.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-  {
-    'nombre': 'Hamburguesa de pollo',
-    'descripcion': 'Hamburguesa de pollo con queso cheddar',
-    'precio': '\$ 100.00',
-    'imageUrl':
-        'https://cdn.pixabay.com/photo/2016/03/05/19/02/hamburger-1238246_960_720.jpg',
-  },
-];
+import 'package:turquessa_mesas_hoster/utils/widgets/widgets.dart';
+import 'package:turquessa_mesas_hoster/utils/widgets/horario_modal.dart';
 
 class HomeScreen extends StatefulWidget {
   const HomeScreen({Key? key}) : super(key: key);
@@ -111,10 +26,14 @@ class _HomeScreenState extends State<HomeScreen> {
     final homeViewModel = Provider.of<HomeViewModel>(context, listen: false);
     final productoViewModel =
         Provider.of<ProductoViewModel>(context, listen: false);
+    setModalOffService(context);
     WidgetsBinding.instance.addPostFrameCallback((_) {
       Provider.of<ProductoViewModel>(context, listen: false)
           .sincronizarProductosYCategorias();
+      homeViewModel.isHorarioServicio();
       homeViewModel.fetchLocalCategorias();
+      homeViewModel
+          .fetchLocalProductosPorCategoria(homeViewModel.selectedCategoria!);
       productoViewModel.sincronizarProductos();
       productoViewModel.sincronizarCategorias();
       productoViewModel.fetchLocalAll();
@@ -123,9 +42,11 @@ class _HomeScreenState extends State<HomeScreen> {
 
   @override
   Widget build(BuildContext context) {
-    final homeViewModel = Provider.of<HomeViewModel>(context);
-    final pedidoViewModel = Provider.of<ProductoViewModel>(context);
+    final homeViewModel = Provider.of<HomeViewModel>(context, listen: false);
+    final productos = homeViewModel.productos ?? [];
     return Scaffold(
+        key: homeViewModel.scaffoldKey,
+        drawer: const CustomDrawer(),
         bottomNavigationBar: BottomAppBar(
             color: Colors.black,
             child: Row(
@@ -133,7 +54,9 @@ class _HomeScreenState extends State<HomeScreen> {
               children: [
                 IconButton(
                   icon: const Icon(Icons.search, color: Colors.white),
-                  onPressed: () {},
+                  onPressed: () {
+                    homeViewModel.openDrawer();
+                  },
                 ),
                 IconButton(
                   icon: const Icon(Icons.menu, color: Colors.white),
@@ -150,7 +73,9 @@ class _HomeScreenState extends State<HomeScreen> {
                 ),
                 IconButton(
                   icon: const Icon(Icons.favorite_border, color: Colors.white),
-                  onPressed: () {},
+                  onPressed: () {
+                    Navigator.of(context).pushNamed('perfil');
+                  },
                 ),
               ],
             )),
@@ -158,6 +83,7 @@ class _HomeScreenState extends State<HomeScreen> {
         body: CustomScrollView(
           slivers: [
             SliverAppBar(
+              automaticallyImplyLeading: false,
               floating: true,
               expandedHeight: 200, // Ajusta la altura para acomodar la imagen
               flexibleSpace: FlexibleSpaceBar(
@@ -183,7 +109,7 @@ class _HomeScreenState extends State<HomeScreen> {
                           borderRadius: BorderRadius.circular(12),
                         ),
                         child: Center(
-                          child: Image.asset('assets/Turquessa.png'),
+                          child: Image.asset('assets/logo.png'),
                         ),
                       ),
                       const SizedBox(width: 20),
@@ -232,13 +158,17 @@ class _HomeScreenState extends State<HomeScreen> {
             SliverList(
                 delegate: SliverChildBuilderDelegate(
               (context, index) {
-                return _buildBurgerItem(
-                  items[index]['nombre'],
-                  items[index]['descripcion'],
-                  items[index]['precio'],
-                  items[index]['imageUrl'],
-                  context,
-                );
+                productos.isEmpty
+                    ? _buildBurgerItem(
+                        productos[index].nombre!,
+                        productos[index].descripcion!,
+                        productos[index].precio.toString(),
+                        productos[index].media![0].ruta! ?? ' ',
+                        context,
+                      )
+                    : const Center(
+                        child: CircularProgressIndicator(),
+                      );
               },
               childCount: items.length,
             ))
@@ -251,8 +181,7 @@ class CategoriasSliverChild extends SliverPersistentHeaderDelegate {
   @override
   Widget build(
       BuildContext context, double shrinkOffset, bool overlapsContent) {
-    return SingleChildScrollView(
-        scrollDirection: Axis.horizontal, child: CategoriasNavBar());
+    return CategoriasNavBar();
   }
 
   @override

+ 309 - 0
lib/mvvm/views/home/perfil/perfil_screen.dart

@@ -0,0 +1,309 @@
+import 'package:animate_do/animate_do.dart';
+import 'package:flutter/material.dart';
+import 'package:turquessa_mesas_hoster/utils/themes.dart';
+
+class PerfilScreen extends StatefulWidget {
+  const PerfilScreen({super.key});
+
+  @override
+  State<PerfilScreen> createState() => _PerfilScreenState();
+}
+
+class _PerfilScreenState extends State<PerfilScreen> {
+  @override
+  Widget build(BuildContext context) {
+    return SlideInRight(
+      duration: const Duration(milliseconds: 250),
+      child: Scaffold(
+        body: Padding(
+          padding: const EdgeInsets.symmetric(horizontal: 16),
+          child: Column(
+            children: [
+              // Banner principal con fondo azul
+              // Banner principal con fondo azul
+              Container(
+                width: double.infinity,
+                height: 200,
+                decoration: const BoxDecoration(
+                  color: Colors.blue,
+                  borderRadius: BorderRadius.only(
+                    bottomLeft: Radius.circular(20),
+                    bottomRight: Radius.circular(20),
+                  ),
+                ),
+                child: ClipRRect(
+                  // Añadimos ClipRRect para asegurar que nada se salga de los bordes
+                  borderRadius: const BorderRadius.only(
+                    bottomLeft: Radius.circular(20),
+                    bottomRight: Radius.circular(20),
+                  ),
+                  child: Stack(
+                    children: [
+                      // Texto del banner
+                      const Positioned(
+                        left: 20,
+                        top: 60,
+                        child: Column(
+                          crossAxisAlignment: CrossAxisAlignment.start,
+                          children: [
+                            Text(
+                              'Bienvenido!',
+                              style: TextStyle(
+                                fontSize: 28,
+                                fontWeight: FontWeight.bold,
+                                color: Colors.white,
+                              ),
+                            ),
+                            SizedBox(height: 8),
+                            Text(
+                              'Visitanos el día de hoy para una oferta \n especial en productos seleccionados',
+                              style: TextStyle(
+                                fontSize: 24,
+                                fontWeight: FontWeight.bold,
+                                color: Colors.white,
+                              ),
+                            ),
+                          ],
+                        ),
+                      ),
+
+                      // Imagen posicionada en la esquina inferior derecha
+                      Positioned(
+                        right: 0,
+                        bottom: 0,
+                        child: Image.asset(
+                          'assets/props.png',
+                          height: 190,
+                          fit: BoxFit.contain,
+                        ),
+                      ),
+
+                      // Icono de bombilla
+                      Positioned(
+                        right: 80,
+                        top: 60,
+                        child: Container(
+                          padding: const EdgeInsets.all(8),
+                          decoration: const BoxDecoration(
+                            color: Colors.yellow,
+                            shape: BoxShape.circle,
+                          ),
+                          child: const Icon(
+                            Icons.lightbulb,
+                            color: Colors.white,
+                            size: 24,
+                          ),
+                        ),
+                      ),
+                    ],
+                  ),
+                ),
+              ),
+              //? Informaicon de usuario
+              Padding(
+                padding: const EdgeInsets.only(top: 16),
+                child: Container(
+                  width: double.infinity,
+                  padding: const EdgeInsets.all(20),
+                  decoration: BoxDecoration(
+                    color: const Color(0xFFF5F5F5),
+                    borderRadius: BorderRadius.circular(16),
+                  ),
+                  child: Row(
+                    crossAxisAlignment: CrossAxisAlignment.center,
+                    children: [
+                      // Columna izquierda con la información del usuario
+                      Expanded(
+                        child: Column(
+                          crossAxisAlignment: CrossAxisAlignment.start,
+                          children: [
+                            // Nombre del usuario
+                            Text(
+                              'Usuario Conocido',
+                              style: TextStyle(
+                                fontSize: 22,
+                                fontWeight: FontWeight.bold,
+                                color: AppTheme.secondary,
+                              ),
+                            ),
+                            const SizedBox(height: 8),
+                            // Correo electrónico
+                            Text(
+                              'yadidelias@gmail.com',
+                              style: TextStyle(
+                                fontSize: 16,
+                                color: AppTheme.secondary,
+                              ),
+                            ),
+                            const SizedBox(height: 8),
+
+                            // Botón de editar
+                            GestureDetector(
+                              onTap: () {
+                                // Navigator.of(context)
+                                //     .pushNamed('editar-perfil');
+                              },
+                              child: const Text(
+                                'Editar',
+                                style: TextStyle(
+                                  fontSize: 16,
+                                  fontWeight: FontWeight.w500,
+                                  color: Colors.blue,
+                                ),
+                              ),
+                            ),
+                          ],
+                        ),
+                      ),
+                      Container(
+                        width: 80,
+                        height: 80,
+                        child: Image.network(
+                          'https://st4.depositphotos.com/9998432/22597/v/450/depositphotos_225976914-stock-illustration-person-gray-photo-placeholder-man.jpg',
+                          fit: BoxFit.cover,
+                        ),
+                      ),
+                    ],
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.only(top: 16),
+                child: ClipRRect(
+                  borderRadius: BorderRadius.circular(16),
+                  child: Container(
+                    height: 110,
+                    padding: const EdgeInsets.symmetric(horizontal: 16),
+                    width: double.infinity,
+                    color: Colors.white,
+                    child: Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                        children: [
+                          const Row(
+                            children: [
+                              Icon(Icons.nights_stay_rounded, size: 36),
+                              Padding(
+                                padding: EdgeInsets.only(left: 8),
+                                child: Text("Modo oscuro",
+                                    style: TextStyle(
+                                        fontSize: 29,
+                                        fontWeight: FontWeight.bold)),
+                              ),
+                            ],
+                          ),
+                          Switch(
+                            activeColor: Theme.of(context).primaryColor,
+                            value: false,
+                            onChanged: (value) {},
+                          ),
+                        ]),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.only(top: 16),
+                child: ClipRRect(
+                  borderRadius: BorderRadius.circular(16),
+                  child: Container(
+                    height: 110,
+                    padding: const EdgeInsets.symmetric(horizontal: 16),
+                    width: double.infinity,
+                    color: Colors.white,
+                    child: Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                        children: [
+                          const Row(
+                            children: [
+                              Icon(Icons.lock_clock, size: 36),
+                              Padding(
+                                padding: EdgeInsets.only(left: 8),
+                                child: Text("Mis Pedidos",
+                                    style: TextStyle(
+                                        fontSize: 29,
+                                        fontWeight: FontWeight.bold)),
+                              ),
+                            ],
+                          ),
+                          IconButton(
+                              onPressed: () {},
+                              icon:
+                                  const Icon(Icons.arrow_forward_ios_rounded)),
+                        ]),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.only(top: 16),
+                child: ClipRRect(
+                  borderRadius: BorderRadius.circular(16),
+                  child: Container(
+                    height: 110,
+                    padding: const EdgeInsets.symmetric(horizontal: 16),
+                    width: double.infinity,
+                    color: Colors.white,
+                    child: Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                        children: [
+                          const Row(
+                            children: [
+                              Icon(Icons.supervised_user_circle_sharp,
+                                  size: 36),
+                              Padding(
+                                padding: EdgeInsets.only(left: 8),
+                                child: Text("Conoce más de nosotros",
+                                    style: TextStyle(
+                                        fontSize: 29,
+                                        fontWeight: FontWeight.bold)),
+                              ),
+                            ],
+                          ),
+                          IconButton(
+                              onPressed: () {},
+                              icon:
+                                  const Icon(Icons.arrow_forward_ios_rounded)),
+                        ]),
+                  ),
+                ),
+              ),
+              Padding(
+                padding: const EdgeInsets.only(top: 16),
+                child: ClipRRect(
+                  borderRadius: BorderRadius.circular(16),
+                  child: Container(
+                      decoration: BoxDecoration(
+                        color: Colors.white,
+                        borderRadius: BorderRadius.circular(16),
+                        border: Border.all(color: Colors.red, width: 3),
+                      ),
+                      height: 110,
+                      padding: const EdgeInsets.symmetric(horizontal: 16),
+                      width: double.infinity,
+                      child: const Center(
+                        child: Row(
+                          mainAxisAlignment: MainAxisAlignment.center,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          children: [
+                            Icon(
+                              Icons.logout_outlined,
+                              size: 36,
+                              color: Colors.red,
+                            ),
+                            Text(
+                              "Cerrar Perfil",
+                              style: TextStyle(
+                                  fontWeight: FontWeight.bold,
+                                  fontSize: 30,
+                                  color: Colors.red),
+                            ),
+                          ],
+                        ),
+                      )),
+                ),
+              ),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+}

+ 22 - 22
lib/mvvm/views/home/producto/producto_screen.dart

@@ -1,5 +1,7 @@
 import 'package:flutter/material.dart';
+import 'package:turquessa_mesas_hoster/utils/widgets/widgets.dart';
 
+//Modelo provisional
 class Product {
   final String id;
   final String nombre;
@@ -80,7 +82,6 @@ class _ProductScreenState extends State<ProductScreen> {
 
   void _calculateTotalprecio() {
     double baseprecio = widget.product.precio;
-    // Añadir precio del queso si está seleccionado
     if (_toppingsViewKey.currentState?.isQuesoSelected == true) {
       baseprecio += widget.product.cheeseprecio;
     }
@@ -109,9 +110,9 @@ class _ProductScreenState extends State<ProductScreen> {
         height: 110,
         child: Container(
           padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
-          decoration: BoxDecoration(
+          decoration: const BoxDecoration(
             color: Color.fromARGB(255, 47, 208, 229),
-            borderRadius: const BorderRadius.only(
+            borderRadius: BorderRadius.only(
               topLeft: Radius.circular(25),
               topRight: Radius.circular(25),
             ),
@@ -126,7 +127,7 @@ class _ProductScreenState extends State<ProductScreen> {
                   children: [
                     Container(
                       decoration: BoxDecoration(
-                        color: Color.fromARGB(255, 200, 214, 232),
+                        color: const Color.fromARGB(255, 200, 214, 232),
                         borderRadius: BorderRadius.circular(2),
                       ),
                       child: IconButton(
@@ -142,7 +143,7 @@ class _ProductScreenState extends State<ProductScreen> {
                       color: Colors.white,
                       child: Text(
                         quantity.toString(),
-                        style: TextStyle(
+                        style: const TextStyle(
                           color: Colors.black,
                           fontSize: 20,
                           fontWeight: FontWeight.bold,
@@ -150,7 +151,7 @@ class _ProductScreenState extends State<ProductScreen> {
                       ),
                     ),
                     Container(
-                      color: Color.fromARGB(255, 200, 214, 232),
+                      color: const Color.fromARGB(255, 200, 214, 232),
                       child: IconButton(
                         icon: const Icon(Icons.add),
                         onPressed: () => _updateQuantity(quantity + 1),
@@ -165,8 +166,8 @@ class _ProductScreenState extends State<ProductScreen> {
                     const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
                 color: Colors.black,
                 child: Text(
-                  "MXN ${totalprecio.toStringAsFixed(2)}",
-                  style: TextStyle(
+                  "Agregar MXN ${totalprecio.toStringAsFixed(2)}",
+                  style: const TextStyle(
                     color: Colors.white,
                     fontSize: 20,
                     fontWeight: FontWeight.bold,
@@ -196,7 +197,7 @@ class _ProductScreenState extends State<ProductScreen> {
                 ),
               ),
               Container(
-                height: 350,
+                height: 550,
                 width: double.infinity,
                 decoration: BoxDecoration(
                   borderRadius: const BorderRadius.only(
@@ -216,39 +217,39 @@ class _ProductScreenState extends State<ProductScreen> {
             ]),
             const SizedBox(height: 20),
             Padding(
-              padding: EdgeInsets.symmetric(horizontal: 20),
+              padding: const EdgeInsets.symmetric(horizontal: 20),
               child: Column(
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
                   Text(
                     widget.product.nombre,
-                    style: TextStyle(
+                    style: const TextStyle(
                       color: Colors.black,
                       fontSize: 44,
                       fontWeight: FontWeight.bold,
                     ),
                   ),
-                  SizedBox(height: 10),
+                  const SizedBox(height: 10),
                   Text(
                     widget.product.descripcion,
-                    style: TextStyle(
+                    style: const TextStyle(
                       color: Colors.black,
                       fontSize: 26,
                     ),
                   ),
-                  SizedBox(height: 10),
+                  const SizedBox(height: 10),
                   Text(
                     'MXN ${widget.product.precio.toStringAsFixed(2)}',
-                    style: TextStyle(
+                    style: const TextStyle(
                       color: Colors.black,
                       fontSize: 36,
                       fontWeight: FontWeight.bold,
                     ),
                   ),
-                  Divider(
+                  const Divider(
                     height: 2,
                   ),
-                  SizedBox(height: 10),
+                  const SizedBox(height: 10),
                   ToppingsView(
                     key: _toppingsViewKey,
                     product: widget.product,
@@ -287,7 +288,6 @@ class _ToppingsViewState extends State<ToppingsView> {
   bool isCoccionExpanded = false;
   bool isQuesoExpanded = true;
 
-  // Estado para la selección de queso
   bool isQuesoSelected = false;
 
   // Selecciones actuales
@@ -386,12 +386,12 @@ class _ToppingsViewState extends State<ToppingsView> {
                 ),
                 height: 80,
                 child: TextField(
-                  style: TextStyle(color: Colors.black),
+                  style: const TextStyle(color: Colors.black),
                   maxLines: 3,
                   onChanged: (value) {
                     comments = value;
                   },
-                  decoration: InputDecoration(
+                  decoration: const InputDecoration(
                     contentPadding: EdgeInsets.all(12),
                     border: InputBorder.none,
                     hintText: "Agrega instrucciones especiales...",
@@ -601,7 +601,7 @@ class _ToppingsViewState extends State<ToppingsView> {
             Column(
               crossAxisAlignment: CrossAxisAlignment.start,
               children: [
-                Text(
+                const Text(
                   "Queso amarillo",
                   style: TextStyle(
                     color: Colors.black,
@@ -611,7 +611,7 @@ class _ToppingsViewState extends State<ToppingsView> {
                 ),
                 Text(
                   "+ MXN ${widget.product.cheeseprecio.toStringAsFixed(2)}",
-                  style: TextStyle(
+                  style: const TextStyle(
                     color: Colors.black,
                     fontSize: 16,
                   ),

+ 33 - 18
lib/utils/themes.dart

@@ -2,16 +2,17 @@ import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 
 class AppTheme {
+  // Colores base
   static Color primary = const Color(0xFF32D7ED);
   static Color secondary = Colors.black;
   static Color tertiary = const Color(0xFF242424);
   static Color quaternary = const Color(0xFFF1F1F3);
   static Color verde = const Color(0xff248f83);
   static Color rojo = const Color(0xFFF24B59);
+
+  // Tema Claro
   static ThemeData lightTheme = ThemeData.light().copyWith(
-    //Scaffold
     scaffoldBackgroundColor: const Color(0xFFE0E0E0),
-    //Tema de AppBar
     appBarTheme: AppBarTheme(
       color: primary,
       foregroundColor: secondary,
@@ -19,31 +20,45 @@ class AppTheme {
         statusBarColor: primary,
         statusBarIconBrightness: Brightness.dark,
       ),
-      iconTheme: IconThemeData(
-        color: secondary,
-      ),
+      iconTheme: IconThemeData(color: secondary),
     ),
-    //Tema de floatingActionButton
     floatingActionButtonTheme: FloatingActionButtonThemeData(
       backgroundColor: primary,
       foregroundColor: secondary,
     ),
-    //Tema de progressIndicator
     progressIndicatorTheme: ProgressIndicatorThemeData(color: tertiary),
-    //Tema de DatePicker
     datePickerTheme: DatePickerThemeData(
-      inputDecorationTheme: InputDecorationTheme(
-          //labelStyle: GoogleFonts.greatVibes(), // Input label
-          ),
-      backgroundColor: const Color(0xFFDBDBDB), //secondary,
+      backgroundColor: const Color(0xFFDBDBDB),
+      headerBackgroundColor: primary,
+      todayBackgroundColor: const MaterialStatePropertyAll(Color(0xFFDBDBDB)),
+      todayForegroundColor: const MaterialStatePropertyAll(Colors.black),
+      rangePickerBackgroundColor: secondary,
+    ),
+  );
+
+  //  **Tema Oscuro**
+  static ThemeData darkTheme = ThemeData.dark().copyWith(
+    scaffoldBackgroundColor: const Color(0xFF121212),
+    appBarTheme: AppBarTheme(
+      color: tertiary, // Un gris oscuro
+      foregroundColor: Colors.white,
+      systemOverlayStyle: SystemUiOverlayStyle(
+        statusBarColor: tertiary,
+        statusBarIconBrightness: Brightness.light,
+      ),
+      iconTheme: const IconThemeData(color: Colors.white),
+    ),
+    floatingActionButtonTheme: FloatingActionButtonThemeData(
+      backgroundColor: primary,
+      foregroundColor: Colors.black,
+    ),
+    progressIndicatorTheme: ProgressIndicatorThemeData(color: primary),
+    datePickerTheme: DatePickerThemeData(
+      backgroundColor: tertiary,
       headerBackgroundColor: primary,
-      todayBackgroundColor:
-          const MaterialStatePropertyAll(Color(0xFFDBDBDB)), //primary
-      todayForegroundColor:
-          const MaterialStatePropertyAll(Color.fromARGB(255, 0, 0, 0)),
+      todayBackgroundColor: const MaterialStatePropertyAll(Colors.white24),
+      todayForegroundColor: const MaterialStatePropertyAll(Colors.white),
       rangePickerBackgroundColor: secondary,
-      // dayOverlayColor: MaterialStatePropertyAll(primary),
-      //headerHelpStyle: const TextStyle(fontSize: 18),
     ),
   );
 }

+ 298 - 90
lib/utils/widgets/app_drawer.dart

@@ -1,110 +1,318 @@
-// ignore_for_file: must_be_immutable
-
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
-import '../../core/models/models.dart';
-import '../../core/services/services.dart';
-import '../themes.dart';
-import '../../mvvm/viewmodels/login_view_model.dart';
-import 'widgets_components.dart';
+import 'package:turquessa_mesas_hoster/mvvm/viewmodels/home_view_model.dart';
 
-class AppDrawer extends StatelessWidget {
-  AppDrawer({super.key});
-
-  Future<bool> _showExitConfirmationDialog(BuildContext context) async {
-    bool shouldPop = false;
-    await showDialog(
-      context: context,
-      builder: (context) => AlertDialog(
-        surfaceTintColor: AppTheme.secondary,
-        title: const Text('¿Cerrar sesión?'),
-        content: const Text('¿Estás seguro de que quieres cerrar la sesión?'),
-        actions: [
-          TextButton(
-            onPressed: () => Navigator.of(context).pop(false),
-            child: const Text('Cancelar', style: TextStyle(color: Colors.red)),
-          ),
-          TextButton(
-            onPressed: () async {
-              Provider.of<LoginViewModel>(context, listen: false).logOut();
-              Navigator.of(context).pushNamedAndRemoveUntil(
-                'login',
-                (route) => false,
-              );
-            },
-            child: const Text('Aceptar'),
-          ),
-        ],
-      ),
-    );
-    return shouldPop;
-  }
+class CustomDrawer extends StatelessWidget {
+  const CustomDrawer({Key? key}) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
-    BaseService baseService = BaseService();
-    String prefijoVersion = baseService.prefijoVersion();
     return Drawer(
-      surfaceTintColor: Colors.white,
-      backgroundColor: Colors.white,
-      child: Column(
-        children: [
-          Container(
-            width: double.infinity,
-            decoration: BoxDecoration(
-              color: AppTheme.primary,
-            ),
-            padding: EdgeInsets.only(
-              top: MediaQuery.of(context).padding.top,
-            ),
-            child: const Column(
-              children: [
-                Padding(
-                  padding: EdgeInsets.all(8.0),
-                  child: Image(
-                    image: AssetImage('assets/logo-BN.png'),
-                    height: 150,
-                  ),
+      child: Container(
+        color: Colors.white,
+        child: ListView(
+          padding: EdgeInsets.zero,
+          children: [
+            // Cabecera del drawer
+            DrawerHeader(
+              decoration: const BoxDecoration(
+                color: Colors.blue,
+                borderRadius: BorderRadius.only(
+                  bottomLeft: Radius.circular(20),
+                  bottomRight: Radius.circular(20),
                 ),
-                SizedBox(
-                  height: 10,
+              ),
+              padding: EdgeInsets.zero,
+              margin: EdgeInsets.zero,
+              child: Stack(
+                children: [
+                  const Positioned(
+                    left: 20,
+                    top: 40,
+                    child: Column(
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        Text(
+                          'Menú',
+                          style: TextStyle(
+                            fontSize: 28,
+                            fontWeight: FontWeight.bold,
+                            color: Colors.white,
+                          ),
+                        ),
+                        SizedBox(height: 8),
+                        Text(
+                          'Opciones disponibles',
+                          style: TextStyle(
+                            fontSize: 16,
+                            color: Colors.white,
+                          ),
+                        ),
+                      ],
+                    ),
+                  ),
+                  // Icono decorativo
+                  Positioned(
+                    right: 20,
+                    top: 40,
+                    child: Container(
+                      padding: const EdgeInsets.all(8),
+                      decoration: const BoxDecoration(
+                        color: Colors.yellow,
+                        shape: BoxShape.circle,
+                      ),
+                      child: const Icon(
+                        Icons.menu_book,
+                        color: Colors.white,
+                        size: 24,
+                      ),
+                    ),
+                  ),
+                ],
+              ),
+            ),
+
+            // Tarjeta de perfil del usuario
+            Padding(
+              padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
+              child: Container(
+                width: double.infinity,
+                padding: const EdgeInsets.all(20),
+                decoration: BoxDecoration(
+                  color: const Color(0xFFF5F5F5),
+                  borderRadius: BorderRadius.circular(16),
                 ),
-                SizedBox(
-                  height: 10,
+                child: Row(
+                  crossAxisAlignment: CrossAxisAlignment.center,
+                  children: [
+                    Expanded(
+                      child: Column(
+                        crossAxisAlignment: CrossAxisAlignment.start,
+                        children: [
+                          const Text(
+                            'Usuario Conocido',
+                            style: TextStyle(
+                              fontSize: 22,
+                              fontWeight: FontWeight.bold,
+                              color: Colors.black87,
+                            ),
+                          ),
+                          const SizedBox(height: 8),
+                          const Text(
+                            'usuario@gmail.com',
+                            style: TextStyle(
+                              fontSize: 16,
+                              color: Colors.black54,
+                            ),
+                          ),
+                          const SizedBox(height: 12),
+                          GestureDetector(
+                            onTap: () {
+                              // Acción al pulsar en Ver perfil
+                            },
+                            child: const Text(
+                              'Ver perfil',
+                              style: TextStyle(
+                                fontSize: 16,
+                                fontWeight: FontWeight.w500,
+                                color: Colors.blue,
+                              ),
+                            ),
+                          ),
+                        ],
+                      ),
+                    ),
+                    Container(
+                      width: 60,
+                      height: 60,
+                      decoration: BoxDecoration(
+                        shape: BoxShape.circle,
+                        color: Colors.grey[200],
+                      ),
+                      child: const Icon(
+                        Icons.person,
+                        size: 36,
+                        color: Colors.blue,
+                      ),
+                    ),
+                  ],
                 ),
-              ],
+              ),
             ),
-          ),
-          // HEADER
-          Expanded(
-            child: ListView(
-              children: [
-                ListTile(
-                  leading: circulo(const Icon(Icons.restaurant_menu)),
-                  title: const Text('Pedidos'),
-                  onTap: () => {},
+
+            // Opciones del menú
+            _buildMenuItem(
+              icon: Icons.home_outlined,
+              title: "Inicio",
+              onTap: () {
+                Navigator.pop(context);
+                // Navegación a la pantalla de inicio
+              },
+            ),
+
+            _buildMenuItem(
+              icon: Icons.shopping_bag_outlined,
+              title: "Mis Pedidos",
+              onTap: () {
+                Navigator.pop(context);
+                // Navegación a pedidos
+              },
+            ),
+
+            _buildMenuItem(
+              icon: Icons.favorite_outline,
+              title: "Favoritos",
+              onTap: () {
+                Navigator.pop(context);
+                // Navegación a favoritos
+              },
+            ),
+
+            _buildMenuItem(
+              icon: Icons.notifications_outlined,
+              title: "Notificaciones",
+              onTap: () {
+                Navigator.pop(context);
+                // Navegación a notificaciones
+              },
+            ),
+
+            _buildMenuItem(
+              icon: Icons.settings_outlined,
+              title: "Configuración",
+              onTap: () {
+                Navigator.pop(context);
+                // Navegación a configuración
+              },
+            ),
+
+            const SizedBox(height: 20),
+
+            // Opción para modo oscuro
+            Padding(
+              padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
+              child: ClipRRect(
+                borderRadius: BorderRadius.circular(16),
+                child: Container(
+                  height: 80,
+                  padding: const EdgeInsets.symmetric(horizontal: 16),
+                  width: double.infinity,
+                  color: Colors.white,
+                  child: Row(
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    children: [
+                      const Row(
+                        children: [
+                          Icon(Icons.nights_stay_rounded, size: 28),
+                          Padding(
+                            padding: EdgeInsets.only(left: 8),
+                            child: Text(
+                              "Modo oscuro",
+                              style: TextStyle(
+                                fontSize: 20,
+                                fontWeight: FontWeight.bold,
+                              ),
+                            ),
+                          ),
+                        ],
+                      ),
+                      Switch(
+                        activeColor: Theme.of(context).primaryColor,
+                        value: false,
+                        onChanged: (value) {
+                          // Cambiar tema claro/oscuro
+                        },
+                      ),
+                    ],
+                  ),
                 ),
-                ListTile(
-                  leading: const Icon(Icons.logout),
-                  title: const Text('Cerrar sesión'),
-                  onTap: () {
-                    _showExitConfirmationDialog(context);
-                  },
+              ),
+            ),
+
+            // Botón de cerrar sesión
+            Padding(
+              padding: const EdgeInsets.all(16),
+              child: ClipRRect(
+                borderRadius: BorderRadius.circular(16),
+                child: Container(
+                  decoration: BoxDecoration(
+                    color: Colors.white,
+                    borderRadius: BorderRadius.circular(16),
+                    border: Border.all(color: Colors.red, width: 3),
+                  ),
+                  height: 60,
+                  padding: const EdgeInsets.symmetric(horizontal: 16),
+                  width: double.infinity,
+                  child: InkWell(
+                    onTap: () {
+                      // Acción para cerrar sesión
+                    },
+                    child: const Center(
+                      child: Row(
+                        mainAxisAlignment: MainAxisAlignment.center,
+                        crossAxisAlignment: CrossAxisAlignment.center,
+                        children: [
+                          Icon(
+                            Icons.logout_outlined,
+                            size: 24,
+                            color: Colors.red,
+                          ),
+                          SizedBox(width: 8),
+                          Text(
+                            "Cerrar Sesión",
+                            style: TextStyle(
+                              fontWeight: FontWeight.bold,
+                              fontSize: 18,
+                              color: Colors.red,
+                            ),
+                          ),
+                        ],
+                      ),
+                    ),
+                  ),
                 ),
-              ],
+              ),
             ),
-          ),
-          Padding(
-            padding: const EdgeInsets.only(bottom: 10),
-            child: Align(
-              alignment: Alignment.bottomCenter,
-              child: Text(
-                '$prefijoVersion.1.25.02.11',
-                style: const TextStyle(fontWeight: FontWeight.w300),
+          ],
+        ),
+      ),
+    );
+  }
+
+  Widget _buildMenuItem({
+    required IconData icon,
+    required String title,
+    required VoidCallback onTap,
+  }) {
+    return Padding(
+      padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
+      child: ClipRRect(
+        borderRadius: BorderRadius.circular(16),
+        child: Container(
+          height: 60,
+          color: Colors.white,
+          child: InkWell(
+            onTap: onTap,
+            child: Padding(
+              padding: const EdgeInsets.symmetric(horizontal: 16),
+              child: Row(
+                children: [
+                  Icon(icon, size: 24),
+                  const SizedBox(width: 12),
+                  Text(
+                    title,
+                    style: const TextStyle(
+                      fontSize: 18,
+                      fontWeight: FontWeight.bold,
+                    ),
+                  ),
+                  const Spacer(),
+                  const Icon(Icons.arrow_forward_ios_rounded, size: 16),
+                ],
               ),
             ),
           ),
-        ],
+        ),
       ),
     );
   }

+ 64 - 0
lib/utils/widgets/horario_modal.dart

@@ -0,0 +1,64 @@
+import 'package:flutter/material.dart';
+
+void verificarHorarioModal(BuildContext context) {
+  DateTime now = DateTime.now();
+  int hora = now.hour;
+  int minuto = now.minute;
+  int weekday = now.weekday;
+  print(now);
+// 1 = Lunes, 7 = Domingo
+  bool isOpen = false;
+
+  if (weekday >= 1 && weekday <= 6) {
+    // Lunes a Sábado: 8:00 a.m. - 10:00 p.m.
+    isOpen = (hora >= 8 && hora < 22) || (hora == 22 && minuto == 0);
+  } else if (weekday == 7) {
+    // Domingo: 4:00 p.m. - 10:00 p.m.
+    isOpen = (hora >= 16 && hora < 22) || (hora == 22 && minuto == 0);
+  }
+  if (!isOpen) {}
+}
+
+class _DetallesD extends StatelessWidget {
+  const _DetallesD({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Container();
+  }
+}
+
+Widget _buildScheduleRow(String day, String hours, bool isHighlighted) {
+  return Container(
+    padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
+    decoration: BoxDecoration(
+      color: isHighlighted ? Colors.blue[50] : Colors.transparent,
+      borderRadius: BorderRadius.circular(8),
+    ),
+    child: Row(
+      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+      children: [
+        Text(
+          day,
+          style: TextStyle(
+            fontSize: 16,
+            fontWeight: isHighlighted ? FontWeight.bold : FontWeight.normal,
+          ),
+        ),
+        Row(
+          children: [
+            const Icon(Icons.access_time, size: 18),
+            const SizedBox(width: 8),
+            Text(
+              hours,
+              style: TextStyle(
+                fontSize: 16,
+                fontWeight: isHighlighted ? FontWeight.bold : FontWeight.normal,
+              ),
+            ),
+          ],
+        ),
+      ],
+    ),
+  );
+}

+ 31 - 2
lib/utils/widgets/modal_infonegaocio.dart

@@ -1,12 +1,24 @@
 import 'package:animate_do/animate_do.dart';
 import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:turquessa_mesas_hoster/mvvm/viewmodels/home_view_model.dart';
+import 'package:turquessa_mesas_hoster/utils/themes.dart';
+
+void setModalOffService(BuildContext context) {
+  final homeviewmodel = Provider.of<HomeViewModel>(context, listen: false);
+
+  if (homeviewmodel.isopen) {
+    mostrarInformacionNegocioBottomSheet(context);
+  }
+}
 
 void mostrarInformacionNegocioBottomSheet(BuildContext context) {
+  final homeviewmodel = Provider.of<HomeViewModel>(context, listen: false);
   showModalBottomSheet(
     context: context,
     isScrollControlled: true,
     backgroundColor: Colors.transparent,
-    builder: (context) => BounceInUp(
+    builder: (context) => SlideInUp(
       duration: const Duration(milliseconds: 450),
       child: Container(
         height: MediaQuery.of(context).size.height * 0.7,
@@ -63,7 +75,24 @@ void mostrarInformacionNegocioBottomSheet(BuildContext context) {
                   ),
                 ),
               ),
-
+              Row(
+                mainAxisAlignment: MainAxisAlignment.center,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                children: [
+                  Padding(
+                    padding: const EdgeInsets.all(15),
+                    child: Text(
+                      homeviewmodel.isopen
+                          ? "Turquessa Esta: Abierto"
+                          : "Turquessa Esta: Cerrado",
+                      style: TextStyle(
+                          fontSize: 30,
+                          color: AppTheme.primary,
+                          fontWeight: FontWeight.bold),
+                    ),
+                  ),
+                ],
+              ),
               // Sección de información
               Padding(
                 padding: const EdgeInsets.all(20),