You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

160 lines
4.0 KiB

import 'package:flutter/material.dart';
import '../widgets/bottom_navigation.dart';
class MainLayout extends StatefulWidget {
final Widget child;
final int currentIndex;
const MainLayout({super.key, required this.child, this.currentIndex = 0});
@override
// ignore: library_private_types_in_public_api
_MainLayoutState createState() => _MainLayoutState();
}
class _MainLayoutState extends State<MainLayout> {
int _selectedIndex = 0;
@override
void initState() {
super.initState();
_selectedIndex = widget.currentIndex;
}
@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,
),
],
),
),
],
),
);
}
void _onItemTapped(int index) {
setState(() {
_selectedIndex = index;
});
// Global navigation logic
switch (index) {
case 0:
Navigator.pushReplacementNamed(context, '/tables');
break;
case 1:
Navigator.pushReplacementNamed(context, '/commandes');
break;
case 2:
Navigator.pushReplacementNamed(context, '/categories');
break;
case 3:
Navigator.pushReplacementNamed(context, '/menus');
break;
}
}
Widget _buildDesktopSidebar() {
return Container(
width: 250,
color: Colors.white,
child: 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,
),
],
),
),
],
),
);
}
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);
},
);
}
}