import 'dart:async'; import 'dart:math'; import 'package:data/app_api_data/app_api_repository_impl.dart'; import 'package:data/app_setting_data/repository/app_setting_box_repository_impl.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:local_db_core/lib/boxes/box_list/setting_box/app_setting_box.dart'; import 'package:network_core/initializer/base_initializer.dart'; import 'package:repositories/app_api_domain/models/post_model.dart'; import 'package:repositories/app_api_domain/repository/app_api_repository.dart'; import 'package:repositories/app_setting_box_domain/repository/app_setting_box_repository.dart'; import 'package:sonnat/core/utils/base_cubit_type.dart'; class PostsCubit extends Cubit> { List postList = []; List searchedList = []; bool hasReachedMax = false; String _query = ''; String lastCatId = ''; int _page = 1; final AppApiRepository _remoteRepository = AppApiRepositoryImpl(apiService: BaseInitializer.instance.getApiService()); final AppSettingBoxRepository _repository = AppSettingBoxRepositoryImpl(appSettingBox: AppSettingBox()); PostsCubit({required this.lastCatId}) : super(BaseCubitType(eventName: PostsState.empty)); void empty() => emit(BaseCubitType(eventName: PostsState.empty)); Future getData({required String catId}) async { if(lastCatId != catId) { lastCatId = catId; hasReachedMax = false; _page = 1; postList.clear(); } if (hasReachedMax) { return; } if (postList.isNotEmpty) { emit(BaseCubitType(eventName: PostsState.loadingPagination)); } else { emit(BaseCubitType(eventName: PostsState.loading)); } List data = await _remoteRepository.getPostList( catId: catId, sort: 'newest', page: _page, languageCode: _repository.getCurrentLanguage() ?? 'en', ); hasReachedMax = data.length < 15; _page += 1; postList.addAll(data); emit(BaseCubitType(eventName: PostsState.data)); } Future search({required String query}) async { if (query.isEmpty) { unawaited(getData(catId: lastCatId)); _query = ''; searchedList.clear(); emit(BaseCubitType(eventName: PostsState.data)); return; } if (_query != query) { hasReachedMax = false; searchedList.clear(); _query = query; } if (hasReachedMax) { return; } if (searchedList.isNotEmpty) { emit(BaseCubitType(eventName: PostsState.loadingPagination)); } else { emit(BaseCubitType(eventName: PostsState.loading)); } await Future.delayed(Duration(milliseconds: Random().nextInt(1000))); } String get query => _query; void clearSearch() { unawaited(getData(catId: lastCatId)); _query = ''; searchedList.clear(); emit(BaseCubitType(eventName: PostsState.data)); } Future changeFilter(int index, String catId) async { emit(BaseCubitType(eventName: PostsState.changeFilterIndex, data: index)); await Future.delayed(Duration(milliseconds: 500)); await getData(catId: catId); } } enum PostsState { empty, data, loading, loadingPagination, changeFilterIndex, }