/// Widget de menu latéral (drawer) du dashboard /// Navigation principale de l'application library dashboard_drawer; import 'package:flutter/material.dart'; import '../../../../shared/design_system/tokens/color_tokens.dart'; import '../../../../shared/design_system/tokens/spacing_tokens.dart'; import '../../../../shared/design_system/tokens/typography_tokens.dart'; /// Modèle de données pour un élément de menu class DrawerMenuItem { /// Icône de l'élément de menu final IconData icon; /// Titre de l'élément de menu final String title; /// Callback lors du tap sur l'élément final VoidCallback? onTap; /// Constructeur du modèle d'élément de menu const DrawerMenuItem({ required this.icon, required this.title, this.onTap, }); } /// Widget de menu latéral /// /// Affiche la navigation principale avec : /// - Header avec profil utilisateur /// - Menu de navigation structuré /// - Actions secondaires /// - Design Material avec gradient class DashboardDrawer extends StatelessWidget { /// Callback pour les actions de navigation final Function(String route)? onNavigate; /// Callback pour la déconnexion final VoidCallback? onLogout; /// Constructeur du menu latéral const DashboardDrawer({ super.key, this.onNavigate, this.onLogout, }); /// Génère la liste des éléments de menu principaux List _getMainMenuItems() { return [ DrawerMenuItem( icon: Icons.dashboard, title: 'Dashboard', onTap: () => onNavigate?.call('/dashboard'), ), DrawerMenuItem( icon: Icons.people, title: 'Membres', onTap: () => onNavigate?.call('/members'), ), DrawerMenuItem( icon: Icons.account_balance_wallet, title: 'Cotisations', onTap: () => onNavigate?.call('/cotisations'), ), DrawerMenuItem( icon: Icons.event, title: 'Événements', onTap: () => onNavigate?.call('/events'), ), DrawerMenuItem( icon: Icons.favorite, title: 'Solidarité', onTap: () => onNavigate?.call('/solidarity'), ), ]; } /// Génère la liste des éléments de menu secondaires List _getSecondaryMenuItems() { return [ DrawerMenuItem( icon: Icons.analytics, title: 'Rapports', onTap: () => onNavigate?.call('/reports'), ), DrawerMenuItem( icon: Icons.settings, title: 'Paramètres', onTap: () => onNavigate?.call('/settings'), ), DrawerMenuItem( icon: Icons.help, title: 'Aide', onTap: () => onNavigate?.call('/help'), ), ]; } @override Widget build(BuildContext context) { final mainItems = _getMainMenuItems(); final secondaryItems = _getSecondaryMenuItems(); return Drawer( child: ListView( padding: EdgeInsets.zero, children: [ _buildDrawerHeader(), ...mainItems.map((item) => _buildMenuItem(item)), const Divider(), ...secondaryItems.map((item) => _buildMenuItem(item)), const Divider(), _buildLogoutItem(), ], ), ); } /// Construit l'en-tête du drawer avec profil utilisateur Widget _buildDrawerHeader() { return DrawerHeader( decoration: const BoxDecoration( gradient: LinearGradient( colors: [ColorTokens.primary, ColorTokens.secondary], begin: Alignment.topLeft, end: Alignment.bottomRight, ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const CircleAvatar( radius: 30, backgroundColor: Colors.white, child: Icon( Icons.person, size: 35, color: ColorTokens.primary, ), ), const SizedBox(height: SpacingTokens.md), Text( 'Utilisateur UnionFlow', style: TypographyTokens.titleMedium.copyWith( color: Colors.white, fontWeight: FontWeight.w600, ), ), Text( 'admin@unionflow.dev', style: TypographyTokens.bodySmall.copyWith( color: Colors.white.withOpacity(0.8), ), ), ], ), ); } /// Construit un élément de menu Widget _buildMenuItem(DrawerMenuItem item) { return ListTile( leading: Icon(item.icon), title: Text( item.title, style: TypographyTokens.bodyMedium, ), onTap: item.onTap, ); } /// Construit l'élément de déconnexion Widget _buildLogoutItem() { return ListTile( leading: const Icon( Icons.logout, color: ColorTokens.error, ), title: Text( 'Déconnexion', style: TypographyTokens.bodyMedium.copyWith( color: ColorTokens.error, ), ), onTap: onLogout, ); } }