Refactoring + Checkpoint

This commit is contained in:
DahoudG
2024-11-17 23:00:18 +00:00
parent 1e888f41e8
commit 77ab8a02a2
56 changed files with 1904 additions and 790 deletions

View File

@@ -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),
),
);
},
);
}