app_drawer.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. import 'package:flutter/material.dart';
  2. import 'package:provider/provider.dart';
  3. import 'package:turquessa_mesas_hoster/mvvm/viewmodels/home_view_model.dart';
  4. class CustomDrawer extends StatelessWidget {
  5. const CustomDrawer({Key? key}) : super(key: key);
  6. @override
  7. Widget build(BuildContext context) {
  8. return Drawer(
  9. child: Container(
  10. color: Colors.white,
  11. child: ListView(
  12. padding: EdgeInsets.zero,
  13. children: [
  14. // Cabecera del drawer
  15. DrawerHeader(
  16. decoration: const BoxDecoration(
  17. color: Colors.blue,
  18. borderRadius: BorderRadius.only(
  19. bottomLeft: Radius.circular(20),
  20. bottomRight: Radius.circular(20),
  21. ),
  22. ),
  23. padding: EdgeInsets.zero,
  24. margin: EdgeInsets.zero,
  25. child: Stack(
  26. children: [
  27. const Positioned(
  28. left: 20,
  29. top: 40,
  30. child: Column(
  31. crossAxisAlignment: CrossAxisAlignment.start,
  32. children: [
  33. Text(
  34. 'Menú',
  35. style: TextStyle(
  36. fontSize: 28,
  37. fontWeight: FontWeight.bold,
  38. color: Colors.white,
  39. ),
  40. ),
  41. SizedBox(height: 8),
  42. Text(
  43. 'Opciones disponibles',
  44. style: TextStyle(
  45. fontSize: 16,
  46. color: Colors.white,
  47. ),
  48. ),
  49. ],
  50. ),
  51. ),
  52. // Icono decorativo
  53. Positioned(
  54. right: 20,
  55. top: 40,
  56. child: Container(
  57. padding: const EdgeInsets.all(8),
  58. decoration: const BoxDecoration(
  59. color: Colors.yellow,
  60. shape: BoxShape.circle,
  61. ),
  62. child: const Icon(
  63. Icons.menu_book,
  64. color: Colors.white,
  65. size: 24,
  66. ),
  67. ),
  68. ),
  69. ],
  70. ),
  71. ),
  72. // Tarjeta de perfil del usuario
  73. Padding(
  74. padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
  75. child: Container(
  76. width: double.infinity,
  77. padding: const EdgeInsets.all(20),
  78. decoration: BoxDecoration(
  79. color: const Color(0xFFF5F5F5),
  80. borderRadius: BorderRadius.circular(16),
  81. ),
  82. child: Row(
  83. crossAxisAlignment: CrossAxisAlignment.center,
  84. children: [
  85. Expanded(
  86. child: Column(
  87. crossAxisAlignment: CrossAxisAlignment.start,
  88. children: [
  89. const Text(
  90. 'Usuario Conocido',
  91. style: TextStyle(
  92. fontSize: 22,
  93. fontWeight: FontWeight.bold,
  94. color: Colors.black87,
  95. ),
  96. ),
  97. const SizedBox(height: 8),
  98. const Text(
  99. 'usuario@gmail.com',
  100. style: TextStyle(
  101. fontSize: 16,
  102. color: Colors.black54,
  103. ),
  104. ),
  105. const SizedBox(height: 12),
  106. GestureDetector(
  107. onTap: () {
  108. // Acción al pulsar en Ver perfil
  109. },
  110. child: const Text(
  111. 'Ver perfil',
  112. style: TextStyle(
  113. fontSize: 16,
  114. fontWeight: FontWeight.w500,
  115. color: Colors.blue,
  116. ),
  117. ),
  118. ),
  119. ],
  120. ),
  121. ),
  122. Container(
  123. width: 60,
  124. height: 60,
  125. decoration: BoxDecoration(
  126. shape: BoxShape.circle,
  127. color: Colors.grey[200],
  128. ),
  129. child: const Icon(
  130. Icons.person,
  131. size: 36,
  132. color: Colors.blue,
  133. ),
  134. ),
  135. ],
  136. ),
  137. ),
  138. ),
  139. // Opciones del menú
  140. _buildMenuItem(
  141. icon: Icons.home_outlined,
  142. title: "Inicio",
  143. onTap: () {
  144. Navigator.pop(context);
  145. // Navegación a la pantalla de inicio
  146. },
  147. ),
  148. _buildMenuItem(
  149. icon: Icons.shopping_bag_outlined,
  150. title: "Mis Pedidos",
  151. onTap: () {
  152. Navigator.pop(context);
  153. // Navegación a pedidos
  154. },
  155. ),
  156. _buildMenuItem(
  157. icon: Icons.favorite_outline,
  158. title: "Favoritos",
  159. onTap: () {
  160. Navigator.pop(context);
  161. // Navegación a favoritos
  162. },
  163. ),
  164. _buildMenuItem(
  165. icon: Icons.notifications_outlined,
  166. title: "Notificaciones",
  167. onTap: () {
  168. Navigator.pop(context);
  169. // Navegación a notificaciones
  170. },
  171. ),
  172. _buildMenuItem(
  173. icon: Icons.settings_outlined,
  174. title: "Configuración",
  175. onTap: () {
  176. Navigator.pop(context);
  177. // Navegación a configuración
  178. },
  179. ),
  180. const SizedBox(height: 20),
  181. // Opción para modo oscuro
  182. Padding(
  183. padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
  184. child: ClipRRect(
  185. borderRadius: BorderRadius.circular(16),
  186. child: Container(
  187. height: 80,
  188. padding: const EdgeInsets.symmetric(horizontal: 16),
  189. width: double.infinity,
  190. color: Colors.white,
  191. child: Row(
  192. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  193. children: [
  194. const Row(
  195. children: [
  196. Icon(Icons.nights_stay_rounded, size: 28),
  197. Padding(
  198. padding: EdgeInsets.only(left: 8),
  199. child: Text(
  200. "Modo oscuro",
  201. style: TextStyle(
  202. fontSize: 20,
  203. fontWeight: FontWeight.bold,
  204. ),
  205. ),
  206. ),
  207. ],
  208. ),
  209. Switch(
  210. activeColor: Theme.of(context).primaryColor,
  211. value: false,
  212. onChanged: (value) {
  213. // Cambiar tema claro/oscuro
  214. },
  215. ),
  216. ],
  217. ),
  218. ),
  219. ),
  220. ),
  221. // Botón de cerrar sesión
  222. Padding(
  223. padding: const EdgeInsets.all(16),
  224. child: ClipRRect(
  225. borderRadius: BorderRadius.circular(16),
  226. child: Container(
  227. decoration: BoxDecoration(
  228. color: Colors.white,
  229. borderRadius: BorderRadius.circular(16),
  230. border: Border.all(color: Colors.red, width: 3),
  231. ),
  232. height: 60,
  233. padding: const EdgeInsets.symmetric(horizontal: 16),
  234. width: double.infinity,
  235. child: InkWell(
  236. onTap: () {
  237. // Acción para cerrar sesión
  238. },
  239. child: const Center(
  240. child: Row(
  241. mainAxisAlignment: MainAxisAlignment.center,
  242. crossAxisAlignment: CrossAxisAlignment.center,
  243. children: [
  244. Icon(
  245. Icons.logout_outlined,
  246. size: 24,
  247. color: Colors.red,
  248. ),
  249. SizedBox(width: 8),
  250. Text(
  251. "Cerrar Sesión",
  252. style: TextStyle(
  253. fontWeight: FontWeight.bold,
  254. fontSize: 18,
  255. color: Colors.red,
  256. ),
  257. ),
  258. ],
  259. ),
  260. ),
  261. ),
  262. ),
  263. ),
  264. ),
  265. ],
  266. ),
  267. ),
  268. );
  269. }
  270. Widget _buildMenuItem({
  271. required IconData icon,
  272. required String title,
  273. required VoidCallback onTap,
  274. }) {
  275. return Padding(
  276. padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
  277. child: ClipRRect(
  278. borderRadius: BorderRadius.circular(16),
  279. child: Container(
  280. height: 60,
  281. color: Colors.white,
  282. child: InkWell(
  283. onTap: onTap,
  284. child: Padding(
  285. padding: const EdgeInsets.symmetric(horizontal: 16),
  286. child: Row(
  287. children: [
  288. Icon(icon, size: 24),
  289. const SizedBox(width: 12),
  290. Text(
  291. title,
  292. style: const TextStyle(
  293. fontSize: 18,
  294. fontWeight: FontWeight.bold,
  295. ),
  296. ),
  297. const Spacer(),
  298. const Icon(Icons.arrow_forward_ios_rounded, size: 16),
  299. ],
  300. ),
  301. ),
  302. ),
  303. ),
  304. ),
  305. );
  306. }
  307. }