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.

86 lines
2.9KB

  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_detail_event.dart';
  8. part 'plot_detail_state.dart';
  9. class PlotDetailBloc extends Bloc<PlotDetailEvent, PlotDetailState> {
  10. final Repository repository;
  11. PlotDetailBloc({@required this.repository}) : super(PlotDetailInitial());
  12. static int pageSize = 20;
  13. @override
  14. Stream<PlotDetailState> mapEventToState(
  15. PlotDetailEvent event,
  16. ) async* {
  17. if (event is DataFetched &&
  18. !(state is PlotDetailSuccess &&
  19. (state as PlotDetailSuccess).hasReachedMax)) {
  20. try {
  21. if (state is PlotDetailInitial) {
  22. yield PlotDetailLoading();
  23. var response;
  24. if (event.cropId != null) {
  25. response = await repository.getPlotDetail(event.cropId,
  26. page: 0, size: pageSize);
  27. } else {
  28. response = await repository.getPlotDetailByCode(event.cropCode,
  29. page: 0, size: pageSize);
  30. }
  31. yield PlotDetailSuccess(
  32. items: response.activities,
  33. page: 0,
  34. hasReachedMax:
  35. response.activities.length < pageSize ? true : false);
  36. }
  37. if (state is PlotDetailSuccess) {
  38. final currentState = state as PlotDetailSuccess;
  39. int page = currentState.page + 1;
  40. var response;
  41. if (event.cropId != null) {
  42. response = await repository.getPlotDetail(event.cropId,
  43. page: page, size: pageSize);
  44. } else {
  45. response = await repository.getPlotDetailByCode(event.cropCode,
  46. page: page, size: pageSize);
  47. }
  48. yield response.activities.isEmpty
  49. ? currentState.copyWith(hasReachedMax: true)
  50. : PlotDetailSuccess(
  51. items: currentState.items + response.activities,
  52. page: currentState.page + 1,
  53. hasReachedMax: false);
  54. }
  55. } catch (e) {
  56. var errorString = AppException.handleError(e);
  57. yield PlotDetailFailure(errorString: errorString);
  58. }
  59. }
  60. if (event is OnRefresh) {
  61. try {
  62. yield PlotDetailLoading();
  63. var response;
  64. if (event.cropId != null) {
  65. response = await repository.getPlotDetail(event.cropId,
  66. page: 0, size: pageSize);
  67. } else {
  68. response = await repository.getPlotDetailByCode(event.cropCode,
  69. page: 0, size: pageSize);
  70. }
  71. yield PlotDetailSuccess(
  72. items: response.activities,
  73. page: 0,
  74. hasReachedMax:
  75. response.activities.length < pageSize ? true : false);
  76. } catch (e) {
  77. yield PlotDetailFailure(errorString: AppException.handleError(e));
  78. }
  79. }
  80. }
  81. }