import 'package:cargocalculaterapp/constants/constants.dart'; import 'package:cargocalculaterapp/features/home/data/models/orders_list_response.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../../core/usecase/usecase.dart'; import '../../data/models/banner_response.dart'; import '../../domain/usecase/banners_usecase.dart'; import '../../domain/usecase/orders_list_usecase.dart'; part 'home_event.dart'; part 'home_state.dart'; class HomeBloc extends Bloc { HomeBloc(this.ordersListUseCase, this.bannersUseCase) : super( const HomeState( paginationLoading: false, isLoading: false, page: 1, selectedStatus: AppConst.all, ), ) { on(_getAllOrders); on(_getOrders); on(_changeOrderStatus); on(_paginationLoading); on(_getBanner); on(_refresh); } final OrdersListUseCase ordersListUseCase; final BannersUseCase bannersUseCase; final Map productsRequest = {}; void _getAllOrders(GetAllOrdersListEvent event, Emitter emit) { productsRequest.remove(AppKeys.status); productsRequest[AppKeys.page] = 1; productsRequest[AppKeys.limit] = AppConst.limit; add(const GetOrdersEvent()); } Future _getOrders(GetOrdersEvent event, Emitter emit) async { emit(state.copyWith(isLoading: event.isLoading)); final response = await ordersListUseCase(productsRequest); response.fold( (l) { emit(state.copyWith(isLoading: false, paginationLoading: false)); }, (r) { emit( state.copyWith( isLoading: false, paginationLoading: false, ordersList: r, page: productsRequest[AppKeys.page], pageCount: ((r.totalCount ?? 1) / 20).ceil(), ), ); }, ); } void _changeOrderStatus(OrderStatusEvent event, Emitter emit) { if (event.status == state.selectedStatus) { return; } emit(state.copyWith(selectedStatus: event.status)); productsRequest[AppKeys.page] = 1; if (event.status == AppConst.all) { productsRequest.remove(AppConst.status); } else { productsRequest[AppConst.status] = event.status; } add(const GetOrdersEvent()); } Future _paginationLoading( PaginationEvent event, Emitter emit, ) async { productsRequest[AppKeys.page] = productsRequest[AppKeys.page] + 1; emit( state.copyWith( paginationLoading: true, page: productsRequest[AppKeys.page], ), ); final response = await ordersListUseCase(productsRequest); response.fold( (l) { emit(state.copyWith(isLoading: false, paginationLoading: false)); }, (r) { emit( state.copyWith( isLoading: false, paginationLoading: false, ordersList: OrdersListResponse( totalCount: r.totalCount, data: state.ordersList?.data?..addAll(r.data ?? []), ), page: productsRequest[AppKeys.page], pageCount: ((r.totalCount ?? 1) / 20).ceil(), ), ); }, ); } Future _getBanner( GetBannersEvent event, Emitter emit, ) async { final response = await bannersUseCase(const NoParams()); response.fold((l) {}, (r) { emit(state.copyWith(banners: r)); }); } void _refresh(RefreshEvent event, Emitter emit) { productsRequest[AppKeys.page] = 1; add(const GetOrdersEvent(isLoading: false)); add(const GetBannersEvent()); } }