import 'package:bloc/bloc.dart'; import 'package:flutter_boilerplate/feature/authentication/resource/user_repository.dart'; import 'package:meta/meta.dart'; import 'authentication_event.dart'; import 'authentication_state.dart'; class AuthenticationBloc extends Bloc { final UserRepository userRepository; AuthenticationBloc({@required this.userRepository}) : assert(userRepository != null); @override AuthenticationState get initialState => AuthenticationUninitialized(); @override Stream mapEventToState( AuthenticationEvent event, ) async* { if (event is AuthStarted) { final bool hasToken = await userRepository.hasToken(); if (hasToken) { yield AuthenticationAuthenticated(); } else { yield AuthenticationUnauthenticated(); } } if (event is LoggedIn) { yield AuthenticationLoading(); await userRepository.persistToken(event.token); yield AuthenticationAuthenticated(); } if (event is LoggedOut) { yield AuthenticationLoading(); await userRepository.deleteToken(); yield AuthenticationUnauthenticated(); } } }