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.

107 lines
3.6KB

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