import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:farm_tpf/utils/helpers.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 '../models/stamp.dart'; import '../models/stamp_filter_request.dart'; part 'stamp_event.dart'; part 'stamp_state.dart'; class StampBloc extends Bloc { final Repository repository; int pageSize = 20; StampBloc(this.repository) : super(StampInitial()); final searchCtl = TextEditingController(); var status = ValueNotifier( StampStatus.values .map( (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getStampStatus(describeEnum(e))), ) .toList(), ); var selectedStatus = ValueNotifier( StampStatus.values .map( (e) => ItemDropDown(key: describeEnum(e), value: Helpers.getStampStatus(describeEnum(e))), ) .toList(), ); var sort = ValueNotifier(describeEnum(SortType.asc)); @override Stream mapEventToState( StampEvent event, ) async* { if (event is DataFetched && !(state is StampSuccess && ((state as StampSuccess).hasReachedMax ?? false))) { try { if (state is StampInitial) { yield (StampLoading()); final response = await getListStamp(0); yield StampSuccess( items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false, ); } if (state is StampSuccess) { final currentState = state as StampSuccess; if (currentState.hasReachedMax ?? false) { return; } int page = (currentState.page ?? 0) + 1; final response = await getListStamp(page); yield response.isEmpty ? currentState.copyWith(hasReachedMax: true) : StampSuccess( items: (currentState.items ?? []) + response, page: (currentState.page ?? 0) + 1, hasReachedMax: false, ); } } catch (e) { var errorString = AppException.handleError(e); yield (StampFailure(errorString: errorString)); } } if (event is OnRefresh) { try { yield (StampLoading()); final response = await getListStamp(0); yield StampSuccess( items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false, ); } catch (e) { yield (StampFailure(errorString: AppException.handleError(e))); } } else if (event is OnSearch) { try { yield (StampLoading()); final response = await getListStamp(0); yield StampSuccess(items: response, page: 0, hasReachedMax: response.length < pageSize ? true : false); } catch (e) { yield (StampFailure(errorString: AppException.handleError(e))); } } } Future> getListStamp(int page) async { var filter = StampFilterRequest() ..sort = sort.value ..description = searchCtl.text ..status = selectedStatus.value.map((e) => e.key ?? '').toList(); return await repository.stamps(page: 0, filter: filter); } }