This commit is contained in:
Felipe
2024-02-16 08:52:37 -05:00
parent 1c20d0c0cd
commit 9ca2b62be3
39 changed files with 2299 additions and 327 deletions
@@ -0,0 +1,37 @@
import 'dart:async';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:meta/meta.dart';
import 'package:user_repository/user_repository.dart';
part 'authentication_event.dart';
part 'authentication_state.dart';
class AuthenticationBloc
extends Bloc<AuthenticationEvent, AuthenticationState> {
final UserRepository userRepository;
late final StreamSubscription<User?> _userSubscription;
AuthenticationBloc({required UserRepository myUserRepository})
: userRepository = myUserRepository,
super(const AuthenticationState.unknown()) {
_userSubscription = userRepository.user.listen((authUser) {
add(AuthenticationUserChanged(authUser));
});
on<AuthenticationUserChanged>((event, emit) {
if (event.user != null) {
emit(AuthenticationState.authenticated(event.user!));
} else {
emit(const AuthenticationState.unauthenticated());
}
});
}
@override
Future<void> close() {
_userSubscription.cancel();
return super.close();
}
}
@@ -0,0 +1,17 @@
part of 'authentication_bloc.dart';
@immutable
abstract class AuthenticationEvent extends Equatable {
const AuthenticationEvent();
@override
List<Object> get props => [];
}
class AuthenticationUserChanged extends AuthenticationEvent {
const AuthenticationUserChanged(this.user);
final User? user;
}
class AuthenticationLogoutRequested extends AuthenticationEvent {}
@@ -0,0 +1,24 @@
part of 'authentication_bloc.dart';
enum AuthenticationStatus { authenticated, unauthenticated, unknown }
class AuthenticationState extends Equatable {
final AuthenticationStatus status;
final User? user;
const AuthenticationState._({
this.status = AuthenticationStatus.unknown,
this.user,
});
const AuthenticationState.unknown() : this._();
const AuthenticationState.authenticated(User user)
: this._(status: AuthenticationStatus.authenticated, user: user);
const AuthenticationState.unauthenticated()
: this._(status: AuthenticationStatus.unauthenticated);
@override
List<Object?> get props => [status, user];
}