import 'package:flutter/material.dart'; /// Widget d'overlay de chargement qui affiche un spinner centré avec un message optionnel /// Utilisé pour les opérations longues comme la connexion, déconnexion et synchronisation class LoadingOverlay extends StatelessWidget { final String? message; final Color backgroundColor; final Color spinnerColor; final Color textColor; final double spinnerSize; final double strokeWidth; const LoadingOverlay({ Key? key, this.message, this.backgroundColor = Colors.black54, this.spinnerColor = Colors.white, this.textColor = Colors.white, this.spinnerSize = 60.0, this.strokeWidth = 5.0, }) : super(key: key); @override Widget build(BuildContext context) { return Container( color: backgroundColor, child: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ SizedBox( width: spinnerSize, height: spinnerSize, child: CircularProgressIndicator( valueColor: AlwaysStoppedAnimation(spinnerColor), strokeWidth: strokeWidth, ), ), if (message != null) ...[ // Afficher le texte seulement si message n'est pas null const SizedBox(height: 24), Text( message!, style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: textColor, ), textAlign: TextAlign.center, ), ], ], ), ), ); } /// Méthode statique pour afficher l'overlay de chargement static Future show({ required BuildContext context, required Future future, String? message, double spinnerSize = 60.0, double strokeWidth = 5.0, }) async { // Afficher l'overlay final overlayEntry = OverlayEntry( builder: (context) => LoadingOverlay( message: message, spinnerSize: spinnerSize, strokeWidth: strokeWidth, ), ); Overlay.of(context).insert(overlayEntry); try { // Attendre que le future se termine final result = await future; // Supprimer l'overlay overlayEntry.remove(); return result; } catch (e) { // En cas d'erreur, supprimer l'overlay et relancer l'erreur overlayEntry.remove(); rethrow; } } }