Refactoring + Checkpoint
This commit is contained in:
@@ -1,7 +1,14 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:afterwork/core/constants/colors.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../../core/theme/theme_provider.dart';
|
||||
|
||||
void showEventOptions(BuildContext context, GlobalKey key) {
|
||||
final RenderBox renderBox = key.currentContext!.findRenderObject() as RenderBox;
|
||||
// Obtient la position de l'élément pour afficher le menu contextuel
|
||||
final RenderBox renderBox =
|
||||
key.currentContext!.findRenderObject() as RenderBox;
|
||||
final Offset offset = renderBox.localToGlobal(Offset.zero);
|
||||
final RelativeRect position = RelativeRect.fromLTRB(
|
||||
offset.dx,
|
||||
@@ -10,76 +17,150 @@ void showEventOptions(BuildContext context, GlobalKey key) {
|
||||
offset.dy + renderBox.size.height,
|
||||
);
|
||||
|
||||
// Affiche le menu contextuel avec des options personnalisées
|
||||
showMenu(
|
||||
context: context,
|
||||
position: position,
|
||||
items: [
|
||||
PopupMenuItem(
|
||||
value: 'details',
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(Icons.info_outline, color: Colors.blue.shade400, size: 18), // Icône plus petite et bleue
|
||||
const SizedBox(width: 10),
|
||||
Text(
|
||||
'Voir les détails',
|
||||
style: TextStyle(
|
||||
color: Colors.blue.shade700, // Texte bleu foncé
|
||||
fontWeight: FontWeight.w500, // Poids de police plus fin
|
||||
fontSize: 14, // Taille légèrement réduite
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
_buildElegantMenuItem(
|
||||
icon: Icons.info_outline,
|
||||
label: 'Voir les détails',
|
||||
color: AppColors.primary, // Utilise la couleur primaire dynamique
|
||||
onTap: () {
|
||||
print('Voir les détails');
|
||||
// Log d'action pour suivre l'interaction utilisateur
|
||||
},
|
||||
),
|
||||
PopupMenuItem(
|
||||
value: 'edit',
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(Icons.edit, color: Colors.orange.shade400, size: 18),
|
||||
const SizedBox(width: 10),
|
||||
Text(
|
||||
'Modifier l\'événement',
|
||||
style: TextStyle(
|
||||
color: Colors.orange.shade700,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 14,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
_buildElegantMenuItem(
|
||||
icon: Icons.edit,
|
||||
label: 'Modifier l\'événement',
|
||||
color: AppColors.secondary, // Utilise la couleur secondaire dynamique
|
||||
onTap: () {
|
||||
print('Modifier l\'événement');
|
||||
},
|
||||
),
|
||||
PopupMenuItem(
|
||||
value: 'delete',
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(Icons.delete_outline, color: Colors.red.shade400, size: 18),
|
||||
const SizedBox(width: 10),
|
||||
Text(
|
||||
'Supprimer l\'événement',
|
||||
style: TextStyle(
|
||||
color: Colors.red.shade700,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 14,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
_buildElegantMenuItem(
|
||||
icon: Icons.delete_outline,
|
||||
label: 'Supprimer l\'événement',
|
||||
color: AppColors.errorColor, // Utilise la couleur d'erreur dynamique
|
||||
onTap: () {
|
||||
_showDeleteConfirmation(context);
|
||||
},
|
||||
),
|
||||
],
|
||||
elevation: 5.0, // Réduction de l'élévation pour une ombre plus subtile
|
||||
elevation: 12.0, // Niveau d'élévation du menu pour une ombre modérée
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10.0), // Ajout de bordures arrondies
|
||||
side: BorderSide(color: Colors.grey.shade300), // Bordure fine et douce
|
||||
borderRadius: BorderRadius.circular(20.0), // Coins arrondis pour un look moderne
|
||||
),
|
||||
color: Colors.white, // Fond blanc pur pour un contraste élégant
|
||||
color: AppColors.customBackgroundColor, // Surface dynamique selon le thème
|
||||
).then((value) {
|
||||
// Gérer les actions en fonction de la sélection
|
||||
if (value == 'details') {
|
||||
print('Voir les détails');
|
||||
} else if (value == 'edit') {
|
||||
print('Modifier l\'événement');
|
||||
} else if (value == 'delete') {
|
||||
print('Supprimer l\'événement');
|
||||
if (value != null) {
|
||||
HapticFeedback.lightImpact(); // Retour haptique pour une meilleure UX
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Construction d'un élément de menu stylisé
|
||||
PopupMenuItem _buildElegantMenuItem({
|
||||
required IconData icon,
|
||||
required String label,
|
||||
required Color color,
|
||||
required VoidCallback onTap,
|
||||
}) {
|
||||
return PopupMenuItem(
|
||||
value: label,
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
onTap();
|
||||
},
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
color: AppColors.cardColor, // Couleur de fond dynamique du conteneur
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(icon, color: color, size: 15), // Icône avec couleur personnalisée
|
||||
const SizedBox(width: 12),
|
||||
Expanded(
|
||||
child: Text(
|
||||
label,
|
||||
style: TextStyle(
|
||||
color: color, // Couleur de texte dynamique
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _showDeleteConfirmation(BuildContext context) {
|
||||
// Récupère le thème sans écoute, car la fonction est appelée en dehors de l'arbre de widgets.
|
||||
final themeProvider = Provider.of<ThemeProvider>(context, listen: false);
|
||||
|
||||
// Affiche une boîte de dialogue pour confirmer la suppression
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Row(
|
||||
children: [
|
||||
Icon(Icons.warning_amber_rounded, color: AppColors.errorColor),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
'Supprimer l\'événement',
|
||||
style: TextStyle(
|
||||
color: AppColors.errorColor, // Utilisation de la couleur d'erreur dynamique
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
content: Text(
|
||||
'Voulez-vous vraiment supprimer cet événement ? Cette action est irréversible.',
|
||||
style: TextStyle(
|
||||
color: themeProvider.isDarkMode ? AppColors.lightOnPrimary : AppColors.darkPrimary, // Texte principal dynamique
|
||||
fontSize: 15,
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
style: ButtonStyle(
|
||||
overlayColor: MaterialStateProperty.all(Colors.grey.shade200),
|
||||
),
|
||||
child: Text('Annuler', style: TextStyle(color: Colors.grey.shade700)),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
ElevatedButton.icon(
|
||||
icon: Icon(Icons.delete, color: themeProvider.isDarkMode ? AppColors.darkPrimary : AppColors.lightOnPrimary, size: 18),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.errorColor, // Bouton de suppression en couleur d'erreur
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8.0),
|
||||
),
|
||||
textStyle: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
label: Text('Supprimer'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
print('Événement supprimé');
|
||||
// Logique de suppression réelle ici
|
||||
},
|
||||
),
|
||||
],
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user