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.

115 lines
3.9KB

  1. import 'dart:async';
  2. import 'package:bloc/bloc.dart';
  3. import 'package:equatable/equatable.dart';
  4. import 'package:farm_tpf/custom_model/CropPlot.dart';
  5. import 'package:farm_tpf/data/api/app_exception.dart';
  6. import 'package:farm_tpf/data/repository/repository.dart';
  7. import 'package:meta/meta.dart';
  8. part 'plot_detail_event.dart';
  9. part 'plot_detail_state.dart';
  10. class PlotDetailBloc extends Bloc<PlotDetailEvent, PlotDetailState> {
  11. final Repository repository;
  12. PlotDetailBloc({@required this.repository}) : super(PlotDetailInitial());
  13. static int pageSize = 20;
  14. @override
  15. Stream<PlotDetailState> mapEventToState(
  16. PlotDetailEvent event,
  17. ) async* {
  18. if (event is DataFetched &&
  19. !(state is PlotDetailSuccess &&
  20. (state as PlotDetailSuccess).hasReachedMax)) {
  21. try {
  22. if (state is PlotDetailInitial) {
  23. yield PlotDetailLoading();
  24. var response;
  25. if (event.cropId != null) {
  26. response = await repository.getPlotDetail(event.cropId,
  27. page: 0, size: pageSize);
  28. yield PlotDetailSuccess(
  29. items: response.activities,
  30. page: 0,
  31. hasReachedMax:
  32. response.activities.length < pageSize ? true : false);
  33. } else {
  34. CropPlot response = await repository
  35. .getPlotDetailByCode(event.cropCode, page: 0, size: pageSize);
  36. yield PlotDetailSuccess(
  37. ownerItem: response,
  38. items: response.activities,
  39. page: 0,
  40. hasReachedMax: true);
  41. }
  42. }
  43. if (state is PlotDetailSuccess) {
  44. final currentState = state as PlotDetailSuccess;
  45. int page = currentState.page + 1;
  46. var response;
  47. if (event.cropId != null) {
  48. response = await repository.getPlotDetail(event.cropId,
  49. page: page, size: pageSize);
  50. yield response.activities.isEmpty
  51. ? currentState.copyWith(hasReachedMax: true)
  52. : PlotDetailSuccess(
  53. items: currentState.items + response.activities,
  54. page: currentState.page + 1,
  55. hasReachedMax: false);
  56. } else {
  57. CropPlot response = await repository.getPlotDetailByCode(
  58. event.cropCode,
  59. page: page,
  60. size: pageSize);
  61. yield PlotDetailSuccess(
  62. ownerItem: response,
  63. items: response.activities,
  64. page: 0,
  65. hasReachedMax: true);
  66. }
  67. }
  68. } catch (e) {
  69. var errorString = AppException.handleError(e);
  70. yield PlotDetailFailure(errorString: errorString);
  71. }
  72. }
  73. if (event is OnRefresh) {
  74. try {
  75. yield PlotDetailLoading();
  76. var response;
  77. if (event.cropId != null) {
  78. response = await repository.getPlotDetail(event.cropId,
  79. page: 0, size: pageSize);
  80. } else {
  81. response = await repository.getPlotDetailByCode(event.cropCode,
  82. page: 0, size: pageSize);
  83. }
  84. var listActivities = List<Activities>();
  85. CropPlot cropPlot = response as CropPlot;
  86. cropPlot.activities.forEach((element) {
  87. listActivities.add(Activities.clone(element));
  88. });
  89. yield PlotDetailSuccess(
  90. items: listActivities,
  91. page: 0,
  92. hasReachedMax:
  93. response.activities.length < pageSize ? true : false);
  94. } catch (e) {
  95. yield PlotDetailFailure(errorString: AppException.handleError(e));
  96. }
  97. } else if (event is OnUpdate) {
  98. yield PlotDetailLoading();
  99. try {
  100. yield PlotDetailSuccess(
  101. items: event.currentItems,
  102. page: event.currentPage,
  103. hasReachedMax: event.hasReachedMax);
  104. } catch (e) {
  105. yield PlotDetailFailure(errorString: AppException.handleError(e));
  106. }
  107. }
  108. }
  109. }