import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:farm_tpf/data/repository/authentication_repository.dart'; import 'package:meta/meta.dart'; part 'authentication_event.dart'; part 'authentication_state.dart'; class AuthenticationBloc extends Bloc { AuthenticationBloc( {@required AuthenticationRepository authenticationRepository}) : assert(authenticationRepository != null), _authenticationRepository = authenticationRepository, super(const AuthenticationState.unknown()) { _authenticationStatusSubscription = _authenticationRepository.status.listen( (status) => add(AuthenticationStatusChanged(status)), ); } final AuthenticationRepository _authenticationRepository; StreamSubscription _authenticationStatusSubscription; @override Stream mapEventToState( AuthenticationEvent event, ) async* { if (event is AuthenticationStatusChanged) { yield await _mapAuthenticationStatusChangedToState(event); } else if (event is AuthenticationLogoutRequested) { _authenticationRepository.logOut(); } } @override Future close() { _authenticationStatusSubscription?.cancel(); _authenticationRepository.dispose(); return super.close(); } Future _mapAuthenticationStatusChangedToState( AuthenticationStatusChanged event, ) async { switch (event.status) { case AuthenticationStatus.unauthenticated: return const AuthenticationState.unauthenticated(); case AuthenticationStatus.authenticated: return AuthenticationState.authenticated(); default: return const AuthenticationState.unknown(); } } }