Add new activity events and enhance ActivityBloc for better state management

- Introduced LoadTripActivitiesPreservingSearch event to load trip activities while preserving search results.
- Added RemoveFromSearchResults and AddActivityAndRemoveFromSearch events for improved activity handling.
- Updated ActivitiesPage to show loading dialog during activity addition and provide user feedback.
- Increased maxResults for activity search to load more activities.
This commit is contained in:
Dayron
2025-11-13 10:46:36 +01:00
parent 236327f6fa
commit dd8de46e71
4 changed files with 209 additions and 41 deletions

View File

@@ -7,6 +7,7 @@ import '../../models/trip.dart';
import '../../models/activity.dart';
import '../../services/activity_cache_service.dart';
import '../activities/add_activity_bottom_sheet.dart';
import '../loading/laoding_content.dart';
class ActivitiesPage extends StatefulWidget {
final Trip trip;
@@ -138,6 +139,37 @@ class _ActivitiesPageState extends State<ActivitiesPage>
);
}
if (state is ActivityAdded) {
// Fermer le dialog de loading
if (Navigator.of(context).canPop()) {
Navigator.of(context).pop();
}
// Ajouter l'activité à la liste locale des activités du voyage
WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() {
_tripActivities.add(state.activity);
});
// Afficher un feedback de succès
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('${state.activity.name} ajoutée au voyage !'),
duration: const Duration(seconds: 2),
backgroundColor: Colors.green,
action: SnackBarAction(
label: 'Voir',
textColor: Colors.white,
onPressed: () {
// Revenir à l'onglet des activités du voyage
_tabController.animateTo(0);
},
),
),
);
});
}
if (state is ActivityLoaded) {
// Stocker les activités localement
WidgetsBinding.instance.addPostFrameCallback((_) {
@@ -172,11 +204,6 @@ class _ActivitiesPageState extends State<ActivitiesPage>
// Recharger les activités du voyage pour mettre à jour les votes
_loadActivities();
}
if (state is ActivityAdded) {
// Recharger automatiquement les activités du voyage
_loadActivities();
}
},
child: Scaffold(
backgroundColor: theme.colorScheme.surface,
@@ -754,21 +781,6 @@ class _ActivitiesPageState extends State<ActivitiesPage>
),
),
),
// Bouton de debug temporaire
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(horizontal: 16),
child: OutlinedButton.icon(
onPressed: () {
_checkAndLoadMoreActivitiesIfNeeded();
},
icon: const Icon(Icons.bug_report, size: 16),
label: const Text('🧪 Test Auto-Reload'),
style: OutlinedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 8),
),
),
),
],
),
],
@@ -1264,23 +1276,32 @@ class _ActivitiesPageState extends State<ActivitiesPage>
id: DateTime.now().millisecondsSinceEpoch.toString(),
);
context.read<ActivityBloc>().add(AddActivity(newActivity));
// Afficher un feedback à l'utilisateur
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('${activity.name} ajoutée au voyage !'),
duration: const Duration(seconds: 2),
backgroundColor: Colors.green,
action: SnackBarAction(
label: 'Voir',
textColor: Colors.white,
onPressed: () {
// Revenir à l'onglet des activités du voyage
_tabController.animateTo(0);
// Afficher le LoadingContent avec la tâche d'ajout
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext dialogContext) {
return LoadingContent(
loadingText: 'Ajout de ${activity.name}...',
onBackgroundTask: () async {
// Ajouter l'activité au voyage
context.read<ActivityBloc>().add(
AddActivityAndRemoveFromSearch(
activity: newActivity,
googleActivityId: activity.id,
),
);
// Attendre que l'ajout soit complété
await Future.delayed(const Duration(milliseconds: 1000));
},
),
),
onComplete: () {
// Fermer le dialog quand l'ajout est complété
if (Navigator.of(context).canPop()) {
Navigator.of(context).pop();
}
},
);
},
);
}