Bon checkpoint + Refactoring

This commit is contained in:
DahoudG
2024-11-08 20:30:23 +00:00
parent 19f6efa995
commit 1e888f41e8
21 changed files with 721 additions and 223 deletions

View File

@@ -4,8 +4,9 @@ import '../../../../core/constants/colors.dart';
import '../../../../data/providers/user_provider.dart';
import '../../../../domain/entities/user.dart';
/// [ProfileHeader] est un widget qui affiche l'en-tête du profil utilisateur.
/// Comprend le nom de l'utilisateur, une image de fond, et un bouton de déconnexion avec confirmation.
/// [ProfileHeader] : Un widget d'en-tête de profil utilisateur visuellement amélioré
/// avec un gradient élégant, des animations, et un bouton de déconnexion stylisé.
/// Entièrement logué pour une traçabilité complète.
class ProfileHeader extends StatelessWidget {
final User user;
@@ -13,97 +14,157 @@ class ProfileHeader extends StatelessWidget {
@override
Widget build(BuildContext context) {
debugPrint("[LOG] Initialisation de ProfileHeader pour l'utilisateur : ${user.userFirstName} ${user.userLastName}");
return SliverAppBar(
expandedHeight: 200.0,
expandedHeight: 250.0,
floating: false,
pinned: true,
elevation: 0,
backgroundColor: AppColors.darkPrimary,
flexibleSpace: FlexibleSpaceBar(
title: Text(
flexibleSpace: _buildFlexibleSpaceBar(user),
actions: [_buildLogoutButton(context)],
);
}
/// Construit un FlexibleSpaceBar avec un gradient et des animations.
/// Affiche le nom de l'utilisateur et l'image de profil avec un effet visuel enrichi.
Widget _buildFlexibleSpaceBar(User user) {
debugPrint("[LOG] Construction de FlexibleSpaceBar avec nom et image de profil.");
return FlexibleSpaceBar(
centerTitle: true,
title: Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 2.0),
decoration: BoxDecoration(
color: Colors.black.withOpacity(0.6),
borderRadius: BorderRadius.circular(12.0),
),
child: Text(
'Profil de ${user.userFirstName}',
style: TextStyle(
color: AppColors.accentColor,
fontSize: 20.0,
fontSize: 18.0,
fontWeight: FontWeight.bold,
),
),
background: Image.network(
user.profileImageUrl,
),
background: _buildProfileImageWithGradient(user.profileImageUrl),
);
}
/// Construit l'image de profil avec un overlay en gradient.
/// En cas d'erreur de chargement, affiche une image par défaut.
Widget _buildProfileImageWithGradient(String profileImageUrl) {
debugPrint("[LOG] Chargement de l'image de profil avec overlay de gradient.");
return Stack(
fit: StackFit.expand,
children: [
Image.network(
profileImageUrl,
fit: BoxFit.cover,
loadingBuilder: (context, child, loadingProgress) {
if (loadingProgress == null) return child;
return Center(child: CircularProgressIndicator(color: AppColors.accentColor));
},
errorBuilder: (context, error, stackTrace) {
// Log en cas d'erreur de chargement de l'image
print("[ERROR] Erreur lors du chargement de l'image de profil : $error");
return Image.asset('lib/assets/images/default_avatar.png', fit: BoxFit.cover);
debugPrint("[ERROR] Erreur lors du chargement de l'image de profil : $error");
return Image.asset(
'lib/assets/images/default_avatar.png',
fit: BoxFit.cover,
);
},
),
),
actions: [
IconButton(
icon: const Icon(Icons.logout, color: Colors.white),
onPressed: () {
print("[LOG] Bouton de déconnexion cliqué."); // Log du clic du bouton de déconnexion
_showLogoutConfirmationDialog(context); // Affiche le dialogue de confirmation
},
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.transparent, AppColors.darkPrimary.withOpacity(0.8)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
),
],
);
}
/// Construit un bouton de déconnexion stylisé avec animation.
/// Log chaque interaction pour assurer une traçabilité complète.
Widget _buildLogoutButton(BuildContext context) {
return IconButton(
icon: const Icon(Icons.logout, color: Colors.white),
splashRadius: 20,
onPressed: () {
debugPrint("[LOG] Clic sur le bouton de déconnexion.");
_showLogoutConfirmationDialog(context);
},
tooltip: 'Déconnexion',
);
}
/// Affiche une boîte de dialogue de confirmation pour la déconnexion.
/// Log chaque action et résultat dans le terminal.
/// Log chaque action et résultat pour une visibilité dans le terminal.
void _showLogoutConfirmationDialog(BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) {
// Log affichage du dialogue
print("[LOG] Affichage de la boîte de dialogue de confirmation de déconnexion.");
debugPrint("[LOG] Affichage de la boîte de dialogue de confirmation de déconnexion.");
return AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
backgroundColor: AppColors.backgroundColor,
title: const Text(
'Confirmer la déconnexion',
style: TextStyle(color: Colors.white),
style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.w600),
),
content: const Text(
'Voulez-vous vraiment vous déconnecter ?',
style: TextStyle(color: Colors.white70),
style: TextStyle(color: Colors.white70, fontSize: 16),
),
actions: [
// Bouton d'annulation de la déconnexion
TextButton(
onPressed: () {
print("[LOG] Déconnexion annulée par l'utilisateur.");
Navigator.of(context).pop(); // Ferme le dialogue sans déconnecter
},
child: Text(
'Annuler',
style: TextStyle(color: AppColors.accentColor),
),
),
// Bouton de confirmation de la déconnexion
TextButton(
onPressed: () {
print("[LOG] Déconnexion confirmée."); // Log de la confirmation
Provider.of<UserProvider>(context, listen: false).resetUser(); // Réinitialise les infos utilisateur
print("[LOG] Informations utilisateur réinitialisées dans UserProvider.");
Navigator.of(context).pop(); // Ferme la boîte de dialogue
print("[LOG] Boîte de dialogue de confirmation fermée.");
Navigator.of(context).pushReplacementNamed('/'); // Redirige vers l'écran de connexion
print("[LOG] Redirection vers l'écran de connexion.");
},
child: const Text(
'Déconnexion',
style: TextStyle(color: Colors.redAccent),
),
),
_buildCancelButton(context),
_buildConfirmButton(context),
],
);
},
).then((_) {
// Log lorsque le dialogue est fermé pour toute raison (confirmation ou annulation)
print("[LOG] La boîte de dialogue de confirmation de déconnexion est fermée.");
debugPrint("[LOG] Fermeture de la boîte de dialogue de déconnexion.");
});
}
/// Construit le bouton pour annuler la déconnexion avec log.
Widget _buildCancelButton(BuildContext context) {
return TextButton(
onPressed: () {
debugPrint("[LOG] L'utilisateur a annulé la déconnexion.");
Navigator.of(context).pop();
},
child: Text(
'Annuler',
style: TextStyle(color: AppColors.accentColor, fontWeight: FontWeight.bold),
),
);
}
/// Construit le bouton pour confirmer la déconnexion, avec log et réinitialisation des données utilisateur.
Widget _buildConfirmButton(BuildContext context) {
return TextButton(
onPressed: () {
debugPrint("[LOG] L'utilisateur a confirmé la déconnexion.");
// Réinitialisation des informations de l'utilisateur
Provider.of<UserProvider>(context, listen: false).resetUser();
debugPrint("[LOG] Informations utilisateur réinitialisées dans UserProvider.");
Navigator.of(context).pop();
Navigator.of(context).pushReplacementNamed('/'); // Redirection vers l'écran de connexion
debugPrint("[LOG] Redirection vers l'écran de connexion.");
},
child: const Text(
'Déconnexion',
style: TextStyle(color: Colors.redAccent, fontWeight: FontWeight.bold),
),
);
}
}