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.

82 lines
2.5KB

  1. import 'dart:async';
  2. import 'package:bloc/bloc.dart';
  3. import 'package:equatable/equatable.dart';
  4. import 'package:farm_tpf/data/repository/authentication_repository.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:farm_tpf/utils/pref.dart';
  8. import 'package:formz/formz.dart';
  9. import 'package:meta/meta.dart';
  10. part 'login_event.dart';
  11. part 'login_state.dart';
  12. class LoginBloc extends Bloc<LoginEvent, LoginState> {
  13. LoginBloc({
  14. @required AuthenticationRepository authenticationRepository,
  15. }) : assert(authenticationRepository != null),
  16. _authenticationRepository = authenticationRepository,
  17. super(const LoginState());
  18. final AuthenticationRepository _authenticationRepository;
  19. var pref = LocalPref();
  20. @override
  21. Stream<LoginState> mapEventToState(
  22. LoginEvent event,
  23. ) async* {
  24. if (event is LoginUsernameChanged) {
  25. yield _mapUsernameChangedToState(event, state);
  26. } else if (event is LoginPasswordChanged) {
  27. yield _mapPasswordChangedToState(event, state);
  28. } else if (event is LoginSubmitted) {
  29. yield* _mapLoginSubmittedToState(event, state);
  30. }
  31. }
  32. LoginState _mapUsernameChangedToState(
  33. LoginUsernameChanged event,
  34. LoginState state,
  35. ) {
  36. final username = Username.dirty(event.username);
  37. return state.copyWith(
  38. username: username,
  39. status: Formz.validate([state.password, username]),
  40. );
  41. }
  42. LoginState _mapPasswordChangedToState(
  43. LoginPasswordChanged event,
  44. LoginState state,
  45. ) {
  46. final password = Password.dirty(event.password);
  47. return state.copyWith(
  48. password: password,
  49. status: Formz.validate([password, state.username]),
  50. );
  51. }
  52. Stream<LoginState> _mapLoginSubmittedToState(
  53. LoginSubmitted event,
  54. LoginState state,
  55. ) async* {
  56. if (state.status.isValidated) {
  57. yield state.copyWith(status: FormzStatus.submissionInProgress);
  58. try {
  59. var user = await _authenticationRepository.signInWithCredentials(
  60. state.username.value,
  61. state.password.value,
  62. );
  63. var token = user.idToken;
  64. pref.saveString(PrefKey.token_key, token);
  65. int currentTime = DateTime.now().millisecondsSinceEpoch;
  66. pref.saveString(PrefKey.expired_time, currentTime.toString());
  67. yield state.copyWith(status: FormzStatus.submissionSuccess);
  68. } on Exception catch (_) {
  69. yield state.copyWith(status: FormzStatus.submissionFailure);
  70. }
  71. }
  72. }
  73. }