55 lines
1.9 KiB
Dart
55 lines
1.9 KiB
Dart
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<IssuesEvent, IssueState> {
|
|
final GiteaService giteaService;
|
|
final String istate;
|
|
final String repoFullName;
|
|
IssuesBloc(this.giteaService,this.repoFullName,this.istate) : super(const IssueState()) {
|
|
on<IssuesFetched>(_onIssuesFetched,
|
|
transformer: (events, mapper) => events.switchMap(mapper),);
|
|
}
|
|
|
|
Future<void> _onIssuesFetched(IssuesFetched event, Emitter<IssueState> 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()));
|
|
}
|
|
}
|
|
}
|