feat: Add geocoding functionality for trips and enhance activity search with coordinates

This commit is contained in:
Dayron
2025-11-04 20:47:26 +01:00
parent f6c8432335
commit 9cb21c3470
9 changed files with 421 additions and 56 deletions

View File

@@ -23,6 +23,7 @@ class ActivityBloc extends Bloc<ActivityEvent, ActivityState> {
on<LoadActivities>(_onLoadActivities);
on<SearchActivities>(_onSearchActivities);
on<SearchActivitiesWithCoordinates>(_onSearchActivitiesWithCoordinates);
on<SearchActivitiesByText>(_onSearchActivitiesByText);
on<AddActivity>(_onAddActivity);
on<AddActivitiesBatch>(_onAddActivitiesBatch);
@@ -98,6 +99,50 @@ class ActivityBloc extends Bloc<ActivityEvent, ActivityState> {
}
}
/// Handles searching activities using coordinates directly (bypasses geocoding)
Future<void> _onSearchActivitiesWithCoordinates(
SearchActivitiesWithCoordinates event,
Emitter<ActivityState> emit,
) async {
try {
// Si c'est un append (charger plus), on garde l'état actuel et on met isLoading à true
if (event.appendToExisting && state is ActivitySearchResults) {
final currentState = state as ActivitySearchResults;
emit(currentState.copyWith(isLoading: true));
} else {
emit(const ActivitySearching());
}
final searchResults = await _placesService.searchActivitiesPaginated(
latitude: event.latitude,
longitude: event.longitude,
tripId: event.tripId,
category: event.category,
pageSize: event.maxResults ?? 20,
);
final activities = searchResults['activities'] as List<Activity>;
List<Activity> finalResults;
// Si on doit ajouter aux résultats existants
if (event.appendToExisting && state is ActivitySearchResults) {
final currentState = state as ActivitySearchResults;
finalResults = [...currentState.searchResults, ...activities];
} else {
finalResults = activities;
}
emit(ActivitySearchResults(
searchResults: finalResults,
query: event.category?.displayName ?? 'Toutes les activités',
isLoading: false,
));
} catch (e) {
_errorService.logError('activity_bloc', 'Erreur recherche activités avec coordonnées: $e');
emit(const ActivityError('Impossible de rechercher les activités'));
}
}
/// Handles text-based activity search
Future<void> _onSearchActivitiesByText(
SearchActivitiesByText event,