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.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. @override
  37. Stream<TaskState> mapEventToState(
  38. TaskEvent event,
  39. ) async* {
  40. if (event is DataFetched && !(state is TaskSuccess && ((state as TaskSuccess).hasReachedMax ?? false))) {
  41. try {
  42. if (state is TaskInitial) {
  43. yield (TaskLoading());
  44. final response = await getListTask(0);
  45. yield TaskSuccess(
  46. items: response,
  47. page: 0,
  48. hasReachedMax: response.length < pageSize ? true : false,
  49. );
  50. }
  51. if (state is TaskSuccess) {
  52. final currentState = state as TaskSuccess;
  53. if (currentState.hasReachedMax ?? false) {
  54. return;
  55. }
  56. int page = (currentState.page ?? 0) + 1;
  57. final response = await getListTask(page);
  58. yield response.isEmpty
  59. ? currentState.copyWith(hasReachedMax: true)
  60. : TaskSuccess(
  61. items: (currentState.items ?? []) + response,
  62. page: (currentState.page ?? 0) + 1,
  63. hasReachedMax: false,
  64. );
  65. }
  66. } catch (e) {
  67. var errorString = AppException.handleError(e);
  68. yield (TaskFailure(errorString: errorString));
  69. }
  70. }
  71. if (event is OnRefresh) {
  72. try {
  73. yield (TaskLoading());
  74. final response = await getListTask(0);
  75. var items = <Task>[];
  76. response.forEach((element) {
  77. items.add(Task.clone(element));
  78. });
  79. yield TaskSuccess(
  80. items: items,
  81. page: 0,
  82. hasReachedMax: items.length < pageSize ? true : false,
  83. );
  84. } catch (e) {
  85. yield (TaskFailure(errorString: AppException.handleError(e)));
  86. }
  87. } else if (event is OnSearch) {
  88. try {
  89. yield (TaskLoading());
  90. final response = await getListTask(0);
  91. yield TaskSuccess(items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false);
  92. } catch (e) {
  93. yield (TaskFailure(errorString: AppException.handleError(e)));
  94. }
  95. }
  96. }
  97. Future<List<Task>> getListTask(int page) async {
  98. var filter = TaskFilterRequest()
  99. ..sort = sort.value
  100. ..status = selectedStatus.value.map((e) => e.key ?? '').toList();
  101. return await repository.tasks(page: 0, filter: filter);
  102. }
  103. Future<void> updateStatusTask(
  104. RequestTaskUpdate task, {
  105. required Function onSuccess,
  106. }) async {
  107. print(task.toJson());
  108. UtilWidget.showLoading();
  109. await repository.updateTask(
  110. (success) {
  111. UtilWidget.hideDialog();
  112. Utils.showSnackBarSuccess();
  113. onSuccess();
  114. },
  115. (errorMessage) {
  116. UtilWidget.hideDialog();
  117. Utils.showSnackBarError();
  118. },
  119. item: task,
  120. );
  121. }
  122. }