- Ajout système complet de gestion des secteurs avec contours géographiques - Import des contours départementaux depuis GeoJSON - API REST pour la gestion des secteurs (/api/sectors) - Service de géolocalisation pour déterminer les secteurs - Migration base de données avec tables x_departements_contours et sectors_adresses - Interface Flutter pour visualisation et gestion des secteurs - Ajout thème sombre dans l'application - Corrections diverses et optimisations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
90 lines
2.4 KiB
Dart
Executable File
90 lines
2.4 KiB
Dart
Executable File
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({
|
|
super.key,
|
|
this.message,
|
|
this.backgroundColor = Colors.black54,
|
|
this.spinnerColor = Colors.white,
|
|
this.textColor = Colors.white,
|
|
this.spinnerSize = 60.0,
|
|
this.strokeWidth = 5.0,
|
|
});
|
|
|
|
@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<Color>(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<T> show<T>({
|
|
required BuildContext context,
|
|
required Future<T> 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;
|
|
}
|
|
}
|
|
}
|