import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.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 { final UserRepository userRepository; late final StreamSubscription _userSubscription; AuthenticationBloc({required UserRepository myUserRepository}) : userRepository = myUserRepository, super(const AuthenticationState.unknown()) { _userSubscription = userRepository.streamUser().listen((authUser) { add(AuthenticationUserChanged(authUser)); }); on(_onAuthenticationUserChanged); on(_onAuthenticationLogoutRequested); } void _onAuthenticationUserChanged( AuthenticationUserChanged event, Emitter emit) { emit( event.user != null ? AuthenticationState.authenticated(event.user!) : const AuthenticationState.unauthenticated(), ); } void _onAuthenticationLogoutRequested(AuthenticationLogoutRequested event, Emitter emit) async { await userRepository.logOut(); emit(const AuthenticationState.unauthenticated()); } @override Future close() { _userSubscription.cancel(); return super.close(); } }