import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:travel_mate/models/trip.dart'; import 'trip_event.dart'; import 'trip_state.dart'; import '../../repositories/trip_repository.dart'; class TripBloc extends Bloc { final TripRepository _repository; StreamSubscription? _tripsSubscription; String? _currentUserId; TripBloc(this._repository) : super(TripInitial()) { on(_onLoadTripsByUserId); on(_onTripCreateRequested); on(_onTripUpdateRequested); on(_onTripDeleteRequested); on<_TripsUpdated>(_onTripsUpdated); on(_onResetTrips); } Future _onLoadTripsByUserId( LoadTripsByUserId event, Emitter emit, ) async { emit(TripLoading()); _currentUserId = event.userId; await _tripsSubscription?.cancel(); _tripsSubscription = _repository.getTripsByUserId(event.userId).listen( (trips) { add(_TripsUpdated(trips)); }, onError: (error) { emit(TripError(error.toString())); }, ); } void _onTripsUpdated( _TripsUpdated event, Emitter emit, ) { emit(TripLoaded(event.trips)); } Future _onTripCreateRequested( TripCreateRequested event, Emitter emit, ) async { try { emit(TripLoading()); final tripId = await _repository.createTrip(event.trip); emit(TripCreated(tripId: tripId)); await Future.delayed(const Duration(milliseconds: 800)); if (_currentUserId != null) { add(LoadTripsByUserId(userId: _currentUserId!)); } } catch (e) { emit(TripError('Erreur lors de la création: $e')); } } Future _onTripUpdateRequested( TripUpdateRequested event, Emitter emit, ) async { try { await _repository.updateTrip(event.trip.id!, event.trip); emit(const TripOperationSuccess('Voyage mis à jour avec succès')); await Future.delayed(const Duration(milliseconds: 500)); if (_currentUserId != null) { add(LoadTripsByUserId(userId: _currentUserId!)); } } catch (e) { emit(TripError('Erreur lors de la mise à jour: $e')); } } Future _onTripDeleteRequested( TripDeleteRequested event, Emitter emit, ) async { try { await _repository.deleteTrip(event.tripId); emit(const TripOperationSuccess('Voyage supprimé avec succès')); await Future.delayed(const Duration(milliseconds: 500)); if (_currentUserId != null) { add(LoadTripsByUserId(userId: _currentUserId!)); } } catch (e) { emit(TripError('Erreur lors de la suppression: $e')); } } Future _onResetTrips( ResetTrips event, Emitter emit, ) async { await _tripsSubscription?.cancel(); _currentUserId = null; emit(TripInitial()); } @override Future close() { _tripsSubscription?.cancel(); return super.close(); } } class _TripsUpdated extends TripEvent { final List trips; const _TripsUpdated(this.trips); @override List get props => [trips]; }