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.

69 lines
2.6KB

  1. import 'dart:async';
  2. import 'package:bloc/bloc.dart';
  3. import 'package:equatable/equatable.dart';
  4. import 'package:farm_tpf/custom_model/Environment.dart';
  5. import 'package:farm_tpf/custom_model/EnvironmentParameter.dart';
  6. import 'package:farm_tpf/data/api/app_exception.dart';
  7. import 'package:farm_tpf/data/repository/repository.dart';
  8. import 'package:meta/meta.dart';
  9. part 'plot_parameter_event.dart';
  10. part 'plot_parameter_state.dart';
  11. class PlotParameterBloc extends Bloc<PlotParameterEvent, PlotParameterState> {
  12. final Repository repository;
  13. PlotParameterBloc({required this.repository}) : super(PlotParameterInitial());
  14. static int pageSize = 100;
  15. StreamSubscription? _periodicSubscription;
  16. @override
  17. Stream<PlotParameterState> mapEventToState(
  18. PlotParameterEvent event,
  19. ) async* {
  20. if (event is DataFetched) {
  21. try {
  22. if (state is PlotParameterInitial) {
  23. yield PlotParameterLoading();
  24. final response = await repository.getEnvironmentParameters(cropId: event.cropId, page: 0, size: pageSize);
  25. var updatedList = <EnvironmentParameter>[];
  26. response.forEach((element) {
  27. updatedList.add(EnvironmentParameter.clone(element));
  28. });
  29. yield PlotParameterSuccess(items: updatedList, page: 0, hasReachedMax: response.length < pageSize ? true : false);
  30. }
  31. if (state is PlotParameterSuccess) {
  32. if (_periodicSubscription == null) {
  33. _periodicSubscription ??= Stream.periodic(const Duration(seconds: 5), (x) => x)
  34. .listen((_) => add(OnRefresh(cropId: event.cropId)), onError: (error) => print("Do something with $error"));
  35. } else {
  36. _periodicSubscription!.resume();
  37. }
  38. }
  39. } catch (e) {
  40. var errorString = AppException.handleError(e);
  41. yield PlotParameterFailure(errorString: errorString);
  42. }
  43. }
  44. if (event is OnRefresh) {
  45. try {
  46. final response = await repository.getEnvironmentParameters(cropId: event.cropId, page: 0, size: pageSize);
  47. var updatedList = <EnvironmentParameter>[];
  48. response.forEach((element) {
  49. updatedList.add(EnvironmentParameter.clone(element));
  50. });
  51. yield PlotParameterSuccess(items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false);
  52. } catch (e) {
  53. yield PlotParameterFailure(errorString: AppException.handleError(e));
  54. }
  55. }
  56. }
  57. @override
  58. Future<void> close() async {
  59. await _periodicSubscription?.cancel();
  60. // _periodicSubscription = null;
  61. return super.close();
  62. }
  63. }