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