import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../../data/providers/friends_provider.dart'; import '../../widgets/friend_detail_screen.dart'; import '../../widgets/friends_circle.dart'; import '../../widgets/search_friends.dart'; /// [FriendsScreen] est l'écran principal permettant d'afficher et de gérer la liste des amis. /// Il inclut des fonctionnalités de pagination, de recherche, et de rafraîchissement manuel de la liste. class FriendsScreen extends StatefulWidget { final String userId; // Identifiant de l'utilisateur pour récupérer ses amis const FriendsScreen({Key? key, required this.userId}) : super(key: key); @override _FriendsScreenState createState() => _FriendsScreenState(); } class _FriendsScreenState extends State { late ScrollController _scrollController; @override void initState() { super.initState(); // Initialisation du contrôleur de défilement pour la gestion de la pagination. _scrollController = ScrollController(); _scrollController.addListener(_onScroll); // Log pour indiquer le début du chargement des amis debugPrint("[LOG] Initialisation de la page : chargement des amis pour l'utilisateur ${widget.userId}"); // Chargement initial de la liste d'amis Provider.of(context, listen: false).fetchFriends(widget.userId); } @override void dispose() { // Nettoyage du contrôleur de défilement pour éviter les fuites de mémoire. _scrollController.removeListener(_onScroll); _scrollController.dispose(); super.dispose(); debugPrint("[LOG] Dispose : contrôleur de défilement supprimé"); } /// Méthode déclenchée lors du défilement de la liste. /// Vérifie si l'utilisateur a atteint le bas de la liste pour charger plus d'amis. void _onScroll() { final provider = Provider.of(context, listen: false); if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !provider.isLoading && provider.hasMore) { debugPrint("[LOG] Scroll : fin de liste atteinte, chargement de la page suivante"); // Charger plus d'amis si on atteint la fin de la liste provider.fetchFriends(widget.userId); } } @override Widget build(BuildContext context) { // Accès au fournisseur pour gérer les données et les états des amis. final friendsProvider = Provider.of(context, listen: false); return Scaffold( appBar: AppBar( title: const Text('Mes Amis'), actions: [ IconButton( icon: const Icon(Icons.refresh), onPressed: () { // Log de l'action de rafraîchissement debugPrint("[LOG] Bouton Refresh : demande de rafraîchissement de la liste des amis"); // Rafraîchir la liste des amis friendsProvider.fetchFriends(widget.userId); }, ), ], ), body: SafeArea( child: Column( children: [ const Padding( padding: EdgeInsets.all(8.0), // Widget pour la recherche d'amis child: SearchFriends(), ), Expanded( // Construction de la liste d'amis basée sur l'état du FriendsProvider child: Consumer( builder: (context, friendsProvider, child) { // Si le chargement est en cours et qu'il n'y a aucun ami, afficher un indicateur de chargement. if (friendsProvider.isLoading && friendsProvider.friendsList.isEmpty) { debugPrint("[LOG] Chargement : affichage de l'indicateur de progression"); return const Center(child: CircularProgressIndicator()); } // Si la liste est vide après le chargement, afficher un message indiquant qu'aucun ami n'a été trouvé. if (friendsProvider.friendsList.isEmpty) { debugPrint("[LOG] Liste vide : Aucun ami trouvé"); return const Center( child: Text('Aucun ami trouvé'), ); } // Affichage de la grille des amis debugPrint("[LOG] Affichage de la grille des amis (nombre d'amis : ${friendsProvider.friendsList.length})"); return GridView.builder( controller: _scrollController, padding: const EdgeInsets.all(16), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, mainAxisSpacing: 10, crossAxisSpacing: 10, ), itemCount: friendsProvider.friendsList.length, itemBuilder: (context, index) { final friend = friendsProvider.friendsList[index]; debugPrint("[LOG] Affichage de l'ami à l'index $index avec ID : ${friend.friendId}"); return FriendsCircle( friend: friend, onTap: () { // Log pour l'action de visualisation des détails d'un ami debugPrint("[LOG] Détail : Affichage des détails de l'ami ID : ${friend.friendId}"); // Naviguer vers l'écran des détails de l'ami FriendDetailScreen.open( context, friend.friendId, friend.firstName ?? 'Ami inconnu', friend.imageUrl ?? '', ); }, ); }, ); }, ), ), ], ), ), ); } }