From a7268ad74f265c9b82e2d4b4cfe1f55d675d69dd Mon Sep 17 00:00:00 2001 From: Stephane Date: Sat, 2 Aug 2025 02:31:43 +0300 Subject: [PATCH] bottom --- lib/layouts/main_layout.dart | 174 ++++++++-------------- lib/main.dart | 25 +++- lib/pages/tables.dart | 2 +- lib/widgets/bottom_navigation.dart | 46 +++++- lib/widgets/mobile_bottom_navigation.dart | 3 +- 5 files changed, 124 insertions(+), 126 deletions(-) diff --git a/lib/layouts/main_layout.dart b/lib/layouts/main_layout.dart index 6a8df76..d0aec98 100644 --- a/lib/layouts/main_layout.dart +++ b/lib/layouts/main_layout.dart @@ -1,14 +1,19 @@ import 'package:flutter/material.dart'; import '../widgets/bottom_navigation.dart'; +import '../widgets/mobile_bottom_navigation.dart'; class MainLayout extends StatefulWidget { final Widget child; - final int currentIndex; + final String? currentRoute; - const MainLayout({super.key, required this.child, this.currentIndex = 0}); + const MainLayout({ + super.key, + required this.child, + this.currentRoute, + // Remove the currentIndex parameter - it's not needed + }); @override - // ignore: library_private_types_in_public_api _MainLayoutState createState() => _MainLayoutState(); } @@ -18,39 +23,24 @@ class _MainLayoutState extends State { @override void initState() { super.initState(); - _selectedIndex = widget.currentIndex; + _selectedIndex = _getIndexFromRoute(widget.currentRoute ?? '/dashboard'); } - @override - Widget build(BuildContext context) { - final isDesktop = MediaQuery.of(context).size.width >= 768; - - return Scaffold( - backgroundColor: Colors.grey.shade50, - body: Row( - children: [ - // Desktop Sidebar - if (isDesktop) _buildDesktopSidebar(), - - // Main Content - Expanded( - child: Column( - children: [ - // Page Content - Expanded(child: widget.child), - - // Bottom Navigation - AppBottomNavigation( - selectedIndex: _selectedIndex, - onItemTapped: _onItemTapped, - isDesktop: isDesktop, - ), - ], - ), - ), - ], - ), - ); + int _getIndexFromRoute(String route) { + switch (route) { + case '/dashboard': + return 0; + case '/menu': + return 1; + case '/tables': + return 2; + case '/orders': + return 3; + case '/profile': + return 4; + default: + return 0; + } } void _onItemTapped(int index) { @@ -58,103 +48,57 @@ class _MainLayoutState extends State { _selectedIndex = index; }); - // Global navigation logic + String route; switch (index) { case 0: - Navigator.pushReplacementNamed(context, '/tables'); + route = '/dashboard'; break; case 1: - Navigator.pushReplacementNamed(context, '/commandes'); + route = '/menu'; break; case 2: - Navigator.pushReplacementNamed(context, '/categories'); + route = '/tables'; break; case 3: - Navigator.pushReplacementNamed(context, '/menus'); + route = '/orders'; + break; + case 4: + route = '/profile'; break; + default: + route = '/dashboard'; + } + + if (route != widget.currentRoute) { + Navigator.pushReplacementNamed(context, route); } } - Widget _buildDesktopSidebar() { - return Container( - width: 250, - color: Colors.white, - child: Column( + @override + Widget build(BuildContext context) { + final isDesktop = MediaQuery.of(context).size.width > 600; + + return Scaffold( + body: Column( children: [ - Container( - padding: const EdgeInsets.all(20), - child: const Text( - 'Restaurant App', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: Colors.black87, - ), - ), - ), - Expanded( - child: ListView( - children: [ - _buildSidebarItem( - icon: Icons.table_restaurant, - title: 'Tables', - route: '/tables', - index: 0, - ), - _buildSidebarItem( - icon: Icons.receipt_long_outlined, - title: 'Commandes', - route: '/commandes', - index: 1, - ), - _buildSidebarItem( - icon: Icons.category_outlined, - title: 'Catégories', - route: '/categories', - index: 2, - ), - _buildSidebarItem( - icon: Icons.restaurant_menu, - title: 'Menus', - route: '/menus', - index: 3, - ), - ], + Expanded(child: widget.child), + // Show desktop navigation on larger screens + if (isDesktop) + AppBottomNavigation( + selectedIndex: _selectedIndex, + onItemTapped: _onItemTapped, ), - ), ], ), - ); - } - - Widget _buildSidebarItem({ - required IconData icon, - required String title, - required String route, - required int index, - }) { - final isSelected = _selectedIndex == index; - - return ListTile( - leading: Icon( - icon, - color: isSelected ? Colors.green.shade700 : Colors.grey.shade600, - ), - title: Text( - title, - style: TextStyle( - color: isSelected ? Colors.green.shade700 : Colors.grey.shade700, - fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, - ), - ), - selected: isSelected, - selectedTileColor: Colors.green.shade50, - onTap: () { - setState(() { - _selectedIndex = index; - }); - Navigator.pushReplacementNamed(context, route); - }, + // Show mobile navigation on smaller screens + bottomNavigationBar: + isDesktop + ? null + : MobileBottomNavigation( + currentRoute: widget.currentRoute ?? '/dashboard', + selectedIndex: _selectedIndex, + onItemTapped: _onItemTapped, + ), ); } } diff --git a/lib/main.dart b/lib/main.dart index 507e235..74436f6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -23,14 +23,23 @@ class MyApp extends StatelessWidget { initialRoute: '/tables', routes: { '/tables': - (context) => - const MainLayout(currentIndex: 0, child: TablesScreen()), - // '/commandes': - // (context) => MainLayout(currentIndex: 1, child: CommandesScreen()), - // '/categories': - // (context) => MainLayout(currentIndex: 2, child: CategoriesScreen()), - // '/menus': - // (context) => MainLayout(currentIndex: 3, child: MenusScreen()), + (context) => const MainLayout( + currentRoute: '/tables', + child: TablesScreen(), + ), + // Uncomment and update these as needed: + // '/commandes': (context) => const MainLayout( + // currentRoute: '/commandes', + // child: CommandesScreen(), + // ), + // '/categories': (context) => const MainLayout( + // currentRoute: '/categories', + // child: CategoriesScreen(), + // ), + // '/menus': (context) => const MainLayout( + // currentRoute: '/menus', + // child: MenusScreen(), + // ), }, ); } diff --git a/lib/pages/tables.dart b/lib/pages/tables.dart index d3a1cdb..18ae5b4 100644 --- a/lib/pages/tables.dart +++ b/lib/pages/tables.dart @@ -251,7 +251,7 @@ class _TablesScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 30), + const SizedBox(height: 30), const Text( 'Sélectionner une table', style: TextStyle( diff --git a/lib/widgets/bottom_navigation.dart b/lib/widgets/bottom_navigation.dart index d2b9dc3..28c997f 100644 --- a/lib/widgets/bottom_navigation.dart +++ b/lib/widgets/bottom_navigation.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; class AppBottomNavigation extends StatelessWidget { - final int selectedIndex; + final int? selectedIndex; final Function(int) onItemTapped; final bool isDesktop; @@ -107,6 +107,50 @@ class AppBottomNavigation extends StatelessWidget { ), ), + const SizedBox(width: 20), + + // Commandes Tab + GestureDetector( + onTap: () => onItemTapped(1), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: + selectedIndex == 1 + ? Colors.green.shade700 + : Colors.transparent, + borderRadius: BorderRadius.circular(20), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.receipt_long_outlined, + color: + selectedIndex == 1 + ? Colors.white + : Colors.grey.shade600, + size: 16, + ), + const SizedBox(width: 6), + Text( + 'Categories', + style: TextStyle( + color: + selectedIndex == 1 + ? Colors.white + : Colors.grey.shade600, + fontWeight: + selectedIndex == 1 + ? FontWeight.w500 + : FontWeight.normal, + ), + ), + ], + ), + ), + ), + const Spacer(), // User Profile Section diff --git a/lib/widgets/mobile_bottom_navigation.dart b/lib/widgets/mobile_bottom_navigation.dart index 9ddb11f..fd566bc 100644 --- a/lib/widgets/mobile_bottom_navigation.dart +++ b/lib/widgets/mobile_bottom_navigation.dart @@ -1,13 +1,14 @@ import 'package:flutter/material.dart'; class MobileBottomNavigation extends StatelessWidget { - final int selectedIndex; + final int? selectedIndex; final Function(int) onItemTapped; const MobileBottomNavigation({ super.key, required this.selectedIndex, required this.onItemTapped, + required String currentRoute, }); @override