You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.3KB

  1. import 'package:bloc/bloc.dart';
  2. import 'package:equatable/equatable.dart';
  3. import '../../../../data/api/app_exception.dart';
  4. import '../../../../data/repository/repository.dart';
  5. part 'stamp_event.dart';
  6. part 'stamp_state.dart';
  7. class StampBloc extends Bloc<StampEvent, StampState> {
  8. final Repository repository;
  9. int pageSize = 20;
  10. StampBloc(this.repository) : super(StampInitial());
  11. @override
  12. Stream<StampState> mapEventToState(
  13. StampEvent event,
  14. ) async* {
  15. if (event is DataFetched && !(state is StampSuccess && ((state as StampSuccess).hasReachedMax ?? false))) {
  16. try {
  17. if (state is StampInitial) {
  18. yield (StampLoading());
  19. final response = await repository.stamps(page: 0);
  20. yield StampSuccess(
  21. items: response,
  22. page: 0,
  23. hasReachedMax: response.length < pageSize ? true : false,
  24. );
  25. }
  26. if (state is StampSuccess) {
  27. final currentState = state as StampSuccess;
  28. int page = (currentState.page ?? 0) + 1;
  29. final response = await repository.stamps(page: page);
  30. yield response.isEmpty
  31. ? currentState.copyWith(hasReachedMax: true)
  32. : StampSuccess(
  33. items: (currentState.items ?? []) + response,
  34. page: (currentState.page ?? 0) + 1,
  35. hasReachedMax: false,
  36. );
  37. }
  38. } catch (e) {
  39. var errorString = AppException.handleError(e);
  40. yield (StampFailure(errorString: errorString));
  41. }
  42. }
  43. if (event is OnRefresh) {
  44. try {
  45. yield (StampLoading());
  46. final response = await repository.stamps(page: 0);
  47. yield StampSuccess(
  48. items: response,
  49. page: 0,
  50. hasReachedMax: response.length < pageSize ? true : false,
  51. );
  52. } catch (e) {
  53. yield (StampFailure(errorString: AppException.handleError(e)));
  54. }
  55. } else if (event is OnSearch) {
  56. try {
  57. yield (StampLoading());
  58. final response = await repository.stamps(page: 0);
  59. yield StampSuccess(items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false);
  60. } catch (e) {
  61. yield (StampFailure(errorString: AppException.handleError(e)));
  62. }
  63. }
  64. }
  65. }