Line data Source code
1 : import 'dart:async'; 2 : 3 : import 'package:tech_proof/data/repositories/movies_repository_imp.dart'; 4 : import 'package:tech_proof/domain/entities/movie_entity.dart'; 5 : import 'package:bloc_concurrency/bloc_concurrency.dart'; 6 : import 'package:flutter_bloc/flutter_bloc.dart'; 7 : import 'package:equatable/equatable.dart'; 8 : 9 : part 'home_event.dart'; 10 : part 'home_state.dart'; 11 : 12 : class HomeBloc extends Bloc<HomeEvent, HomeState> { 13 : final MovieRepositoryImpl movieRepository; 14 6 : HomeBloc({required this.movieRepository}) : super(HomeInitial()) { 15 4 : on<HomeEvent>((event, emit) {}); 16 4 : on<HomeInit>(_homeInit); 17 6 : on<HomeShowLoading>(_showLoading, transformer: droppable()); 18 6 : on<HomeLoadMore>(_homeLoadMore, transformer: droppable()); 19 : } 20 : 21 1 : FutureOr<void> _homeInit(HomeInit event, Emitter<HomeState> emit) async { 22 2 : emit(HomeLoading()); 23 : 24 2 : final popularMovies = await movieRepository.getPopularMovies(); 25 : 26 1 : popularMovies.fold( 27 3 : (l) => emit(HomeError()), 28 2 : (r) => emit( 29 4 : HomeReady(movies: r.results, page: r.page, totalPages: r.totalPages), 30 : ), 31 : ); 32 : } 33 : 34 2 : FutureOr<void> _homeLoadMore( 35 : HomeLoadMore event, 36 : Emitter<HomeState> emit, 37 : ) async { 38 4 : if (state is! HomeReady) return; 39 2 : final homeReadyState = state as HomeReady; 40 4 : final nextPage = homeReadyState.page + 1; 41 : 42 4 : final newMovies = await movieRepository.getPopularMovies(page: nextPage); 43 : 44 7 : newMovies.fold((l) => emit(HomeError()), (r) { 45 4 : final updatedMovies = List<MovieEntity>.from(homeReadyState.movies) 46 4 : ..addAll(r.results); 47 : 48 2 : emit( 49 2 : HomeReady( 50 : movies: updatedMovies, 51 2 : page: r.page, 52 2 : totalPages: r.totalPages, 53 : isLoadingMore: false, 54 : ), 55 : ); 56 : }); 57 : } 58 : 59 2 : FutureOr<void> _showLoading( 60 : HomeShowLoading event, 61 : Emitter<HomeState> emit, 62 : ) async { 63 4 : if (state is! HomeReady) return; 64 2 : final homeReadyState = state as HomeReady; 65 2 : emit( 66 2 : HomeReady( 67 2 : movies: homeReadyState.movies, 68 2 : page: homeReadyState.page, 69 2 : totalPages: homeReadyState.totalPages, 70 : isLoadingMore: true, 71 : ), 72 : ); 73 : } 74 : }