import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:gitea_client/cubit/repo_event.dart'; import 'package:gitea_client/model/repository.dart'; import 'package:gitea_client/service/gitea_service.dart'; import 'package:stream_transform/stream_transform.dart'; part 'repo_state.dart'; class RepoBloc extends Bloc { RepoBloc({required this.giteaService}) : super(const RepoState()) { on(_onRepoFetched, transformer: (events, mapper) => events.switchMap(mapper),); } final GiteaService giteaService; Future _onRepoFetched(RepoFetched event, Emitter emit) async { if (state.hasReachedMax) return; try { if (state.status == RepoStatus.initial) { final repos = await giteaService.getUserRepositories(1,100); return emit(state.copyWith( status: RepoStatus.success, repos: repos, loadedPages: 1, hasReachedMax: false, error_message: null, )); } final repos = await giteaService.getUserRepositories(state.loadedPages+1,100); final repoList = List.of(state.repos); repos.forEach((element) { if(repoList.where((selement) => selement.id == element.id).isEmpty) { repoList.add(element); } }); emit(repos.isEmpty ? state.copyWith(hasReachedMax: true) : state.copyWith( status: RepoStatus.success, repos: repoList, loadedPages: state.loadedPages+1, hasReachedMax: false, error_message: null, )); } on Exception catch (e) { emit(state.copyWith(status: RepoStatus.failure,error_message: e.toString())); } } }