Created
April 27, 2019 18:22
-
-
Save felangel/4cb5a94b40e1a7df436bd47602ff7ef5 to your computer and use it in GitHub Desktop.
[flutter_firebase_login] Register Bloc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:async'; | |
import 'package:bloc/bloc.dart'; | |
import 'package:meta/meta.dart'; | |
import 'package:rxdart/rxdart.dart'; | |
import 'package:flutter_firebase_login/user_repository.dart'; | |
import 'package:flutter_firebase_login/register/register.dart'; | |
import 'package:flutter_firebase_login/validators.dart'; | |
class RegisterBloc extends Bloc<RegisterEvent, RegisterState> { | |
final UserRepository _userRepository; | |
RegisterBloc({@required UserRepository userRepository}) | |
: assert(userRepository != null), | |
_userRepository = userRepository; | |
@override | |
RegisterState get initialState => RegisterState.empty(); | |
@override | |
Stream<RegisterState> transform( | |
Stream<RegisterEvent> events, | |
Stream<RegisterState> Function(RegisterEvent event) next, | |
) { | |
final observableStream = events as Observable<RegisterEvent>; | |
final nonDebounceStream = observableStream.where((event) { | |
return (event is! EmailChanged && event is! PasswordChanged); | |
}); | |
final debounceStream = observableStream.where((event) { | |
return (event is EmailChanged || event is PasswordChanged); | |
}).debounce(Duration(milliseconds: 300)); | |
return super.transform(nonDebounceStream.mergeWith([debounceStream]), next); | |
} | |
@override | |
Stream<RegisterState> mapEventToState( | |
RegisterEvent event, | |
) async* { | |
if (event is EmailChanged) { | |
yield* _mapEmailChangedToState(event.email); | |
} else if (event is PasswordChanged) { | |
yield* _mapPasswordChangedToState(event.password); | |
} else if (event is Submitted) { | |
yield* _mapFormSubmittedToState(event.email, event.password); | |
} | |
} | |
Stream<RegisterState> _mapEmailChangedToState(String email) async* { | |
yield currentState.update( | |
isEmailValid: Validators.isValidEmail(email), | |
); | |
} | |
Stream<RegisterState> _mapPasswordChangedToState(String password) async* { | |
yield currentState.update( | |
isPasswordValid: Validators.isValidPassword(password), | |
); | |
} | |
Stream<RegisterState> _mapFormSubmittedToState( | |
String email, | |
String password, | |
) async* { | |
yield RegisterState.loading(); | |
try { | |
await _userRepository.signUp( | |
email: email, | |
password: password, | |
); | |
yield RegisterState.success(); | |
} catch (_) { | |
yield RegisterState.failure(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment