Files
TravelMate/lib/blocs/trip/trip_bloc.dart
Dayron 4edbd1cf34 feat: Add User and UserBalance models with serialization methods
feat: Implement BalanceRepository for group balance calculations

feat: Create ExpenseRepository for managing expenses

feat: Add services for handling expenses and storage operations

fix: Update import paths for models in repositories and services

refactor: Rename CountContent to AccountContent in HomePage

chore: Add StorageService for image upload and management
2025-10-21 16:02:58 +02:00

129 lines
3.2 KiB
Dart

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<TripEvent, TripState> {
final TripRepository _repository;
StreamSubscription? _tripsSubscription;
String? _currentUserId;
TripBloc(this._repository) : super(TripInitial()) {
on<LoadTripsByUserId>(_onLoadTripsByUserId);
on<TripCreateRequested>(_onTripCreateRequested);
on<TripUpdateRequested>(_onTripUpdateRequested);
on<TripDeleteRequested>(_onTripDeleteRequested);
on<_TripsUpdated>(_onTripsUpdated);
on<ResetTrips>(_onResetTrips);
}
Future<void> _onLoadTripsByUserId(
LoadTripsByUserId event,
Emitter<TripState> 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<TripState> emit,
) {
emit(TripLoaded(event.trips));
}
Future<void> _onTripCreateRequested(
TripCreateRequested event,
Emitter<TripState> 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<void> _onTripUpdateRequested(
TripUpdateRequested event,
Emitter<TripState> 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<void> _onTripDeleteRequested(
TripDeleteRequested event,
Emitter<TripState> 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<void> _onResetTrips(
ResetTrips event,
Emitter<TripState> emit,
) async {
await _tripsSubscription?.cancel();
_currentUserId = null;
emit(TripInitial());
}
@override
Future<void> close() {
_tripsSubscription?.cancel();
return super.close();
}
}
class _TripsUpdated extends TripEvent {
final List<Trip> trips;
const _TripsUpdated(this.trips);
@override
List<Object?> get props => [trips];
}