You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.2KB

  1. import 'dart:async';
  2. import 'package:authentication_repository/authentication_repository.dart';
  3. import 'package:bloc/bloc.dart';
  4. import 'package:equatable/equatable.dart';
  5. import 'package:farm_tpf/presentation/screens/login/models/password.dart';
  6. import 'package:farm_tpf/presentation/screens/login/models/username.dart';
  7. import 'package:formz/formz.dart';
  8. import 'package:meta/meta.dart';
  9. part 'login_event.dart';
  10. part 'login_state.dart';
  11. class LoginBloc extends Bloc<LoginEvent, LoginState> {
  12. LoginBloc({
  13. @required AuthenticationRepository authenticationRepository,
  14. }) : assert(authenticationRepository != null),
  15. _authenticationRepository = authenticationRepository,
  16. super(const LoginState());
  17. final AuthenticationRepository _authenticationRepository;
  18. @override
  19. Stream<LoginState> mapEventToState(
  20. LoginEvent event,
  21. ) async* {
  22. if (event is LoginUsernameChanged) {
  23. yield _mapUsernameChangedToState(event, state);
  24. } else if (event is LoginPasswordChanged) {
  25. yield _mapPasswordChangedToState(event, state);
  26. } else if (event is LoginSubmitted) {
  27. yield* _mapLoginSubmittedToState(event, state);
  28. }
  29. }
  30. LoginState _mapUsernameChangedToState(
  31. LoginUsernameChanged event,
  32. LoginState state,
  33. ) {
  34. final username = Username.dirty(event.username);
  35. return state.copyWith(
  36. username: username,
  37. status: Formz.validate([state.password, username]),
  38. );
  39. }
  40. LoginState _mapPasswordChangedToState(
  41. LoginPasswordChanged event,
  42. LoginState state,
  43. ) {
  44. final password = Password.dirty(event.password);
  45. return state.copyWith(
  46. password: password,
  47. status: Formz.validate([password, state.username]),
  48. );
  49. }
  50. Stream<LoginState> _mapLoginSubmittedToState(
  51. LoginSubmitted event,
  52. LoginState state,
  53. ) async* {
  54. if (state.status.isValidated) {
  55. yield state.copyWith(status: FormzStatus.submissionInProgress);
  56. try {
  57. await _authenticationRepository.logIn(
  58. username: state.username.value,
  59. password: state.password.value,
  60. );
  61. yield state.copyWith(status: FormzStatus.submissionSuccess);
  62. } on Exception catch (_) {
  63. yield state.copyWith(status: FormzStatus.submissionFailure);
  64. }
  65. }
  66. }
  67. }