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.

64 lines
2.4KB

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