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.

136 lines
4.6KB

  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 CheckInfo) {
  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. CropPlot cropPlot = response as CropPlot;
  85. yield PlotDetailSuccess(
  86. ownerItem: cropPlot,
  87. page: 0,
  88. hasReachedMax:
  89. response.activities.length < pageSize ? true : false);
  90. } catch (e) {
  91. yield PlotDetailFailure(errorString: AppException.handleError(e));
  92. }
  93. }
  94. if (event is OnRefresh) {
  95. try {
  96. yield PlotDetailLoading();
  97. var response;
  98. if (event.cropId != null) {
  99. response = await repository.getPlotDetail(event.cropId,
  100. page: 0, size: pageSize);
  101. } else {
  102. response = await repository.getPlotDetailByCode(event.cropCode,
  103. page: 0, size: pageSize);
  104. }
  105. var listActivities = List<Activities>();
  106. CropPlot cropPlot = response as CropPlot;
  107. cropPlot.activities.forEach((element) {
  108. listActivities.add(Activities.clone(element));
  109. });
  110. yield PlotDetailSuccess(
  111. items: listActivities,
  112. page: 0,
  113. hasReachedMax:
  114. response.activities.length < pageSize ? true : false);
  115. } catch (e) {
  116. yield PlotDetailFailure(errorString: AppException.handleError(e));
  117. }
  118. } else if (event is OnUpdate) {
  119. yield PlotDetailLoading();
  120. try {
  121. yield PlotDetailSuccess(
  122. items: event.currentItems,
  123. page: event.currentPage,
  124. hasReachedMax: event.hasReachedMax);
  125. } catch (e) {
  126. yield PlotDetailFailure(errorString: AppException.handleError(e));
  127. }
  128. }
  129. }
  130. }