import 'package:flutter/material.dart'; import 'package:logger/logger.dart'; import '../../domain/entities/friend.dart'; /// [FriendDetailScreen] affiche les détails d'un ami, incluant son nom, son image de profil, /// et une option pour envoyer un message. /// Utilisé lorsque l'utilisateur clique sur un ami pour voir plus de détails. class FriendDetailScreen extends StatelessWidget { final String friendFirstName; // Nom de l'ami final String friendLastName; final String imageUrl; // URL de l'image de profil de l'ami final String friendId; // ID de l'ami pour des actions futures final Logger _logger = Logger(); // Logger pour suivre les actions dans le terminal final FriendStatus status; final String lastInteraction; final String dateAdded; /// Constructeur de la classe [FriendDetailScreen]. FriendDetailScreen({ Key? key, required this.friendFirstName, required this.friendLastName, required this.imageUrl, required this.friendId, required this.status, required this.lastInteraction, required this.dateAdded, }) : super(key: key); /// Méthode statique pour lancer l'écran des détails d'un ami. static void open( BuildContext context, String friendId, String friendFirstName, String friendLastName, String imageUrl, FriendStatus status, String lastInteraction, String dateAdded) { Navigator.push( context, MaterialPageRoute( builder: (_) => FriendDetailScreen( friendId: friendId, friendFirstName: friendFirstName, friendLastName: friendLastName, imageUrl: imageUrl, status: status, lastInteraction: lastInteraction, dateAdded: dateAdded, ), ), ); } @override Widget build(BuildContext context) { _logger.i('[LOG] Affichage des détails de l\'ami : $friendFirstName (ID: $friendId)'); // Utilise `AssetImage` si `imageUrl` est vide ou ne contient pas d'URL valide. final imageProvider = imageUrl.isNotEmpty && Uri.tryParse(imageUrl)?.hasAbsolutePath == true ? NetworkImage(imageUrl) : const AssetImage('lib/assets/images/default_avatar.png') as ImageProvider; return Scaffold( appBar: AppBar( title: Text(friendFirstName), backgroundColor: Colors.teal.shade800, // Couleur de l'app bar elevation: 6, // Ombre sous l'app bar pour plus de profondeur ), body: Padding( padding: const EdgeInsets.all(16.0), // Espacement autour du contenu child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ // Animation Hero pour une transition fluide lors de la navigation Hero( tag: friendId, child: AnimatedContainer( duration: const Duration(milliseconds: 300), curve: Curves.easeInOut, child: CircleAvatar( radius: 80, backgroundImage: imageProvider, backgroundColor: Colors.grey.shade800, onBackgroundImageError: (error, stackTrace) { _logger.e('[ERROR] Erreur lors du chargement de l\'image pour $friendFirstName (ID: $friendId): $error'); }, child: imageUrl.isEmpty ? const Icon(Icons.person, size: 60, color: Colors.white) : null, ), ), ), const SizedBox(height: 16), // Affichage du nom de l'ami avec une meilleure hiérarchie visuelle Text( '$friendFirstName $friendLastName', style: const TextStyle( fontSize: 28, fontWeight: FontWeight.bold, color: Colors.white, ), ), const SizedBox(height: 8), Text( status.name.toUpperCase(), style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, color: status == FriendStatus.accepted ? Colors.green.shade400 : status == FriendStatus.pending ? Colors.orange.shade400 : Colors.red.shade400, ), ), const SizedBox(height: 20), // Affichage des informations supplémentaires _buildInfoRow('Dernière interaction:', lastInteraction), _buildInfoRow('Date d\'ajout:', dateAdded), const SizedBox(height: 30), // Espacement avant le bouton // Bouton pour envoyer un message à l'ami avec animation ElevatedButton.icon( onPressed: () { _logger.i('[LOG] Envoi d\'un message à $friendFirstName (ID: $friendId)'); // Logique future pour envoyer un message à l'ami }, icon: const Icon(Icons.message), label: const Text('Envoyer un message'), style: ElevatedButton.styleFrom( backgroundColor: Colors.teal, // Couleur du bouton foregroundColor: Colors.white, // Couleur du texte et icône shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30), // Coins arrondis ), padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), elevation: 5, // Ombre pour effet de survol ), ), ], ), ), ), ); } /// Widget réutilisable pour afficher une ligne d'information avec un texte d'introduction et une valeur. Widget _buildInfoRow(String label, String value) { return Padding( padding: const EdgeInsets.only(bottom: 12.0), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Text( label, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.white, ), ), const SizedBox(width: 8), Text( value, style: const TextStyle( fontSize: 16, color: Colors.white70, // Couleur plus claire pour les valeurs ), ), ], ), ); } }