import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/load_config_provider.dart'; import '../theme/etm_tokens.dart'; /// **Quitter un écran avec un brouillon en attente** — demander, jamais décider seul. /// /// ## Pourquoi une alerte, et pas un abandon silencieux /// /// Le brouillon vit dans `LoadConfigProvider`, pas dans l'écran : il **survit** à la /// navigation. Quitter sans rien dire laissait donc une configuration modifiée en attente, /// invisible, qui réapparaissait au retour — ou disparaissait à la première relecture de la /// box (`LoadConfigChanged`, reconnexion), sans que personne ait choisi. /// /// Les deux issues sont mauvaises pour la même raison : **l'utilisateur ne sait pas ce /// qu'il laisse derrière lui.** L'alerte rend le choix explicite, et le fait porter à qui /// de droit. /// /// ## Ce que chaque bouton fait vraiment /// /// - **Rester** : rien ne bouge, le brouillon reste, l'écran non plus. /// - **Quitter sans enregistrer** : le brouillon est **abandonné** (`discardDraft`), et /// l'écran se ferme. C'est délibérément destructeur — un brouillon fantôme qui ressort /// trois écrans plus loin est pire qu'une modification perdue qu'on a acceptée de perdre. /// /// Aucune écriture n'est proposée ici : enregistrer depuis une boîte de dialogue de sortie /// ferait partir une configuration que l'utilisateur n'a pas relue. class GardeBrouillon extends StatelessWidget { final Widget child; const GardeBrouillon({super.key, required this.child}); @override Widget build(BuildContext context) { final provider = context.watch(); return PopScope( canPop: !provider.hasPendingChanges, onPopInvokedWithResult: (didPop, _) async { if (didPop) return; final partir = await _demander(context); if (partir != true || !context.mounted) return; provider.discardDraft(); Navigator.of(context).pop(); }, child: child, ); } Future _demander(BuildContext context) => showDialog( context: context, builder: (ctx) => AlertDialog( title: const Text('Modifications non enregistrées'), content: const Text( 'Vos changements n\'ont pas été envoyés à la box : elle porte toujours la ' 'configuration d\'avant.\n\n' 'Quitter maintenant les abandonne.', ), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, false), child: const Text('Rester'), ), FilledButton( style: FilledButton.styleFrom(backgroundColor: EtmTokens.danger), onPressed: () => Navigator.pop(ctx, true), child: const Text('Quitter sans enregistrer'), ), ], ), ); }