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.

130 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/TbCropDTO.dart';
  5. import 'package:farm_tpf/data/api/app_exception.dart';
  6. import 'package:farm_tpf/data/repository/repository.dart';
  7. import 'package:farm_tpf/presentation/screens/plot/models/area_filter.request.dart';
  8. import 'package:farm_tpf/presentation/screens/plot/models/crop_filter_request.dart';
  9. import 'package:farm_tpf/presentation/screens/task/models/supply_filter.dart';
  10. import 'package:flutter/material.dart';
  11. import 'package:meta/meta.dart';
  12. import '../../../../models/item_dropdown.dart';
  13. part 'plot_event.dart';
  14. part 'plot_state.dart';
  15. class PlotBloc extends Bloc<PlotEvent, PlotState> {
  16. final Repository repository;
  17. PlotBloc({required this.repository}) : super(PlotInitial());
  18. static int pageSize = 20;
  19. final searchCtl = TextEditingController();
  20. var supplyRaws = <SupplyFilter>[];
  21. var supplies = ValueNotifier(<ItemDropDown>[]);
  22. var selectedSupply = ValueNotifier(<ItemDropDown>[]);
  23. var areaRaws = <AreaFilter>[];
  24. var areas = ValueNotifier(<ItemDropDown>[]);
  25. var selectedArea = ValueNotifier(<ItemDropDown>[]);
  26. @override
  27. Stream<PlotState> mapEventToState(
  28. PlotEvent event,
  29. ) async* {
  30. if (event is DataFetched && !(state is PlotSuccess && ((state as PlotSuccess).hasReachedMax ?? false))) {
  31. try {
  32. if (state is PlotInitial) {
  33. yield PlotLoading();
  34. final response = await getPlots(0);
  35. yield PlotSuccess(items: response, page: 0, hasReachedMax: true);
  36. }
  37. // if (state is PlotSuccess) {
  38. // final currentState = state as PlotSuccess;
  39. // if (currentState.hasReachedMax ?? false) {
  40. // return;
  41. // }
  42. // int page = (currentState.page ?? 0) + 1;
  43. // final response = await getPlots(page);
  44. // yield response.isEmpty
  45. // ? currentState.copyWith(hasReachedMax: true)
  46. // : PlotSuccess(
  47. // items: (currentState.items ?? []) + response,
  48. // page: (currentState.page ?? 0) + 1,
  49. // hasReachedMax: false,
  50. // );
  51. // }
  52. } catch (e) {
  53. var errorString = AppException.handleError(e);
  54. yield PlotFailure(errorString: errorString);
  55. }
  56. }
  57. if (event is OnRefresh) {
  58. try {
  59. yield PlotLoading();
  60. final response = await getPlots(0);
  61. yield PlotSuccess(items: response, page: 0, hasReachedMax: true);
  62. } catch (e) {
  63. yield PlotFailure(errorString: AppException.handleError(e));
  64. }
  65. } else if (event is OnSearch) {
  66. try {
  67. yield PlotLoading();
  68. final response = await getPlots(0);
  69. yield PlotSuccess(items: response, page: 0, hasReachedMax: true);
  70. } catch (e) {
  71. yield PlotFailure(errorString: AppException.handleError(e));
  72. }
  73. }
  74. }
  75. Future<List<TbCropDTO>> getPlots(int page) async {
  76. var supplyIds = selectedSupply.value.length > 0
  77. ? selectedSupply.value
  78. .map(
  79. (e) => int.tryParse(e.key ?? '') ?? -1,
  80. )
  81. .toList()
  82. : <int>[];
  83. var areaIds = selectedArea.value.length > 0
  84. ? selectedArea.value
  85. .map(
  86. (e) => int.tryParse(e.key ?? '') ?? -1,
  87. )
  88. .toList()
  89. : <int>[];
  90. var filter = CropFilterRequest()
  91. ..supplyIds = supplyIds
  92. ..netHouseIds = areaIds
  93. ..code = searchCtl.text;
  94. return await repository.crops(page: 0, filter: filter);
  95. }
  96. Future<void> preparedData() async {
  97. try {
  98. await Future.delayed(const Duration(seconds: 0));
  99. // emit(CreateStampLoading());
  100. supplyRaws = await repository.getSuppliesFilter();
  101. supplies.value = supplyRaws
  102. .map(
  103. (e) => ItemDropDown(key: e.id?.toString(), value: e.name),
  104. )
  105. .toList();
  106. areaRaws = await repository.getAreasFilter();
  107. areas.value = areaRaws
  108. .map(
  109. (e) => ItemDropDown(key: e.id?.toString(), value: e.name),
  110. )
  111. .toList();
  112. // emit(CreateStampPrepareDataSuccessful());
  113. } catch (e) {
  114. print(e);
  115. // emit(CreateStampFailure(AppException.handleError(e)));
  116. }
  117. }
  118. }