import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../../../../core/models/membre_model.dart'; import '../../../../shared/theme/app_theme.dart'; import '../pages/membre_edit_page.dart'; /// Section des actions disponibles pour un membre class MembreActionsSection extends StatelessWidget { const MembreActionsSection({ super.key, required this.membre, this.onEdit, this.onDelete, this.onExport, this.onCall, this.onMessage, this.onEmail, }); final MembreModel membre; final VoidCallback? onEdit; final VoidCallback? onDelete; final VoidCallback? onExport; final VoidCallback? onCall; final VoidCallback? onMessage; final VoidCallback? onEmail; @override Widget build(BuildContext context) { return Card( elevation: 2, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: Padding( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon( Icons.settings, color: AppTheme.primaryColor, size: 20, ), const SizedBox(width: 8), const Text( 'Actions', style: TextStyle( fontSize: 16, fontWeight: FontWeight.w600, color: AppTheme.textPrimary, ), ), ], ), const SizedBox(height: 16), _buildActionGrid(context), ], ), ), ); } Widget _buildActionGrid(BuildContext context) { return Column( children: [ Row( children: [ Expanded( child: _buildActionButton( context, 'Modifier', Icons.edit, AppTheme.primaryColor, onEdit ?? () => _showNotImplemented(context, 'Modification'), ), ), const SizedBox(width: 12), Expanded( child: _buildActionButton( context, 'Appeler', Icons.phone, AppTheme.successColor, onCall ?? () => _callMember(context), ), ), ], ), const SizedBox(height: 12), Row( children: [ Expanded( child: _buildActionButton( context, 'Message', Icons.message, AppTheme.infoColor, onMessage ?? () => _messageMember(context), ), ), const SizedBox(width: 12), Expanded( child: _buildActionButton( context, 'Email', Icons.email, AppTheme.warningColor, onEmail ?? () => _emailMember(context), ), ), ], ), const SizedBox(height: 12), Row( children: [ Expanded( child: _buildActionButton( context, 'Exporter', Icons.download, AppTheme.textSecondary, onExport ?? () => _exportMember(context), ), ), const SizedBox(width: 12), Expanded( child: _buildActionButton( context, 'Supprimer', Icons.delete, AppTheme.errorColor, onDelete ?? () => _deleteMember(context), ), ), ], ), const SizedBox(height: 20), _buildQuickInfoSection(context), ], ); } Widget _buildActionButton( BuildContext context, String label, IconData icon, Color color, VoidCallback onPressed, ) { return Material( color: color.withOpacity(0.1), borderRadius: BorderRadius.circular(12), child: InkWell( onTap: onPressed, borderRadius: BorderRadius.circular(12), child: Container( padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 12), decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), border: Border.all(color: color.withOpacity(0.3)), ), child: Column( children: [ Icon(icon, color: color, size: 24), const SizedBox(height: 8), Text( label, style: TextStyle( fontSize: 12, fontWeight: FontWeight.w600, color: color, ), textAlign: TextAlign.center, ), ], ), ), ), ); } Widget _buildQuickInfoSection(BuildContext context) { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: AppTheme.backgroundLight, borderRadius: BorderRadius.circular(12), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Informations rapides', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, color: AppTheme.textPrimary, ), ), const SizedBox(height: 12), _buildQuickInfoRow( 'Numéro de membre', membre.numeroMembre, Icons.badge, () => _copyToClipboard(context, membre.numeroMembre, 'Numéro de membre'), ), _buildQuickInfoRow( 'Téléphone', membre.telephone, Icons.phone, () => _copyToClipboard(context, membre.telephone, 'Téléphone'), ), _buildQuickInfoRow( 'Email', membre.email, Icons.email, () => _copyToClipboard(context, membre.email, 'Email'), ), ], ), ); } Widget _buildQuickInfoRow( String label, String value, IconData icon, VoidCallback onTap, ) { return Padding( padding: const EdgeInsets.only(bottom: 8), child: InkWell( onTap: onTap, borderRadius: BorderRadius.circular(8), child: Padding( padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), child: Row( children: [ Icon(icon, size: 16, color: AppTheme.textSecondary), const SizedBox(width: 8), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( label, style: const TextStyle( fontSize: 10, color: AppTheme.textSecondary, ), ), Text( value, style: const TextStyle( fontSize: 12, fontWeight: FontWeight.w500, color: AppTheme.textPrimary, ), ), ], ), ), const Icon( Icons.copy, size: 14, color: AppTheme.textHint, ), ], ), ), ), ); } void _callMember(BuildContext context) { // TODO: Implémenter l'appel téléphonique showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Appeler le membre'), content: Text('Voulez-vous appeler ${membre.prenom} ${membre.nom} au ${membre.telephone} ?'), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Annuler'), ), ElevatedButton( onPressed: () { Navigator.of(context).pop(); _showNotImplemented(context, 'Appel téléphonique'); }, child: const Text('Appeler'), ), ], ), ); } void _messageMember(BuildContext context) { // TODO: Implémenter l'envoi de SMS showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Envoyer un message'), content: Column( mainAxisSize: MainAxisSize.min, children: [ Text('Envoyer un SMS à ${membre.prenom} ${membre.nom} ?'), const SizedBox(height: 16), const TextField( decoration: InputDecoration( labelText: 'Message', border: OutlineInputBorder(), ), maxLines: 3, ), ], ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Annuler'), ), ElevatedButton( onPressed: () { Navigator.of(context).pop(); _showNotImplemented(context, 'Envoi de SMS'); }, child: const Text('Envoyer'), ), ], ), ); } void _emailMember(BuildContext context) { // TODO: Implémenter l'envoi d'email showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Envoyer un email'), content: Text('Ouvrir l\'application email pour envoyer un message à ${membre.email} ?'), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Annuler'), ), ElevatedButton( onPressed: () { Navigator.of(context).pop(); _showNotImplemented(context, 'Envoi d\'email'); }, child: const Text('Ouvrir'), ), ], ), ); } void _exportMember(BuildContext context) { // TODO: Implémenter l'export des données du membre showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Exporter les données'), content: Text('Exporter les données de ${membre.prenom} ${membre.nom} ?'), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Annuler'), ), ElevatedButton( onPressed: () { Navigator.of(context).pop(); _showNotImplemented(context, 'Export des données'); }, child: const Text('Exporter'), ), ], ), ); } void _deleteMember(BuildContext context) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Supprimer le membre'), content: Column( mainAxisSize: MainAxisSize.min, children: [ Icon( Icons.warning, color: AppTheme.errorColor, size: 48, ), const SizedBox(height: 16), Text( 'Êtes-vous sûr de vouloir supprimer ${membre.prenom} ${membre.nom} ?', textAlign: TextAlign.center, ), const SizedBox(height: 8), const Text( 'Cette action est irréversible.', style: TextStyle( color: AppTheme.errorColor, fontWeight: FontWeight.w600, ), textAlign: TextAlign.center, ), ], ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Annuler'), ), ElevatedButton( onPressed: () { Navigator.of(context).pop(); _showNotImplemented(context, 'Suppression du membre'); }, style: ElevatedButton.styleFrom( backgroundColor: AppTheme.errorColor, foregroundColor: Colors.white, ), child: const Text('Supprimer'), ), ], ), ); } void _copyToClipboard(BuildContext context, String text, String label) { Clipboard.setData(ClipboardData(text: text)); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('$label copié dans le presse-papiers'), duration: const Duration(seconds: 2), backgroundColor: AppTheme.successColor, ), ); } void _showNotImplemented(BuildContext context, String feature) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('$feature - Fonctionnalité à implémenter'), backgroundColor: AppTheme.infoColor, ), ); } }