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.

100 lines
3.4KB

  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. yield PlotDetailSuccess(
  85. items: response.activities,
  86. page: 0,
  87. hasReachedMax:
  88. response.activities.length < pageSize ? true : false);
  89. } catch (e) {
  90. yield PlotDetailFailure(errorString: AppException.handleError(e));
  91. }
  92. }
  93. }
  94. }