GiteaClient/lib/cubit/repo_cubit.dart
2022-05-09 22:48:51 +02:00

56 lines
1.8 KiB
Dart

import 'package:bloc/bloc.dart';
import 'package:bloc_concurrency/bloc_concurrency.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 RepoCubit extends Cubit<RepoState> {
RepoCubit() : super(RepoState());
}
class RepoBloc extends Bloc<RepoEvent, RepoState> {
RepoBloc({required this.giteaService}) : super(const RepoState()) {
on<RepoFetched>(_onRepoFetched,
transformer: (events, mapper) => events.switchMap(mapper),);
}
final GiteaService giteaService;
Future<void> _onRepoFetched(RepoFetched event, Emitter<RepoState> 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()));
}
}
}