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.

132 lines
4.0KB

  1. import 'package:bloc/bloc.dart';
  2. import 'package:equatable/equatable.dart';
  3. import 'package:farm_tpf/presentation/screens/task/models/task_update_request.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 '../../../../utils/helpers.dart';
  11. import '../../../../utils/utils.dart';
  12. import '../../../custom_widgets/widget_utils.dart';
  13. import '../models/task.dart';
  14. import '../models/task_filter_request.dart';
  15. part 'task_event.dart';
  16. part 'task_state.dart';
  17. class TaskBloc extends Bloc<TaskEvent, TaskState> {
  18. final Repository repository;
  19. int pageSize = 20;
  20. TaskBloc(this.repository) : super(TaskInitial());
  21. var status = ValueNotifier(
  22. TaskStatus.values
  23. .map(
  24. (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getTaskStatus(describeEnum(e))),
  25. )
  26. .toList(),
  27. );
  28. var selectedStatus = ValueNotifier(
  29. TaskStatus.values
  30. .map(
  31. (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getTaskStatus(describeEnum(e))),
  32. )
  33. .toList(),
  34. );
  35. var sort = ValueNotifier(describeEnum(SortType.asc));
  36. var cropId = -1;
  37. @override
  38. Stream<TaskState> mapEventToState(
  39. TaskEvent event,
  40. ) async* {
  41. if (event is DataFetched && !(state is TaskSuccess && ((state as TaskSuccess).hasReachedMax ?? false))) {
  42. try {
  43. if (state is TaskInitial) {
  44. yield (TaskLoading());
  45. final response = await getListTask(0);
  46. yield TaskSuccess(
  47. items: response,
  48. page: 0,
  49. hasReachedMax: response.length < pageSize ? true : false,
  50. );
  51. }
  52. if (state is TaskSuccess) {
  53. final currentState = state as TaskSuccess;
  54. if (currentState.hasReachedMax ?? false) {
  55. return;
  56. }
  57. int page = (currentState.page ?? 0) + 1;
  58. final response = await getListTask(page);
  59. yield response.isEmpty
  60. ? currentState.copyWith(hasReachedMax: true)
  61. : TaskSuccess(
  62. items: (currentState.items ?? []) + response,
  63. page: (currentState.page ?? 0) + 1,
  64. hasReachedMax: false,
  65. );
  66. }
  67. } catch (e) {
  68. var errorString = AppException.handleError(e);
  69. yield (TaskFailure(errorString: errorString));
  70. }
  71. }
  72. if (event is OnRefresh) {
  73. try {
  74. yield (TaskLoading());
  75. final response = await getListTask(0);
  76. var items = <Task>[];
  77. response.forEach((element) {
  78. items.add(Task.clone(element));
  79. });
  80. yield TaskSuccess(
  81. items: items,
  82. page: 0,
  83. hasReachedMax: items.length < pageSize ? true : false,
  84. );
  85. } catch (e) {
  86. yield (TaskFailure(errorString: AppException.handleError(e)));
  87. }
  88. } else if (event is OnSearch) {
  89. try {
  90. yield (TaskLoading());
  91. final response = await getListTask(0);
  92. yield TaskSuccess(items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false);
  93. } catch (e) {
  94. yield (TaskFailure(errorString: AppException.handleError(e)));
  95. }
  96. }
  97. }
  98. Future<List<Task>> getListTask(int page) async {
  99. var filter = TaskFilterRequest()
  100. ..cropId = cropId
  101. ..sort = sort.value
  102. ..status = selectedStatus.value.map((e) => e.key ?? '').toList();
  103. return await repository.tasks(page: 0, filter: filter);
  104. }
  105. Future<void> updateStatusTask(
  106. RequestTaskUpdate task, {
  107. required Function onSuccess,
  108. }) async {
  109. print(task.toJson());
  110. UtilWidget.showLoading();
  111. await repository.updateTask(
  112. (success) {
  113. UtilWidget.hideDialog();
  114. // Utils.showSnackBarSuccess();
  115. onSuccess();
  116. },
  117. (errorMessage) {
  118. UtilWidget.hideDialog();
  119. Utils.showSnackBarError();
  120. },
  121. item: task,
  122. );
  123. }
  124. }