import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:farm_tpf/presentation/screens/task/models/task_update_request.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import '../../../../data/api/app_exception.dart'; import '../../../../data/repository/repository.dart'; import '../../../../models/item_dropdown.dart'; import '../../../../utils/const_common.dart'; import '../../../../utils/helpers.dart'; import '../../../../utils/utils.dart'; import '../../../custom_widgets/widget_utils.dart'; import '../models/task.dart'; import '../models/task_filter_request.dart'; part 'task_event.dart'; part 'task_state.dart'; class TaskBloc extends Bloc { final Repository repository; int pageSize = 20; TaskBloc(this.repository) : super(TaskInitial()); bool isFetching = false; // Add this flag var status = ValueNotifier( TaskStatus.values .map( (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getTaskStatus(describeEnum(e))), ) .toList(), ); var selectedStatus = ValueNotifier( TaskStatus.values .map( (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getTaskStatus(describeEnum(e))), ) .toList(), ); var sort = ValueNotifier(describeEnum(SortType.asc)); var cropId = -1; @override Stream mapEventToState( TaskEvent event, ) async* { if (event is DataFetched) { if (state is TaskInitial || (state is TaskSuccess && (!((state as TaskSuccess).hasReachedMax ?? false)))) { try { final currentState = state; int nextPage = 0; if (currentState is TaskSuccess) { nextPage = ((currentState.items?.length ?? 0) / 20).floor(); } isFetching = true; final response = await getListTask(nextPage); final hasReachedMax = response.length < pageSize; isFetching = false; yield response.isEmpty ? (currentState is TaskSuccess ? currentState.copyWith(hasReachedMax: true) : TaskSuccess(items: [], hasReachedMax: true)) : (currentState is TaskSuccess ? TaskSuccess(items: (currentState.items ?? []) + response, hasReachedMax: hasReachedMax) : TaskSuccess(items: response, hasReachedMax: hasReachedMax)); } catch (e) { isFetching = false; var errorString = AppException.handleError(e); yield (TaskFailure(errorString: errorString)); } } } // if (event is DataFetched && !(state is TaskSuccess && ((state as TaskSuccess).hasReachedMax ?? false))) { // try { // if (state is TaskInitial) { // yield (TaskLoading()); // final response = await getListTask(0); // yield TaskSuccess( // items: response, // page: 0, // hasReachedMax: response.length < pageSize ? true : false, // ); // } // if (state is TaskSuccess) { // final currentState = state as TaskSuccess; // // if (currentState.hasReachedMax ?? false) { // // return; // // } // int page = (currentState.page ?? 0) + 1; // final response = await getListTask(page); // yield response.isEmpty // ? currentState.copyWith(hasReachedMax: true) // : TaskSuccess( // items: (currentState.items ?? []) + response, // page: (currentState.page ?? 0) + 1, // hasReachedMax: false, // ); // } // } catch (e) { // var errorString = AppException.handleError(e); // yield (TaskFailure(errorString: errorString)); // } // } if (event is OnRefresh) { try { isFetching = true; yield (TaskLoading()); final response = await getListTask(0); isFetching = false; var items = []; response.forEach((element) { items.add(Task.clone(element)); }); yield TaskSuccess( items: items, page: 0, hasReachedMax: items.length < pageSize ? true : false, ); } catch (e) { isFetching = false; yield (TaskFailure(errorString: AppException.handleError(e))); } } else if (event is OnSearch) { try { isFetching = true; yield (TaskLoading()); final response = await getListTask(0); isFetching = false; yield TaskSuccess(items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false); } catch (e) { yield (TaskFailure(errorString: AppException.handleError(e))); } } } Future> getListTask(int page) async { var filter = TaskFilterRequest() ..cropId = cropId ..sort = sort.value ..status = selectedStatus.value.map((e) => e.key ?? '').toList(); return await repository.tasks(page: page, filter: filter); } Future updateStatusTask( RequestTaskUpdate task, { required Function onSuccess, }) async { print(task.toJson()); UtilWidget.showLoading(); await repository.updateTask( (success) { UtilWidget.hideDialog(); // Utils.showSnackBarSuccess(); onSuccess(); }, (errorMessage) { UtilWidget.hideDialog(); Utils.showSnackBarError(); }, item: task, ); } }