import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../repositories/trip_repository.dart'; import 'trip_event.dart'; import 'trip_state.dart'; import '../../data/models/trip.dart'; class TripBloc extends Bloc { final TripRepository _tripRepository; StreamSubscription? _tripsSubscription; TripBloc({required TripRepository tripRepository}) : _tripRepository = tripRepository, super(TripInitial()) { on(_onLoadRequested); on(_onCreateRequested); on(_onUpdateRequested); on(_onDeleteRequested); on(_onParticipantAddRequested); on(_onParticipantRemoveRequested); } Future _onLoadRequested( TripLoadRequested event, Emitter emit, ) async { emit(TripLoading()); await _tripsSubscription?.cancel(); _tripsSubscription = _tripRepository.getUserTrips(event.userId).listen( (trips) => add(const _TripUpdated(trips: [])), // Sera géré par un événement interne onError: (error) => emit(TripError(message: error.toString())), ); } Future _onCreateRequested( TripCreateRequested event, Emitter emit, ) async { try { await _tripRepository.createTrip(event.trip); emit(const TripOperationSuccess(message: 'Voyage créé avec succès')); } catch (e) { emit(TripError(message: e.toString())); } } Future _onUpdateRequested( TripUpdateRequested event, Emitter emit, ) async { try { await _tripRepository.updateTrip(event.trip); emit(const TripOperationSuccess(message: 'Voyage mis à jour')); } catch (e) { emit(TripError(message: e.toString())); } } Future _onDeleteRequested( TripDeleteRequested event, Emitter emit, ) async { try { await _tripRepository.deleteTrip(event.tripId); emit(const TripOperationSuccess(message: 'Voyage supprimé')); } catch (e) { emit(TripError(message: e.toString())); } } Future _onParticipantAddRequested( TripParticipantAddRequested event, Emitter emit, ) async { try { await _tripRepository.addParticipant( event.tripId, event.participantEmail, ); emit(const TripOperationSuccess(message: 'Participant ajouté')); } catch (e) { emit(TripError(message: e.toString())); } } Future _onParticipantRemoveRequested( TripParticipantRemoveRequested event, Emitter emit, ) async { try { await _tripRepository.removeParticipant( event.tripId, event.participantEmail, ); emit(const TripOperationSuccess(message: 'Participant retiré')); } catch (e) { emit(TripError(message: e.toString())); } } @override Future close() { _tripsSubscription?.cancel(); return super.close(); } } // Événement interne pour les mises à jour du stream class _TripUpdated extends TripEvent { final List trips; const _TripUpdated({required this.trips}); @override List get props => [trips]; }