Line data Source code
1 : import 'dart:async'; 2 : 3 : import 'package:tech_proof/data/repositories/favorites_repository_impl.dart'; 4 : import 'package:tech_proof/domain/entities/movie_entity.dart'; 5 : 6 : import 'package:flutter_bloc/flutter_bloc.dart'; 7 : import 'package:equatable/equatable.dart'; 8 : 9 : part 'favorites_event.dart'; 10 : part 'favorites_state.dart'; 11 : 12 : class FavoritesBloc extends Bloc<FavoritesEvent, FavoritesState> { 13 : final FavoriteRepositoryImpl favoriteRepositoryImpl; 14 1 : FavoritesBloc({required this.favoriteRepositoryImpl}) 15 2 : : super(FavoritesInitial()) { 16 2 : on<FavoritesEvent>((event, emit) {}); 17 2 : on<LoadFavorites>(_loadFavorites); 18 2 : on<AddFavoriteMovie>(_addFavoriteMovie); 19 2 : on<RemoveFavoriteMovie>(_removeFavoriteMovie); 20 : } 21 : 22 1 : FutureOr<void> _loadFavorites( 23 : LoadFavorites event, 24 : Emitter<FavoritesState> emit, 25 : ) async { 26 2 : emit(FavoritesLoading()); 27 : 28 2 : final result = await favoriteRepositoryImpl.getFavoriteMovies(); 29 1 : result.fold( 30 4 : (l) => emit(FavoritesError(message: l.message)), 31 3 : (r) => emit(FavoritesLoaded(favoriteMovies: r)), 32 : ); 33 : } 34 : 35 1 : Future<void> _addFavoriteMovie( 36 : AddFavoriteMovie event, 37 : Emitter<FavoritesState> emit, 38 : ) async { 39 2 : if (state is! FavoritesLoaded) return; 40 : 41 2 : final addResult = await favoriteRepositoryImpl.addMovieToFavorites( 42 1 : event.movie, 43 : ); 44 : 45 1 : if (addResult.isLeft()) { 46 2 : emit(FavoritesError(message: 'Failed to add favorite movie')); 47 : } else { 48 2 : final getResult = await favoriteRepositoryImpl.getFavoriteMovies(); 49 1 : getResult.fold( 50 0 : (l) => emit(FavoritesError(message: l.message)), 51 3 : (r) => emit(FavoritesLoaded(favoriteMovies: r)), 52 : ); 53 : } 54 : } 55 : 56 1 : FutureOr<void> _removeFavoriteMovie( 57 : RemoveFavoriteMovie event, 58 : Emitter<FavoritesState> emit, 59 : ) async { 60 2 : if (state is! FavoritesLoaded) return; 61 : 62 2 : if (state is! FavoritesLoaded) return; 63 : 64 2 : final addResult = await favoriteRepositoryImpl.removeMovieFromFavorites( 65 2 : event.movie.id, 66 : ); 67 : 68 1 : if (addResult.isLeft()) { 69 2 : emit(FavoritesError(message: 'Failed to remove favorite movie')); 70 : } else { 71 2 : final getResult = await favoriteRepositoryImpl.getFavoriteMovies(); 72 1 : getResult.fold( 73 0 : (l) => emit(FavoritesError(message: l.message)), 74 3 : (r) => emit(FavoritesLoaded(favoriteMovies: r)), 75 : ); 76 : } 77 : } 78 : }