import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:gitea_client/model/pull.dart'; import 'package:stream_transform/stream_transform.dart'; import '../service/gitea_service.dart'; part 'pulls_event.dart'; part 'pulls_state.dart'; class PullRequestBloc extends Bloc { final GiteaService giteaService; final String istate; final String repoFullName; PullRequestBloc(this.giteaService,this.repoFullName,this.istate) : super(const PullRequestState()) { on(_onIssuesFetched, transformer: (events, mapper) => events.switchMap(mapper),); } Future _onIssuesFetched(PullRequestsFetched event, Emitter emit) async { if (state.hasReachedMax) return; try { if (state.status == PullRequestStatus.initial) { final pulls = await giteaService.getRepoPulls(owner: repoFullName.split('/')[0],repo: repoFullName.split('/')[1],state: istate,page: 1, limit: 10); return emit(state.copyWith( status: PullRequestStatus.success, pulls: pulls, loadedPages: 1, hasReachedMax: false, error_message: null, )); } final pulls = await giteaService.getRepoPulls(owner: repoFullName.split('/')[0],repo: repoFullName.split('/')[1],state: istate,page: state.loadedPages+1, limit: 10); final prList = List.of(state.pulls); pulls.forEach((element) { if(prList.where((selement) => selement.id == element.id).isEmpty) { prList.add(element); } }); emit(pulls.isEmpty ? state.copyWith(hasReachedMax: true) : state.copyWith( status: PullRequestStatus.success, pulls: prList, loadedPages: state.loadedPages+1, hasReachedMax: false, error_message: null, )); } on Exception catch (e) { emit(state.copyWith(status: PullRequestStatus.failure,error_message: e.toString())); } } }