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.

165 lines
5.4KB

  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. bool isFetching = false; // Add this flag
  22. var status = ValueNotifier(
  23. TaskStatus.values
  24. .map(
  25. (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getTaskStatus(describeEnum(e))),
  26. )
  27. .toList(),
  28. );
  29. var selectedStatus = ValueNotifier(
  30. TaskStatus.values
  31. .map(
  32. (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getTaskStatus(describeEnum(e))),
  33. )
  34. .toList(),
  35. );
  36. var sort = ValueNotifier(describeEnum(SortType.asc));
  37. var cropId = -1;
  38. @override
  39. Stream<TaskState> mapEventToState(
  40. TaskEvent event,
  41. ) async* {
  42. if (event is DataFetched) {
  43. if (state is TaskInitial || (state is TaskSuccess && (!((state as TaskSuccess).hasReachedMax ?? false)))) {
  44. try {
  45. final currentState = state;
  46. int nextPage = 0;
  47. if (currentState is TaskSuccess) {
  48. nextPage = ((currentState.items?.length ?? 0) / 20).floor();
  49. }
  50. isFetching = true;
  51. final response = await getListTask(nextPage);
  52. final hasReachedMax = response.length < pageSize;
  53. isFetching = false;
  54. yield response.isEmpty
  55. ? (currentState is TaskSuccess ? currentState.copyWith(hasReachedMax: true) : TaskSuccess(items: [], hasReachedMax: true))
  56. : (currentState is TaskSuccess
  57. ? TaskSuccess(items: (currentState.items ?? []) + response, hasReachedMax: hasReachedMax)
  58. : TaskSuccess(items: response, hasReachedMax: hasReachedMax));
  59. } catch (e) {
  60. isFetching = false;
  61. var errorString = AppException.handleError(e);
  62. yield (TaskFailure(errorString: errorString));
  63. }
  64. }
  65. }
  66. // if (event is DataFetched && !(state is TaskSuccess && ((state as TaskSuccess).hasReachedMax ?? false))) {
  67. // try {
  68. // if (state is TaskInitial) {
  69. // yield (TaskLoading());
  70. // final response = await getListTask(0);
  71. // yield TaskSuccess(
  72. // items: response,
  73. // page: 0,
  74. // hasReachedMax: response.length < pageSize ? true : false,
  75. // );
  76. // }
  77. // if (state is TaskSuccess) {
  78. // final currentState = state as TaskSuccess;
  79. // // if (currentState.hasReachedMax ?? false) {
  80. // // return;
  81. // // }
  82. // int page = (currentState.page ?? 0) + 1;
  83. // final response = await getListTask(page);
  84. // yield response.isEmpty
  85. // ? currentState.copyWith(hasReachedMax: true)
  86. // : TaskSuccess(
  87. // items: (currentState.items ?? []) + response,
  88. // page: (currentState.page ?? 0) + 1,
  89. // hasReachedMax: false,
  90. // );
  91. // }
  92. // } catch (e) {
  93. // var errorString = AppException.handleError(e);
  94. // yield (TaskFailure(errorString: errorString));
  95. // }
  96. // }
  97. if (event is OnRefresh) {
  98. try {
  99. isFetching = true;
  100. yield (TaskLoading());
  101. final response = await getListTask(0);
  102. isFetching = false;
  103. var items = <Task>[];
  104. response.forEach((element) {
  105. items.add(Task.clone(element));
  106. });
  107. yield TaskSuccess(
  108. items: items,
  109. page: 0,
  110. hasReachedMax: items.length < pageSize ? true : false,
  111. );
  112. } catch (e) {
  113. isFetching = false;
  114. yield (TaskFailure(errorString: AppException.handleError(e)));
  115. }
  116. } else if (event is OnSearch) {
  117. try {
  118. isFetching = true;
  119. yield (TaskLoading());
  120. final response = await getListTask(0);
  121. isFetching = false;
  122. yield TaskSuccess(items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false);
  123. } catch (e) {
  124. yield (TaskFailure(errorString: AppException.handleError(e)));
  125. }
  126. }
  127. }
  128. Future<List<Task>> getListTask(int page) async {
  129. var filter = TaskFilterRequest()
  130. ..cropId = cropId
  131. ..sort = sort.value
  132. ..status = selectedStatus.value.map((e) => e.key ?? '').toList();
  133. return await repository.tasks(page: page, filter: filter);
  134. }
  135. Future<void> updateStatusTask(
  136. RequestTaskUpdate task, {
  137. required Function onSuccess,
  138. }) async {
  139. print(task.toJson());
  140. UtilWidget.showLoading();
  141. await repository.updateTask(
  142. (success) {
  143. UtilWidget.hideDialog();
  144. // Utils.showSnackBarSuccess();
  145. onSuccess();
  146. },
  147. (errorMessage) {
  148. UtilWidget.hideDialog();
  149. Utils.showSnackBarError();
  150. },
  151. item: task,
  152. );
  153. }
  154. }