From 6ebc49709aeaed92299fe4a76498d67639478df5 Mon Sep 17 00:00:00 2001 From: mandreshope Date: Wed, 23 Jul 2025 17:12:24 +0300 Subject: [PATCH] refactor: Encapsulates drawer menu selection Replaces separate menu and submenu indices with a dedicated `SelectedDrawerState` class. This change centralizes the logic for determining the active drawer item, improving readability and maintainability of the drawer component. It simplifies selection checks by providing a unified `isSelected` method. --- lib/components/drawer_component.dart | 105 +++++++++++++++------------ 1 file changed, 60 insertions(+), 45 deletions(-) diff --git a/lib/components/drawer_component.dart b/lib/components/drawer_component.dart index 626c068..31f4204 100644 --- a/lib/components/drawer_component.dart +++ b/lib/components/drawer_component.dart @@ -12,32 +12,35 @@ class DrawerComponent extends ConsumerStatefulWidget { super.key, this.isOperationExpanded = true, this.isSettingsExpanded = false, - this.selectedMenuIndex = 0, - this.selectedSubMenuIndex = 0, + this.selectedState = const SelectedDrawerState( + menuIndex: 0, + subMenuIndex: 0, + ), }); + final bool isOperationExpanded; final bool isSettingsExpanded; - final int selectedMenuIndex; - final int selectedSubMenuIndex; + final SelectedDrawerState selectedState; @override ConsumerState createState() => _DrawerComponentState(); } class _DrawerComponentState extends ConsumerState { - bool _isOperationExpanded = false; - bool _isSettingsExpanded = false; + late bool _isOperationExpanded; + late bool _isSettingsExpanded; @override void initState() { super.initState(); - _isOperationExpanded = widget.isOperationExpanded; _isSettingsExpanded = widget.isSettingsExpanded; } @override Widget build(BuildContext context) { + final selected = widget.selectedState; + return Drawer( backgroundColor: AppTheme.of(context).primaryBackground, child: Padding( @@ -75,84 +78,82 @@ class _DrawerComponentState extends ConsumerState { const Divider(), - // === ExpansionTile Opérations + // === Opérations _ExpansionTileComponent( leadingIcon: Icons.inbox, isExpanded: _isOperationExpanded, - onExpansionChanged: (expanded) { - setState(() => _isOperationExpanded = expanded); - }, + onExpansionChanged: (expanded) => + setState(() => _isOperationExpanded = expanded), title: 'Opérations', - isActive: widget.selectedMenuIndex == 0, + isActive: selected.isSelected(menu: 0), children: [ _ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 40), - leadingIcon: Icons.move_to_inbox, - isActive: widget.selectedSubMenuIndex == 0, title: 'Réceptions', - ), - _ListTile( + isActive: selected.isSelected(menu: 0, sub: 0), + leadingIcon: Icons.move_to_inbox, contentPadding: const EdgeInsets.symmetric(horizontal: 40), - leadingIcon: Icons.local_shipping, - title: 'Livraisons', - isActive: widget.selectedSubMenuIndex == 1, ), _ListTile( + title: 'Livraisons', + isActive: selected.isSelected(menu: 0, sub: 1), + leadingIcon: Icons.local_shipping, + contentPadding: const EdgeInsets.symmetric(horizontal: 40), + ), + _ListTile( + title: 'Inventaires', + isActive: selected.isSelected(menu: 0, sub: 2), + leadingIcon: Icons.inventory, + contentPadding: const EdgeInsets.symmetric(horizontal: 40), onTap: () { Navigator.of(context).pop(); ProductListRoute().push(context); }, - contentPadding: const EdgeInsets.symmetric(horizontal: 40), - leadingIcon: Icons.inventory, - title: 'Inventaires', - isActive: widget.selectedSubMenuIndex == 2, ), ], ), // === Produits _ListTile( + title: "Produits", + leadingIcon: Icons.insert_chart, + trailing: const Icon(Icons.keyboard_arrow_right), + isActive: selected.isSelected(menu: 1), contentPadding: const EdgeInsetsDirectional.symmetric( horizontal: 10, ), - leadingIcon: Icons.insert_chart, - title: "Produits", - isActive: widget.selectedMenuIndex == 1, - trailing: const Icon(Icons.keyboard_arrow_right), ), // === Historique _ListTile( + title: "Historiques", + leadingIcon: Icons.history, + trailing: const Icon(Icons.keyboard_arrow_right), + isActive: selected.isSelected(menu: 2), contentPadding: const EdgeInsetsDirectional.symmetric( horizontal: 10, ), - leadingIcon: Icons.history, - title: "Historiques", - trailing: const Icon(Icons.keyboard_arrow_right), - isActive: widget.selectedMenuIndex == 2, ), - // === ExpansionTile Paramètres + // === Paramètres _ExpansionTileComponent( - isActive: widget.selectedMenuIndex == 3, - isExpanded: _isSettingsExpanded, - onExpansionChanged: (expanded) { - setState(() => _isSettingsExpanded = expanded); - }, - leadingIcon: Icons.settings, title: "Paramètres", + isExpanded: _isSettingsExpanded, + onExpansionChanged: (expanded) => + setState(() => _isSettingsExpanded = expanded), + isActive: selected.isSelected(menu: 3), + leadingIcon: Icons.settings, children: [ _ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 40), - leadingIcon: Icons.lock_open, title: 'Connexion Odoo', - isActive: widget.selectedSubMenuIndex == 3, + isActive: selected.isSelected(menu: 3, sub: 3), + leadingIcon: Icons.lock_open, + contentPadding: const EdgeInsets.symmetric(horizontal: 40), ), _ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 40), - leadingIcon: Icons.group, title: 'Gestion des utilisateurs', - isActive: widget.selectedSubMenuIndex == 4, + isActive: selected.isSelected(menu: 3, sub: 4), + leadingIcon: Icons.group, + contentPadding: const EdgeInsets.symmetric(horizontal: 40), ), ], ), @@ -183,6 +184,20 @@ class _DrawerComponentState extends ConsumerState { } } +class SelectedDrawerState { + const SelectedDrawerState({ + required this.menuIndex, + required this.subMenuIndex, + }); + final int menuIndex; + final int subMenuIndex; + + bool isSelected({required int menu, int? sub}) { + if (sub == null) return menuIndex == menu; + return menuIndex == menu && subMenuIndex == sub; + } +} + class _ListTile extends StatelessWidget { const _ListTile({ Key? key,