GiteaClient/lib/cubit/repo_cubit.dart

47 lines
1.5 KiB
Dart

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';
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);
}
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();
return emit(state.copyWith(
status: RepoStatus.success,
repos: repos,
loadedPages: 1,
hasReachedMax: false,
error_message: null,
));
}
final repos = await giteaService.getUserRepositories(state.loadedPages+1);
emit(repos.isEmpty
? state.copyWith(hasReachedMax: true)
: state.copyWith(
status: RepoStatus.success,
repos: List.of(state.repos)..addAll(repos),
loadedPages: state.loadedPages+1,
hasReachedMax: false,
error_message: null,
));
} on Exception catch (e) {
emit(state.copyWith(status: RepoStatus.failure,error_message: e.toString()));
}
}
}