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.

77 lines
2.5KB

  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_event.dart';
  8. part 'plot_state.dart';
  9. class PlotBloc extends Bloc<PlotEvent, PlotState> {
  10. final Repository repository;
  11. PlotBloc({@required this.repository}) : super(PlotInitial());
  12. static int pageSize = 20;
  13. @override
  14. Stream<PlotState> mapEventToState(
  15. PlotEvent event,
  16. ) async* {
  17. if (event is DataFetched &&
  18. !(state is PlotSuccess && (state as PlotSuccess).hasReachedMax)) {
  19. try {
  20. if (state is PlotInitial) {
  21. yield PlotLoading();
  22. final response = await repository.getPlots(
  23. page: 0, size: pageSize, searchString: "");
  24. yield PlotSuccess(
  25. items: response,
  26. page: 0,
  27. hasReachedMax: response.length < pageSize ? true : false);
  28. }
  29. if (state is PlotSuccess) {
  30. final currentState = state as PlotSuccess;
  31. int page = currentState.page + 1;
  32. final response = await repository.getPlots(
  33. page: page, size: pageSize, searchString: "");
  34. yield response.isEmpty
  35. ? currentState.copyWith(hasReachedMax: true)
  36. : PlotSuccess(
  37. items: currentState.items + response,
  38. page: currentState.page + 1,
  39. hasReachedMax: false);
  40. }
  41. } catch (e) {
  42. var errorString = AppException.handleError(e);
  43. yield PlotFailure(errorString: errorString);
  44. }
  45. }
  46. if (event is OnRefresh) {
  47. try {
  48. yield PlotLoading();
  49. final response = await repository.getPlots(
  50. page: 0, size: pageSize, searchString: "");
  51. yield PlotSuccess(
  52. items: response,
  53. page: 0,
  54. hasReachedMax: response.length < pageSize ? true : false);
  55. } catch (e) {
  56. yield PlotFailure(errorString: AppException.handleError(e));
  57. }
  58. } else if (event is OnSearch) {
  59. try {
  60. yield PlotLoading();
  61. final response = await repository.getPlots(
  62. page: 0, size: pageSize, searchString: event.searchString);
  63. yield PlotSuccess(
  64. items: response,
  65. page: 0,
  66. hasReachedMax: response.length < pageSize ? true : false);
  67. } catch (e) {
  68. yield PlotFailure(errorString: AppException.handleError(e));
  69. }
  70. }
  71. }
  72. }