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.

105 lines
3.4KB

  1. import 'package:bloc/bloc.dart';
  2. import 'package:equatable/equatable.dart';
  3. import 'package:farm_tpf/utils/helpers.dart';
  4. import 'package:flutter/foundation.dart';
  5. import 'package:flutter/material.dart';
  6. import '../../../../data/api/app_exception.dart';
  7. import '../../../../data/repository/repository.dart';
  8. import '../../../../models/item_dropdown.dart';
  9. import '../../../../utils/const_common.dart';
  10. import '../models/stamp.dart';
  11. import '../models/stamp_filter_request.dart';
  12. part 'stamp_event.dart';
  13. part 'stamp_state.dart';
  14. class StampBloc extends Bloc<StampEvent, StampState> {
  15. final Repository repository;
  16. int pageSize = 20;
  17. StampBloc(this.repository) : super(StampInitial());
  18. final searchCtl = TextEditingController();
  19. var status = ValueNotifier(
  20. StampStatus.values
  21. .map(
  22. (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getStampStatus(describeEnum(e))),
  23. )
  24. .toList(),
  25. );
  26. var selectedStatus = ValueNotifier(
  27. StampStatus.values
  28. .map(
  29. (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getStampStatus(describeEnum(e))),
  30. )
  31. .toList(),
  32. );
  33. var sort = ValueNotifier(describeEnum(SortType.asc));
  34. @override
  35. Stream<StampState> mapEventToState(
  36. StampEvent event,
  37. ) async* {
  38. if (event is DataFetched && !(state is StampSuccess && ((state as StampSuccess).hasReachedMax ?? false))) {
  39. try {
  40. if (state is StampInitial) {
  41. yield (StampLoading());
  42. final response = await getListStamp(0);
  43. yield StampSuccess(
  44. items: response,
  45. page: 0,
  46. hasReachedMax: response.length < pageSize ? true : false,
  47. );
  48. }
  49. if (state is StampSuccess) {
  50. final currentState = state as StampSuccess;
  51. if (currentState.hasReachedMax ?? false) {
  52. return;
  53. }
  54. int page = (currentState.page ?? 0) + 1;
  55. final response = await getListStamp(page);
  56. yield response.isEmpty
  57. ? currentState.copyWith(hasReachedMax: true)
  58. : StampSuccess(
  59. items: (currentState.items ?? []) + response,
  60. page: (currentState.page ?? 0) + 1,
  61. hasReachedMax: false,
  62. );
  63. }
  64. } catch (e) {
  65. var errorString = AppException.handleError(e);
  66. yield (StampFailure(errorString: errorString));
  67. }
  68. }
  69. if (event is OnRefresh) {
  70. try {
  71. yield (StampLoading());
  72. final response = await getListStamp(0);
  73. yield StampSuccess(
  74. items: response,
  75. page: 0,
  76. hasReachedMax: response.length < pageSize ? true : false,
  77. );
  78. } catch (e) {
  79. yield (StampFailure(errorString: AppException.handleError(e)));
  80. }
  81. } else if (event is OnSearch) {
  82. try {
  83. yield (StampLoading());
  84. final response = await getListStamp(0);
  85. yield StampSuccess(items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false);
  86. } catch (e) {
  87. yield (StampFailure(errorString: AppException.handleError(e)));
  88. }
  89. }
  90. }
  91. Future<List<Stamp>> getListStamp(int page) async {
  92. var filter = StampFilterRequest()
  93. ..sort = sort.value
  94. ..description = searchCtl.text
  95. ..status = selectedStatus.value.map((e) => e.key ?? '').toList();
  96. return await repository.stamps(page: 0, filter: filter);
  97. }
  98. }