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.

104 lines
4.2KB

  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 && !(state is PlotDetailSuccess && (state as PlotDetailSuccess).hasReachedMax)) {
  19. try {
  20. if (state is PlotDetailInitial) {
  21. yield PlotDetailLoading();
  22. var response;
  23. if (event.cropId != null) {
  24. response = await repository.getPlotDetail(event.cropId, page: 0, size: pageSize);
  25. yield PlotDetailSuccess(items: response.activities, page: 0, hasReachedMax: response.activities.length < pageSize ? true : false);
  26. } else {
  27. var response = await repository.getPlotDetailByCode(event.cropCode, page: 0, size: pageSize);
  28. yield PlotDetailSuccess(ownerItem: response, items: response.activities ?? <Activities>[], page: 0, hasReachedMax: true);
  29. }
  30. }
  31. if (state is PlotDetailSuccess) {
  32. final currentState = state as PlotDetailSuccess;
  33. var page = currentState.page + 1;
  34. var response;
  35. if (event.cropId != null) {
  36. response = await repository.getPlotDetail(event.cropId, page: page, size: pageSize);
  37. yield response.activities.isEmpty
  38. ? currentState.copyWith(hasReachedMax: true, items: [], page: page)
  39. : PlotDetailSuccess(items: currentState.items + response.activities, page: currentState.page + 1, hasReachedMax: false);
  40. } else {
  41. var response = await repository.getPlotDetailByCode(event.cropCode, page: page, size: pageSize);
  42. yield PlotDetailSuccess(ownerItem: response, items: response.activities ?? <Activities>[], page: 0, hasReachedMax: true);
  43. }
  44. }
  45. } catch (e) {
  46. var errorString = AppException.handleError(e);
  47. yield PlotDetailFailure(errorString: errorString);
  48. }
  49. }
  50. if (event is CheckInfo) {
  51. try {
  52. yield PlotDetailLoading();
  53. var response;
  54. if (event.cropId != null) {
  55. response = await repository.getPlotDetail(event.cropId, page: 0, size: pageSize);
  56. } else {
  57. response = await repository.getPlotDetailByCode(event.cropCode, page: 0, size: pageSize);
  58. }
  59. var cropPlot = response as CropPlot;
  60. yield PlotDetailSuccess(
  61. ownerItem: cropPlot,
  62. page: 0,
  63. hasReachedMax: (response.activities ?? <Activities>[]).length < pageSize ? true : false,
  64. items: [],
  65. );
  66. } catch (e) {
  67. yield PlotDetailFailure(errorString: AppException.handleError(e));
  68. }
  69. }
  70. if (event is OnRefresh) {
  71. try {
  72. yield PlotDetailLoading();
  73. var response;
  74. if (event.cropId != null) {
  75. response = await repository.getPlotDetail(event.cropId, page: 0, size: pageSize);
  76. } else {
  77. response = await repository.getPlotDetailByCode(event.cropCode, page: 0, size: pageSize);
  78. }
  79. var listActivities = <Activities>[];
  80. var cropPlot = response as CropPlot;
  81. cropPlot.activities?.forEach((element) {
  82. listActivities.add(Activities.clone(element));
  83. });
  84. yield PlotDetailSuccess(
  85. items: listActivities, page: 0, hasReachedMax: (response.activities ?? <Activities>[]).length < pageSize ? true : false);
  86. } catch (e) {
  87. yield PlotDetailFailure(errorString: AppException.handleError(e));
  88. }
  89. } else if (event is OnUpdate) {
  90. yield PlotDetailLoading();
  91. try {
  92. yield PlotDetailSuccess(items: event.currentItems, page: event.currentPage, hasReachedMax: event.hasReachedMax);
  93. } catch (e) {
  94. yield PlotDetailFailure(errorString: AppException.handleError(e));
  95. }
  96. }
  97. }
  98. }