Line data Source code
1 : import 'dart:async';
2 :
3 : import 'package:app_pym/core/validators.dart';
4 : import 'package:app_pym/domain/usecases/authentication/signin.dart';
5 : import 'package:app_pym/domain/usecases/authentication/signup.dart';
6 : import 'package:flutter/foundation.dart';
7 : import 'package:flutter/services.dart';
8 : import 'package:flutter_bloc/flutter_bloc.dart';
9 : import 'package:freezed_annotation/freezed_annotation.dart';
10 : import 'package:injectable/injectable.dart';
11 : import 'package:rxdart/rxdart.dart' show DebounceExtensions, MergeExtension;
12 :
13 : part 'login_bloc.freezed.dart';
14 : part 'login_event.dart';
15 : part 'login_state.dart';
16 :
17 : @prod
18 : @injectable
19 : class LoginBloc extends Bloc<LoginEvent, LoginState> {
20 : final AuthSignIn signIn;
21 : final AuthSignUp signUp;
22 :
23 0 : LoginBloc(this.signIn, this.signUp);
24 :
25 0 : @override
26 0 : LoginState get initialState => LoginState.empty();
27 :
28 : @override
29 0 : Stream<LoginState> mapEventToState(LoginEvent event) async* {
30 0 : yield* event.when(
31 0 : emailChanged: _mapEmailChangedToState,
32 0 : passwordChanged: _mapPasswordChangedToState,
33 0 : withCredentialsPressed: _mapWithCredentialsPressedToState,
34 0 : signUp: _mapFormSubmittedToState);
35 : }
36 :
37 0 : @override
38 : Stream<Transition<LoginEvent, LoginState>> transformEvents(
39 : Stream<LoginEvent> events,
40 : Stream<Transition<LoginEvent, LoginState>> Function(LoginEvent)
41 : transitionFn) {
42 0 : final nonDebounceStream = events.where((event) {
43 0 : return event is! EmailChanged && event is! PasswordChanged;
44 : });
45 0 : final debounceStream = events.where((event) {
46 0 : return event is EmailChanged || event is PasswordChanged;
47 0 : }).debounceTime(const Duration(milliseconds: 300));
48 0 : return super.transformEvents(
49 0 : nonDebounceStream.mergeWith([debounceStream]), transitionFn);
50 : }
51 :
52 0 : Stream<LoginState> _mapEmailChangedToState(String email) async* {
53 0 : yield state.updateEmail(
54 0 : isEmailValid: Validators.isValidEmail(email),
55 : );
56 : }
57 :
58 0 : Stream<LoginState> _mapWithCredentialsPressedToState(
59 : String email,
60 : String password,
61 : ) async* {
62 0 : yield LoginState.loading();
63 : try {
64 0 : await signIn(SignInCredentials(email, password));
65 0 : yield LoginState.success();
66 0 : } on PlatformException catch (e) {
67 0 : yield LoginState.failure(e.message);
68 : } catch (e) {
69 0 : yield LoginState.failure(e.toString());
70 : }
71 : }
72 :
73 0 : Stream<LoginState> _mapPasswordChangedToState(String password) async* {
74 0 : yield state.updatePassword(
75 0 : isPasswordValid: Validators.isValidPassword(password),
76 : );
77 : }
78 :
79 0 : Stream<LoginState> _mapFormSubmittedToState(
80 : String email,
81 : String password,
82 : ) async* {
83 0 : yield LoginState.loading();
84 : try {
85 0 : await signUp(SignUpCredentials(email, password));
86 0 : yield LoginState.success();
87 0 : } on PlatformException catch (e) {
88 0 : yield LoginState.failure(e.message);
89 : } catch (e) {
90 0 : yield LoginState.failure(e.toString());
91 : }
92 : }
93 : }
|