/// Persistance du didacticiel : mémorise les visites guidées déjà vues. /// /// Chaque visite guidée (« tour ») possède un identifiant stocké dans les /// SharedPreferences sous la forme `tutorial_done_`. Réinitialiser le /// didacticiel depuis les paramètres efface simplement ces clés. library; import 'package:shared_preferences/shared_preferences.dart'; /// Identifiants des visites guidées de l'application. class TutorialTours { const TutorialTours._(); /// Visite d'accueil : présentation générale et navigation. static const String home = 'home'; /// Visite de l'éditeur d'impacts : tap, appui long et pincement pour zoomer. static const String impactEditor = 'impact_editor'; /// Toutes les visites connues, dans l'ordre logique de découverte. static const List all = [home, impactEditor]; } class TutorialService { static const String _prefix = 'tutorial_done_'; Future> loadCompletedTours() async { final prefs = await SharedPreferences.getInstance(); return TutorialTours.all .where((id) => prefs.getBool('$_prefix$id') ?? false) .toSet(); } Future markCompleted(String tourId) async { final prefs = await SharedPreferences.getInstance(); await prefs.setBool('$_prefix$tourId', true); } /// Efface la mémoire du didacticiel : toutes les visites seront rejouées. Future resetAll() async { final prefs = await SharedPreferences.getInstance(); for (final id in TutorialTours.all) { await prefs.remove('$_prefix$id'); } } }