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:
@@ -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();
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ class _ShowTripDetailsContentState extends State<ShowTripDetailsContent> {
|
||||
return; // Utiliser le cache
|
||||
}
|
||||
|
||||
// Sinon, lancer la recherche
|
||||
// Sinon, lancer la recherche avec le maximum d'activités
|
||||
context.read<ActivityBloc>().add(
|
||||
widget.trip.hasCoordinates
|
||||
? SearchActivitiesWithCoordinates(
|
||||
@@ -50,14 +50,14 @@ class _ShowTripDetailsContentState extends State<ShowTripDetailsContent> {
|
||||
latitude: widget.trip.latitude!,
|
||||
longitude: widget.trip.longitude!,
|
||||
category: null,
|
||||
maxResults: 6,
|
||||
maxResults: 100, // Charger le maximum d'activités possible
|
||||
reset: true,
|
||||
)
|
||||
: SearchActivities(
|
||||
tripId: widget.trip.id!,
|
||||
destination: widget.trip.location,
|
||||
category: null,
|
||||
maxResults: 6,
|
||||
maxResults: 100, // Charger le maximum d'activités possible
|
||||
reset: true,
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user