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); // Ajout d'une marge de 200 pixels pour détecter le bas de la liste plus tôt if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 200 && !provider.isLoading && provider.hasMore) { debugPrint("[LOG] Scroll : Fin de liste atteinte, chargement de la page suivante."); provider.fetchFriends(widget.userId, loadMore: true); } } @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: () { if (!friendsProvider.isLoading) { debugPrint("[LOG] Bouton Refresh : demande de rafraîchissement de la liste des amis"); friendsProvider.fetchFriends(widget.userId); } else { debugPrint("[LOG] Rafraîchissement en cours, action ignorée."); } }, ), ], ), 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 + (friendsProvider.isLoading && friendsProvider.hasMore ? 1 : 0), itemBuilder: (context, index) { if (index >= friendsProvider.friendsList.length) { return const Center(child: CircularProgressIndicator()); } final friend = friendsProvider.friendsList[index]; debugPrint("[LOG] Affichage de l'ami à l'index $index avec ID : ${friend.friendId}"); return FriendsCircle( friend: friend, onTap: () { debugPrint("[LOG] Détail : Affichage des détails de l'ami ID : ${friend.friendId}"); FriendDetailScreen.open( context, friend.friendId, friend.friendFirstName, friend.imageUrl ?? '', ); }, ); }, ); }, ), ), ], ), ), ); } }