123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- // ignore_for_file: must_be_immutable
- import 'package:flutter/material.dart';
- import 'package:yoshi_papas_app/views/categoria_producto/categoria_producto_screen.dart';
- import 'package:yoshi_papas_app/views/pedido/pedido_screen.dart';
- import 'package:yoshi_papas_app/views/producto/producto_screen.dart';
- import 'package:yoshi_papas_app/views/sucursal/sucursal_screen.dart';
- import 'package:yoshi_papas_app/views/variable/variable_screen.dart';
- import 'package:yoshi_papas_app/views/venta/venta_screen.dart';
- import 'package:provider/provider.dart';
- import '../models/models.dart';
- import '../services/services.dart';
- import '../themes/themes.dart';
- import '../viewmodels/login_view_model.dart';
- import '../viewmodels/viewmodels.dart';
- import '../views/descuento/descuento_screen.dart';
- import 'widgets_components.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;
- }
- @override
- Widget build(BuildContext context) {
- final permisoViewModel = Provider.of<PermisoViewModel>(context);
- List<String> userPermisos = permisoViewModel.userPermisos;
- BaseService baseService = BaseService(); // Instancia de 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/JoshiLogoHorizontal.png'),
- height: 150,
- ),
- ),
- SizedBox(
- height: 10,
- ),
- SizedBox(
- height: 10,
- ),
- ],
- ),
- ),
- // HEADER
- Expanded(
- child: ListView(
- children: [
- ListTile(
- leading: circulo(const Icon(Icons.restaurant_menu)),
- title: const Text('Pedidos'),
- onTap: () => {
- Navigator.pop(context),
- Navigator.of(context).push(
- MaterialPageRoute(
- builder: (context) => const PedidoScreen(),
- ),
- ),
- },
- ),
- ListTile(
- leading: circulo(const Icon(Icons.menu_book_rounded)),
- title: const Text('Productos'),
- onTap: () => {
- Navigator.pop(context),
- Navigator.of(context).push(
- MaterialPageRoute(
- builder: (context) => ProductoScreen(),
- ),
- ),
- },
- ),
- if (userPermisos.contains(Usuario.VER_CATEGORIAS))
- ListTile(
- leading:
- circulo(const Icon(Icons.format_list_bulleted_rounded)),
- title: const Text('Categoría Producto'),
- onTap: () => {
- Navigator.pop(context),
- Navigator.of(context).push(
- MaterialPageRoute(
- builder: (context) => CategoriaProductoScreen(),
- ),
- ),
- },
- ),
- ListTile(
- leading: circulo(const Icon(Icons.receipt_long_outlined)),
- title: const Text('Pedidos Por Día'),
- onTap: () => {
- Navigator.pop(context),
- Navigator.of(context).push(
- MaterialPageRoute(
- builder: (context) => VentaScreen(),
- ),
- ),
- },
- ),
- if (userPermisos.contains(Usuario.VER_ADMIN))
- ExpansionTile(
- leading: circulo(const Icon(Icons.admin_panel_settings)),
- title: const Text('Administración'),
- children: [
- ListTile(
- leading: circulo(const Icon(Icons.discount)),
- title: const Text('Descuentos'),
- onTap: () => {
- Navigator.pop(context),
- Navigator.of(context).push(
- MaterialPageRoute(
- builder: (context) => DescuentoScreen(),
- ),
- ),
- },
- ),
- ListTile(
- leading: circulo(const Icon(Icons.discount)),
- title: const Text('Variables'),
- onTap: () => {
- Navigator.pop(context),
- Navigator.of(context).push(
- MaterialPageRoute(
- builder: (context) => VariablesScreen(),
- ),
- ),
- },
- ),
- if (userPermisos.contains(Usuario.VER_SUCURSALES))
- ListTile(
- leading:
- circulo(const Icon(Icons.storefront_outlined)),
- title: const Text('Sucursales'),
- onTap: () => {
- Navigator.pop(context),
- Navigator.of(context).push(
- MaterialPageRoute(
- builder: (context) => SucursalesPage(),
- ),
- ),
- },
- ),
- if (userPermisos.contains(Usuario.FORZAR_SINCRONIZACION))
- ListTile(
- leading: circulo(const Icon(Icons.sync)),
- title: const Text('Forzar Sincronización'),
- onTap: () async {
- bool confirmado = await showDialog(
- context: context,
- builder: (context) {
- return AlertDialog(
- title: const Text("Forzar Sincronización",
- style: TextStyle(
- fontWeight: FontWeight.w500,
- fontSize: 22)),
- content: const Text(
- '¿Estás seguro de que deseas forzar la sincronización?',
- style: TextStyle(fontSize: 18)),
- actions: [
- Row(
- mainAxisAlignment:
- MainAxisAlignment.spaceBetween,
- children: [
- TextButton(
- onPressed: () =>
- Navigator.of(context)
- .pop(false),
- child: const Text('No',
- style:
- TextStyle(fontSize: 18)),
- style: ButtonStyle(
- padding:
- MaterialStateProperty.all(
- EdgeInsets.fromLTRB(
- 20, 10, 20, 10)),
- backgroundColor:
- MaterialStateProperty.all(
- Colors.red),
- foregroundColor:
- MaterialStateProperty.all(
- AppTheme.secondary),
- ),
- ),
- TextButton(
- onPressed: () =>
- Navigator.of(context)
- .pop(true),
- child: const Text('Sí',
- style:
- TextStyle(fontSize: 18)),
- style: ButtonStyle(
- padding:
- MaterialStateProperty.all(
- EdgeInsets.fromLTRB(
- 20, 10, 20, 10)),
- backgroundColor:
- MaterialStateProperty.all(
- AppTheme.tertiary),
- foregroundColor:
- MaterialStateProperty.all(
- AppTheme.quaternary),
- ),
- ),
- ],
- ),
- ],
- );
- },
- ) ??
- false;
- if (confirmado) {
- showDialog(
- context: context,
- barrierDismissible: false,
- builder: (context) => AlertDialog(
- title: const Text("Sincronizando",
- style: TextStyle(
- fontWeight: FontWeight.w500,
- fontSize: 22)),
- content: Padding(
- padding:
- const EdgeInsetsDirectional.symmetric(
- horizontal: 120),
- child: const CircularProgressIndicator(),
- ),
- ),
- );
- try {
- await RepoService().forzarSincronizacion();
- Navigator.of(context, rootNavigator: true)
- .pop();
- Navigator.of(context).pop();
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(
- content: const Text(
- 'Sincronización completada con éxito'),
- backgroundColor: Colors.green,
- ),
- );
- } catch (e) {
- Navigator.of(context, rootNavigator: true)
- .pop();
- Navigator.of(context).pop();
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(
- content:
- Text('Error en la sincronización: $e'),
- backgroundColor: Colors.red,
- ),
- );
- }
- }
- },
- ),
- ],
- ),
- ListTile(
- leading: const Icon(Icons.logout),
- title: const Text('Cerrar sesión'),
- onTap: () {
- _showExitConfirmationDialog(context);
- },
- ),
- ],
- ),
- ),
- Padding(
- padding: const EdgeInsets.only(bottom: 10),
- child: Align(
- alignment: Alignment.bottomCenter,
- child: Text(
- '$prefijoVersion.1.24.10.21',
- style: const TextStyle(fontWeight: FontWeight.w300),
- ),
- ),
- ),
- ],
- ),
- );
- }
- }
|