47 lines
1.5 KiB
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()));
|
|
}
|
|
}
|
|
}
|